[Baekjoon/백준][5597][C/C++] 과제 안 내신 분..?
『목차』
0. 개요
1. 문제
2. 풀이
3. 코드
0. 개요
1차원 배열에 대한 이해만 하면 쉽게 풀리는 문제. 브론즈5 문제라 긴 설명은 필요 없을 듯하다.
1. 문제
https://www.acmicpc.net/problem/5597
5597번: 과제 안 내신 분..?
X대학 M교수님은 프로그래밍 수업을 맡고 있다. 교실엔 학생이 30명이 있는데, 학생 명부엔 각 학생별로 1번부터 30번까지 출석번호가 붙어 있다. 교수님이 내준 특별과제를 28명이 제출했는데,
www.acmicpc.net
[문제]
X대학 M교수님은 프로그래밍 수업을 맡고 있다. 교실엔 학생이 30명이 있는데, 학생 명부엔 각 학생별로 1번부터 30번까지 출석번호가 붙어 있다.
교수님이 내준 특별과제를 28명이 제출했는데, 그 중에서 제출 안 한 학생 2명의 출석번호를 구하는 프로그램을 작성하시오.
[입력]
입력은 총 28줄로 각 제출자(학생)의 출석번호 n(1 ≤ n ≤ 30)가 한 줄에 하나씩 주어진다. 출석번호에 중복은 없다.
[출력]
출력은 2줄이다. 1번째 줄엔 제출하지 않은 학생의 출석번호 중 가장 작은 것을 출력하고, 2번째 줄에선 그 다음 출석번호를 출력한다.
[예제 입력 1]
3
1
4
5
7
9
6
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[예제 출력 1]
2
8
[예제 입력 2]
9
30
6
12
10
20
21
11
7
5
28
4
18
29
17
19
27
13
16
26
14
23
22
15
3
1
24
25
[예제 출력 2]
2
8
2. 풀이
크기가 31인 배열을 선언한다. (인덱스 번호를 30까지 활용하기 위함.)
이후, 배열의 인덱스 값을 학생의 출석번호로 활용하여,
1번 학생은 1번 인덱스, 2번 학생은 2번 인덱스, ... 에 배정한다. (0번 인덱스는 활용하지 않음.)
배열의 기본값을 0=false로 초기화한 후, 출석한 학생의 값을 true로 변경한다.
이렇게 하면, 값이 false로 남아있는 index가 출석을 하지 않은 학생의 번호가 된다.
3. 코드
#pragma warning (disable:4996)
#include <stdio.h>
#include <stdbool.h>
int main(int argc, char* argv[]) {
bool flag[31] = {}; //0=false로 초기화
for (int i = 0; i < 28; i++) {
int tmp; scanf("%d", &tmp);
flag[tmp] = true;
}
/* 입력값에 해당하는 인덱스의 값을 true로 변경. */
for (int i = 1; i <= 30; i++)
if (flag[i] == false)
printf("%d\n", i);
/* 입력되지 않은 값은 여전히 false로 남아있다. */
return 0;
}