코딩 테스트

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

sunlight-dby 2025. 5. 6. 23:42

[BAEKJOON 5073번 : 삼각형과 세 변]

[문제]

 

[고찰]

해당 문제에 대해 저는 아래의 코드로 답변을 냈습니다.

답변은 정답이긴 했지만, 제출하고 나니 if문을 중첩하여 사용할 필요가 없었다는 것을 깨달았습니다.

어차피 각 조건은 모두 하나의 경우에 파생하여서 개별적일텐데, 이를 신경쓰지 못했던 것 같습니다.

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int arr[3];
    
    while (1)
    {
        cin >> arr[0] >> arr[1] >> arr[2];
        
        if (arr[0] == 0 && arr[1] == 0 && arr[2] == 0)
            return 0;
            
        sort(arr, arr + 3);
        
        if (arr[2] < arr[0] + arr[1])
        {
            if (arr[0] == arr[1] && arr[1] == arr[2])
            {
                cout << "Equilateral\n";
            }
            else
            {
                if (arr[0] == arr[1] || arr[1] == arr[2] || arr[0] == arr[2])
                {
                    cout << "Isosceles\n";
                }
                else if (arr[0] != arr[1] && arr[1] != arr[2] && arr[0] != arr[2])
                {
                    cout << "Scalene\n";
                }
            }
        }
        else
        {
            cout << "Invalid\n";
        }
    }
}

 

 

[정리]

문제 조건을 잘 파악하고, 좀 더 간결하게 코드를 짜려고 노력해야겠습니다.

 

[Solution]

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int arr[3];
    
    while (1)
    {
        cin >> arr[0] >> arr[1] >> arr[2];
        
        if (arr[0] == 0 && arr[1] == 0 && arr[2] == 0)
            return 0;
            
        sort(arr, arr + 3);
        
        if (arr[2] < arr[0] + arr[1])
        {
            if (arr[0] == arr[1] && arr[1] == arr[2])
            {
                cout << "Equilateral\n";
            }
            else if (arr[0] == arr[1] || arr[1] == arr[2] || arr[0] == arr[2])
            {
                cout << "Isosceles\n";
            }
            else
            {
                cout << "Scalene\n";
            }
        }
        else
        {
            cout << "Invalid\n";
        }
    }
}

 


 

[BAEKJOON 5597번 : 과제 안 내신 분..?]

[문제]

 

[고찰]

아래의 코드는 해당 문제에 대한 저의 답변입니다.

문제를 정직하게 받아들여서 입력 받은 출석 번호를 벡터로 받고, 벡터를 정렬하였습니다.

정렬한 벡터를 1부터 30까지 for 문으로 반복하여 숫자를 비교하여 미제출자를 찾습니다.

미제출자를 한 명 찾으면, 그 미제출자의 번호를 push_back을 하여 벡터의 추가하고 다시 정렬하여 반복을 이어가게 하였습니다.

그리고 다시 미제출자 한 명을 더 찾으면 break를 통해 반복을 중지시키고 미제출자 두 명을 출력하게 하였습니다.

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    
    vector<int> vec;
    int n1 = 0, n2 = 0;
    
    for (int i = 0; i < 28; ++i)
    {
        int x;
        cin >> x;
        vec.push_back(x);
    }
    
    sort(vec.begin(), vec.end());
    
    for (int i = 1; i <= 30; ++i)
    {
        if (vec[i - 1] != i)
        {
            if (n1 == 0)
            {
                n1 = i;
                vec.push_back(i);
                sort(vec.begin(), vec.end());
            }
            else
            {
                n2 = i;
                break;
            }
        }
    }
    
    cout << n1 << "\n" << n2;
    
    return 0;
}

 

코드를 짤 때 정렬을 두 번이나 사용할 때, 코드가 너무 간결하지 못하다는 생각을 하였지만 이 외의 방법은 떠오르지 않아 어쩔 수 없이 이대로 풀게 되었습니다.

 

그 후, 다른 분들의 답안을 확인하였고, 제가 너무 문제에 목 매여 있었다는 것을 알게 되었습니다.

 

[개념]

출석 번호는 1번부터 30번까지 이루어져 있습니다. 그리고, 이 1부터 30은 배열의 인덱스로 쓰일 수 있습니다.

사실 이 아이디어를 알았다면, 답안이 위의 코드와 같이 길어질 필요가 없었을 것입니다.

 

애초에 출석 번호를 입력 받을 때, 입력 받은 값을 배열의 인덱스로 접근합니다. 그리고 접근한 배열의 인덱스에 공통된 값을 넣어줍니다. 1은 true를 나타내기에 다른 분들도 보통 1을 넣어주었습니다.

입력이 끝나면 입력 받지 못한 출석 번호(이하 미제출자)는 1의 값을 가지지 못합니다. 하지만, 미제출자는 쓰레기 값을 가지고 있는 상황입니다. 이를 방지하기 위해, 배열을 선언할 때 0으로 초기화를 해주면 됩니다.

 

이후에는 for 문을 1부터 30까지 반복하여 배열의 인덱스에 접근하고, 접근했을 때의 값이 0이라면 미제출자의 출석 번호가 해당 인덱스가 됩니다.

 

위의 정리한 개념은 int 형 배열을 바탕으로 정리한 아이디어입니다.

동일하게 해당 아이디어를 bool 형 배열로도 구현할 수 있습니다.

 

[정리]

좀 더 유연한 사고를 할 수 있어야 할 것 같습니다. 문제를 너무 직관적으로만 보려 하고, 창의적으로 접근하는 것이 아직 부족한 것 같습니다.

이러한 창의성과 유연성을 기르는 것에 집중하면서 앞으로 문제를 더 풀어야겠습니다.

 

[Solution]

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    
    // bool형 배열을 사용해서 문제를 푸려면, bool arr[30]으로 선언 및 초기화하면 됩니다.
    // bool형 배열을 사용하더라도 나머지 구현부는 동일합니다.
    
    int arr[30] = { 0, };  // 배열 arr의 모든 요소를 0으로 초기화
    int num;
    
    for (int i = 0; i < 28; i++)
    {
        cin >> num;
        arr[num - 1] = 1;
    }
    
    for (int i = 1; i <= 30; i++)
    {
        if (!arr[i - 1])  // if(arr[i - 1] == 0)과 동일
        {
            cout << i << "\n";
        }
    }
    
    return 0;
}