티스토리 뷰



IPO(Input Process Output) 모델은 프로그램을 분석하거나 설명하는데 사용하는 가장 기본적인 모델입니다. 프로그램으로 들어오는 입력 자료의 구조와 형태, 처리 내용과 방식, 출력 자료의 구조와 형태를 명확하게 분석하거나 설계하는 것은 안정적인 프로그램의 시작이라 할 수 있습니다. 

[49-50] 다음과 같은 문제를 해결하기 위해 프로그램을 작성하였다. 물음에 답하시오.
무게가 서로 다른 개의 물건이 있다. 각 물건은 1부터 까지 번호가 매겨져 있다.
우리는 일부 물건 쌍에 대해서 양팔 저울로 어떤 것이 무거운 것인지를 측정한
결과표를 가지고 있다. 이 결과표로부터 직접 측정하지 않은 물건 쌍의 비교 결과
를 알아낼 수도 있고 알아내지 못할 수도 있다.
예를 들어, 총 6개의 물건이 있고, 다음 5개의 비교 결과가 주어졌다고 가정하자.
([1]은 1번 물건의 무게를 의미한다.)
[1]>[2], [2]>[3], [3]>[4], [5]>[4], [6]>[5]
우리는 [2]>[3], [3]>[4]로부터 [2]>[4]라는 것을 알 수 있다. 하지만, 물건 2
와 물건 6을 비교하는 경우, 앞서의 결과만으로는 어느 것이 무거운지 알 수 없
다. 이와 같이, 물건 2는 물건 1, 3, 4와의 비교 결과는 알 수 있지만, 물건 5, 6
과의 비교 결과는 알 수 없다. 물건 4는 모든 다른 물건과의 비교 결과를 알 수
있다.
비교 결과가 모순되는 입력은 없다고 가정한다. 위 예제의 기존 측정 결과에
[3]>[1]이 추가되었다고 가정하자. 이 경우 [1]>[2], [2]>[3]이므로 우리는
[1]>[3]이라는 것을 예측할 수 있는데, 이는 기존에 측정된 결과 [3]>[1]과 서
로 모순이므로 이러한 입력은 가능하지 않다.
물건의 개수  과 일부 물건 쌍의 비교 결과가 주어졌을 때, 각 물건에 대해서 그
물건과의 비교 결과를 알 수 없는 물건의 개수를 출력하는 프로그램을 작성하시
오.
입력 형식
표준입력의 첫 줄에는 물건의 개수 N 이 주어지고, 둘째 줄에는 미리 측정된 물
건 쌍의 개수 M 이 주어진다. 단, 5 ≤N ≤ 100이고, 0 ≤M ≤ 2000이다. 다음
 개의 줄에 미리 측정된 비교 결과가 한 줄에 하나씩 주어진다. 각 줄에는 측정
된 물건 번호를 나타내는 두 개의 정수가 공백을 사이에 두고 주어지며, 앞의 물
건이 뒤의 물건보다 더 무겁다.
출력 형식
여러분은 N개의 줄에 결과를 출력해야 한다. i번째 줄에는 물건 i와 비교 결과
를 알 수 없는 물건의 개수를 출력한다.
입력과 출력의 예 1
입력
6
5
1 2
2 3
3 4
5 4
6 5
출력
2
2
2
0
3
3
입력과 출력의 예 2
입력
9
11
2 1
3 1
2 8
2 9
7 8
4 5
6 7
6 3
1 7
6 2
1 9
출력
2
3
3
7
7
2
3
3
4

프로그램
    int f[101][101];
    int main()
    {
        int N, M;
        scanf("%d %d", &N, &M);
        for (int i = 0, x, y; i < M; i++) {
            scanf("%d %d", &x, &y);
            f[x][y] = 1;
        }
        for (int k = 1; k <= N; k++) {
            for (int i = 1; i <= N; i++) {
                for (int j = 1; j <= N; j++) {
                    if ( (a) ) f[i][j] = 1;
                }
            }
        }
        for (int i = 1; i <= N; i++) {
            int count = 0;
            for (int j = 1; j <= N; j++)
            if (i != j && (b) ) count++;
            printf("%d\n", count);
        }
        return 0;
    }
    
49. 다음 중 (a)에 들어갈 내용으로 알맞은 것은?
① f[i][k] ^ f[k][j]
② f[i][k] || f[k][j]
③ f[k][j] || f[j][i]
④ f[i][k] && f[k][j]
⑤ f[k][j] && f[j][i] 

50. 다음 중 (b)에 들어갈 내용으로 알맞은 것은?
① (f[i][j] | f[j][i]) == 0
② f[i][j] * f[j][i] == 0
③ (f[i][j] ^ f[j][i]) == 1
④ f[i][j] && f[j][i]
⑤ f[i][j] == 0    

49~50문제는 문제를 명확히 이해하는 과정이 먼저 선행되어야 하고 그 이후에 IPO에 맞추어 작성된 기존 프로그램을 이해하여 작성자의 의도에 맞는 코드를 선택하면 됩니다. 문제에서는 두줄에 걸쳐 N과 M을 입력받는 다고 했지만 실제 코드에서는 한줄에서 두 값을 한번에 입력 받았습니다. 입력 형식에서 N은 최대 100, M은 최대 2000이라 했지만 배열 선언은 최대 100을 감안하고 있습니다. 입력 검사가 없는 것도 실제 프로그램에서는 문제일 수 있습니다. 일단은 핵심 로직을 찾아야 하는데 프로그램 작성자는 물건번호를 x,y 쌍을 첨자로 해서 해당 배열을 1로 설정하여 "x>y" 크다는 사실을 자료 입력과 동시에 저장하고 있습니다. 

M의 값만큼 자료 입력과 동시에 "측정된" 무게 정보를 저장했다면 그 다음에는 기초 정보를 기준으로 유추 가능한 무게 정보에 대해서 초기 자료 처럼 1로 설정하는 작업이 필요한데 이 부분에 해당하는 코드가 바로 (a) 부분입니다. 무게 유추는 a> b && b>c 이면 a>c의 경우이므로 정답 후보는 4, 5번 으로 좁혀집니다. 그런데 대입문은 "f[i][j] = 1;"이므로 a=i, c=j와 같은 형태는 4번보기입니다. 49번 문제의 정답은 4번입니다.

"측정된" 무게 정보와 유추한 무게 정보를 저장했다면 남은 것은 입력받은 자료의 개수 N만큼 i 번째 줄에 물건 i 와 비교 결과를 알 수 없는 물건의 개수를 출력하는 것만 남았습니다. (b)는 비교 결과를 알수 없는, 다시 말하면 측정되거나 휴추된 무게 정보가 없는 항목의 개수를 추출하여 출력하면 됩니다. 특정 물건과 비교해서 큰 정보도 작은 정보도 없어야 하므로 모두가 0인 것을 확인하는 구분은 1번입니다. 50번의 정답은 1번입니다.

어찌했든 소스 코드를 직접 만나기 이전에 입력-처리-출력 과정을 명확히 하는 것은 매우 중요합니다. 많은 프로젝트에서 이 부분이 불명확하거나 잦은 변경으로 인해서 어려움에 빠지곤 합니다. 코딩 이전에 스펙을 명확히 하는 것은 여러번 강조해도 지나치지 않습니다. 무엇을 하려는 프로그램인가? 를 파악하지 못한 상태에서의 코드 읽기는 그저 퀴즈 맞히기에 불가할 것이기 때문입니다.  


댓글
댓글쓰기 폼