문제
https://www.acmicpc.net/problem/5597
5597번: 과제 안 내신 분..?
X대학 M교수님은 프로그래밍 수업을 맡고 있다. 교실엔 학생이 30명이 있는데, 학생 명부엔 각 학생별로 1번부터 30번까지 출석번호가 붙어 있다. 교수님이 내준 특별과제를 28명이 제출했는데,
www.acmicpc.net
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main5597 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
List<Integer> students = new ArrayList<Integer>();
List<Integer> submitStudents = new ArrayList<Integer>();
for (int i=1; i<31; i++) {
students.add(i);
}
for (int i=1; i<29; i++) {
submitStudents.add(sc.nextInt());
}
sc.close();
for (int student:students) {
if (!submitStudents.contains(student)) {
System.out.println(student);
}
}
}
}
1. 일단은 정답이다.
2. 하지만 타 블로그에 올라온 글들과 비교를 했을 때 내가 작성한 코드가 간결하고 직관적이지 못하다는 사실을 깨달았다.
3. 내가 사용한 방식은 학생번호(1)와 과제를 제출한 학생(2)의 List를 각각 만들어 해당 원소가 있는지 비교를 한다.
4. 문제점은
첫째, for문의 무분별한 사용.
둘째, 현재는 30이라는 작은 수지만 훨씬 더 큰 크기의 List가 생성될 경우 비교속도에 대한 저하가 우려된다.
셋째, 굳이 생성안해도 될 변수를 생성함으로써 메모리가 낭비된다.
넷째, 백준내에서 1차원 배열로 분류된 문제인데 List를 통해 활용했으니 접근 방식 자체가 잘못됐다고 볼 수 있다.
5. 타 블로그에서 올라온 글을 살펴보자.
import java.util.*;
public class Baekjoon5597 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] student = new int[31];
for(int i=1; i<29; i++) {
int success = sc.nextInt();
student[success] = 1;
}
for(int i=1; i<student.length; i++) {
if(student[i]!=1)
System.out.println(i);
}
sc.close();
}
}
이외에도 boolean 배열을 통한 방식 등이 있지만 본질은 같다. 입력된 숫자를 배열의 인덱스로 넣으면서 값을 1로 초기화 시킨다. int형 배열의 경우 기본값이 0이기 때문에 비교하는데는 문제가 없다.
6. 정답을 맞추느냐보단 올바른 해답이었는지, 그 탐색과정이 더 중요하다.
'백준' 카테고리의 다른 글
백준 2738번 (0) | 2022.10.26 |
---|---|
백준 1546번 (0) | 2022.10.25 |
백준 2438번 220914 (0) | 2022.09.14 |
백준 10950번 220914 (0) | 2022.09.14 |
백준 2480번 220906 (0) | 2022.09.06 |