코딩 테스트

[코딩테스트 16일차] BAEKJOON 3052번 : 나머지

sunlight-dby 2025. 5. 10. 01:13

[BAEKJOON 3052번 : 나머지]

[문제]

 

[고찰]

해당 문제는 10개의 수를 42로 나눈 나머지의 값들 중, 서로 다른 값이 몇 개인지를 파악하면 되는 문제입니다.

저는 문제대로 접근을 했고, 해당 답변으로 문제 풀이에 성공하였습니다.

 

하지만, 해당 문제를 풀고 다시 복귀할 때의 두 번째 for 문 안에서 서로 다른 값을 구하는 로직이 너무 복잡하고 위험하다는 것을 깨달았습니다.

조건을 3개나 걸고 있기도 하고, else if 문 중 remain[i + 1]로 인해 remain[10]에 접근할 수도 있기 때문입니다.

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int remain[10];
    int answer = 0;
    
    for (int i = 0; i < 10; ++i)
    {
        cin >> remain[i];
        remain[i] = remain[i] % 42;
    }
    
    sort(remain, remain + 10);
    
    for (int i = 0; i < 10; ++i)
    {
        if (i == 9 && remain[9] != remain[0])
        {
            ++answer;
        }
        else if (remain[i] != remain[i + 1])
        {
            ++answer;
        }
        if (remain[0] == remain[9])
        {
            answer = 1;
        }
    }
    
    cout << answer;
    
    return 0;
}

 

그렇기 때문에 조건을 다시 고민해 보았고, 다른 방법을 찾을 수 있었습니다.

 

[개념]

for (int i = 0; i < 10; ++i)
{
    if (i == 0 || remain[i] != remain[i - 1])
        ++answer;
}

 

 

이렇게 for 문을 구성하면, 안전하면서도 간결하게 서로 다른 값을 구할 수 있습니다.

i는 0일 때 ++answer을 해주는 이유는, 첫 번째로 오는 remain[0]은 첫 번째 요소로 항상 새로운 값으로 계산되어야 하기 때문입니다. 또한, i - 1 인덱스에 안전하게 접근할 수 없는 i = 0 케이스를 별도로 처리하기 위함입니다.

 

기존처럼 remain[ i ]와 remain[ i + 1]을 비교하는 것이 아닌, remain[ i ]와 remain[ i - 1]을 비교해줌으로써 간결하면서도 안전하게 문제를 풀 수 있습니다.


 

해당 문제는 bool형 배열을 이용해서도 풀 수있습니다.

 

[코딩테스트 15일차] BAEKJOON 5073번, 5597번

[BAEKJOON 5073번 : 삼각형과 세 변][문제] [고찰] 해당 문제에 대해 저는 아래의 코드로 답변을 냈습니다.답변은 정답이긴 했지만, 제출하고 나니 if문을 중첩하여 사용할 필요가 없었다는 것을 깨달

sunlight-dby.tistory.com

 

해당 페이지에서 BAEKJOON 5597번에서도 유사한 아이디어를 사용하고 있습니다.

 

기본 값이 false로 채워진 bool형 배열을 선언 및 초기화 한 뒤, 입력받은 숫자의 나머지를 인덱스로 접근하여 해당 값을 true로 변경해줍니다. 이렇게되면, 나중에 값이 true인 값의 개수만 구하면 됩니다.

 

[정리]

문제의 조건을 그저 푸는 데에만 집중하는 것이 아니라, 좀 더 안전하게 푸는 것에도 집중해야 겠습니다.

또한, 기존에 사용했던 것을 잘 활용할 수 있게 복습을 철저히 해야하겠습니다.

 

[Solution]

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int remain[10];
    int answer = 0;
    
    for (int i = 0; i < 10; ++i)
    {
        cin >> remain[i];
        remain[i] = remain[i] % 42;
    }
    
    sort(remain, remain + 10);
    
    for (int i = 0; i < 10; ++i)
    {
        if (i == 0 || remain[i] != remain[i - 1])
            ++answer;
    }
    
    cout << answer;
    
    return 0;
}

 

[Solution : bool형 배열 사용]

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    
    bool remain[42] = { false, };
    int answer = 0;
    
    for (int i = 0; i < 10; ++i)
    {
        int num;
        cin >> num;
        remain[num % 42] = true;
    }
    
    for (int i = 0; i < 42; ++i)
    {
        if (remain[i])
        {
            ++answer;
        }
    }
    
    cout << answer;
    
    return 0;
}