X대학 M교수님은 프로그래밍 수업을 맡고 있다. 교실엔 학생이 30명이 있는데, 학생 명부엔 각 학생별로 1번부터 30번까지 출석번호가 붙어 있다.
교수님이 내준 특별과제를 28명이 제출했는데, 그 중에서 제출 안 한 학생 2명의 출석번호를 구하는 프로그램을 작성하시오.
입력은 총 28줄로 각 제출자(학생)의 출석번호 n(1 ≤ n ≤ 30)가 한 줄에 하나씩 주어진다. 출석번호에 중복은 없다.
출력은 2줄이다. 1번째 줄엔 제출하지 않은 학생의 출석번호 중 가장 작은 것을 출력하고, 2번째 줄에선 그 다음 출석번호를 출력한다.
[]
사용 idea처음 문제를 보고 든 생각은 입력값을 int[]
에 담아서 각 요소를 반복문을 돌려서 정수와 비교한다음 없는 요소의 인덱스만 추출하는 방향으로 구현하려고 했지만, 생각보다 쉽지 않아서 30분(개인 제한 시간)을 넘겨 버렸다.. 아래 글 참고하여 해당 아이디어를 얻었다.
boolean형 배열에서 true이면 과제 제출, false이면 과제를 제출하지 않은 것이다. 즉, 28명의 학생 번호가 입력으로 주어지면 배열에서의 입력받은 인덱스를 true로 바꾼다. 그리고 마지막에 배열을 순회하면서 false인 인덱스를 출력하면 된다.
배열 요소 크기가 31인 이유는 입력값이 1부터 30 사이의 정수이기 때문이다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
boolean[] arr = new boolean[31];
for(int i=0; i<28; i++){
int n = Integer.parseInt(br.readLine());
arr[n] = true;
}
br.close();
for(int i=1; i <= 30; i++){
if(!arr[i]){
System.out.println(i);
}
}
}
}