https://www.acmicpc.net/submit/5597/63146239
문제
X대학 M교수님은 프로그래밍 수업을 맡고 있다. 교실엔 학생이 30명이 있는데, 학생 명부엔 각 학생별로 1번부터 30번까지 출석번호가 붙어 있다.
교수님이 내준 특별과제를 28명이 제출했는데, 그 중에서 제출 안 한 학생 2명의 출석번호를 구하는 프로그램을 작성하시오.
문제 접근 , 풀이 과정
1 ~ 30의 숫자 중 입력값과 비교 했을 때 없는 숫자를 어떻게 출력할까?
으로 접근했다.
먼저, ArrayList에 1~30을 넣고 입력값과 비교하여 없으면 해당 인덱스를 삭제하게 만들었다.
import java.io.*;
import java.util.ArrayList;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
ArrayList<Integer> array = new ArrayList<>();
// 1 ~ 30 값 대입
for(int i = 0; i < 30; i++)
array.add(i , i+1);
for(int i = 0; i < 28; i++) {
int tmp = Integer.parseInt(bf.readLine());
// 일치하면 일치한 array의 요소를 삭제
for(int j = 0; j < 30; j++) {
if(tmp == array.get(j)) {
array.remove(j);
break;
}
}
}
if(array.get(0) > array.get(1))
System.out.print(array.get(1) + "\n" + array.get(0));
else
System.out.print(array.get(0) + "\n" + array.get(1));
}
}
배운점
해당 코드가 비효율적이라 생각하여 랭킹에 있는 코드들을 보고 비교하였다.
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int stu[] = new int[31];
for(int i = 0 ; i < 28 ; i++) {
stu[Integer.parseInt(br.readLine())] = 1;
}
for(int i = 1 ; i <= 30 ; i++) {
if(stu[i] == 0) System.out.println(i);
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
boolean[] arr = new boolean[31];
int temp;
for (int i=0; i<28; i++) {
temp = Integer.parseInt(br.readLine());
arr[temp] = true;
}
for (int i=1; i<=30; i++) {
if (!arr[i]) System.out.println(i);
}
}