C++ 코딩테스트 강좌, 주몽의 명령

문제 설명

주몽의 명령은 알고리즘 문제 중 하나로, 주몽이 군사 작전 중 겪는 상황을 기반으로 한 문제입니다.
주몽은 자신의 부대에 속한 병사들에게 특정 명령을 내리려고 합니다. 하지만 병사들은 주몽의 명령을 정확히 이해하지 못할 수도 있습니다.
이러한 상황을 고려하여, 아래와 같은 문제를 해결해야 합니다.

문제 정의

        주몽은 N명의 병사에게 명령을 내리려고 합니다. 각 병사는 정확히 한 번 명령을 받을 수 있으며, 이 명령은 
        다음과 같은 형식으로 이루어집니다. 각 병사는 1부터 N까지 번호가 매겨져 있습니다.

        명령: `i j k`
        
        - 의미: 저 앞에 있는 i번 병사부터 j번 병사까지는 명령을 따라야 하고,
        - k번 병사는 이를 무시할 수 있습니다.

        만약 명령을 따르는 병사의 수가 k번 병사보다 많으면 "YES"를 출력하고, 
        그렇지 않으면 "NO"를 출력하세요.

         N, M
         i, j, k
    

풀이 과정

이 문제를 해결하기 위해서는 다음과 같은 단계로 접근할 수 있습니다.

1단계: 문제 이해 및 분석

문제를 해결하기 위해 병사들의 번호와 해당 명령을 시행할 범위가 주어집니다.
주어진 i와 j는 명령을 따르는 병사들의 범위를 나타내며, k는 이 범위에 포함되어 있지만 명령을 따르지 않을
특정 병사를 나타냅니다. 따라서 병사 i부터 j까지의 병사 수와 k번 병사 여부를 체크하여 “YES” 또는 “NO”를 출력하면 됩니다.

2단계: 알고리즘 설계

다음의 알고리즘을 사용하여 문제를 해결할 수 있습니다.

  1. N과 M을 입력받습니다.
  2. 명령을 M번 입력받습니다.
  3. 각 명령에 대해 다음과 같은 작업을 수행합니다.
    • 명령의 범위 [i, j]에서 병사의 수를 계산합니다.
    • k번 병사가 범위에 포함되는지 확인합니다.
    • 명령을 따르는 병사의 수가 k번 병사보다 많으면 “YES”를 출력, 아니면 “NO”를 출력합니다.

3단계: C++ 코드 구현

이제 위에서 설계한 알고리즘을 C++ 코드로 구현하겠습니다.

        #include 
        using namespace std;

        int main() {
            int N, M;
            cin >> N >> M; // 병사 수, 명령 수 입력 받기

            for (int q = 0; q < M; q++) { // 각 명령에 대해 반복
                int i, j, k;
                cin >> i >> j >> k; // 명령 입력 받기
                int command_count = j - i + 1; // i부터 j까지의 병사 수 계산

                if (command_count > 1) { // 병사가 1명보다 많아야 합니다.
                    if (k >= i && k <= j) {
                        cout << "NO" << endl; // k번 병사는 명령을 따르지 않음
                    } else {
                        cout << "YES" << endl; // k번 병사가 아닌 다른 병사들이 명령을 따른다.
                    }
                } else {
                    cout << "NO" << endl; // 명령을 따르는 병사가 1명 이하일 경우
                }
            }

            return 0;
        }
    

4단계: 코드 설명

코드의 각 부분에 대해 간단하게 설명하겠습니다.

  • #include <iostream>: C++의 입출력 스트림 라이브러리입니다.
  • using namespace std;: std 네임스페이스를 사용하여 코드 가독성을 높입니다.
  • int N, M;: 각각 병사 수와 명령 수를 저장하는 정수형 변수입니다.
  • cin >> N >> M;: 병사 수와 명령 수를 입력받습니다.
  • for (int q = 0; q < M; q++): M번 반복하여 각 명령에 대해 처리합니다.

    • cin >> i >> j >> k;: 각 명령의 i, j, k 값을 입력받습니다.
    • int command_count = j - i + 1;: 명령을 따르는 병사의 수를 계산합니다.
    • if (command_count > 1): 따르는 병사의 수가 1명보다 많아야 명령이 성립합니다.

      • if (k >= i && k <= j): k번 병사가 범위에 포함되면 “NO”를 출력합니다.
      • cout << "YES" << endl;: k번 병사가 범위 밖에 있을 경우 “YES”를 출력합니다.
    • 각 명령의 출력은 endl을 통해 다음 줄로 이동합니다.

5단계: 테스트 케이스

프로그램의 정확성을 검증하기 위해 몇 가지 테스트 케이스를 고려해야 합니다. 다음은 입력과 출력의 예시입니다.

        입력:
        5 3
        1 3 2
        1 5 5
        2 4 3

        출력:
        NO
        YES
        YES
    

결론

이번 C++ 코딩테스트 강좌에서는 주몽의 명령 문제를 통해 알고리즘 문제 해결 과정과 C++
프로그래밍 기술을 배웠습니다. 문제의 핵심은 주어진 명령을 정확히 이해하고, 이를 효율적으로
처리하는 알고리즘을 구현하는 것이었습니다.
주어진 문제를 해결하는 과정에서 다양한 경우의 수를 고려하는 것이 중요한 점임을 다시 한 번 강조합니다.
이러한 문제를 푸는 과정은 종종 우리가 실제 문제를 해결하는 데 많은 도움을 줄 수 있습니다.

다음 강좌에서는 더 복잡한 알고리즘 문제를 다루어 보도록 하겠습니다. 감사합니다!