# 5597번 과제 안 내신 분...?
문제
X대학 M교수님은 프로그래밍 수업을 맡고 있다. 교실엔 학생이 30명이 있는데, 학생 명부엔 각 학생별로 1번부터 30번까지 출석번호가 붙어 있다.
교수님이 내준 특별과제를 28명이 제출했는데, 그 중에서 제출 안 한 학생 2명의 출석번호를 구하는 프로그램을 작성하시오.
입력
입력은 총 28줄로 각 제출자(학생)의 출석번호 n(1 ≤ n ≤ 30)가 한 줄에 하나씩 주어진다. 출석번호에 중복은 없다.
출력
출력은 2줄이다. 1번째 줄엔 제출하지 않은 학생의 출석번호 중 가장 작은 것을 출력하고, 2번째 줄에선 그 다음 출석번호를 출력한다.


* 풀이
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] arr = new int[30];
for (int i = 0; i < 28; i++) { // 제출한 사람 인덱스값 1
int a = sc.nextInt();
arr[a - 1] = 1;
}
for (int i = 0; i < 30; i++) { // 제출 안 한 사람 찾기
if (arr[i] == 0) {
System.out.println(i + 1);
}
}
}
}
다른 풀이들 찾아보니 이렇게 풀었다.
큰 차이 없고 배열 선언할 때가 차이 있었는데 이 식에선 int[] arr= new int[31];로 해주었더라는.
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] arr = new int[31]; // 1~30번 인덱스 사용.
for(int i = 1; i < 29; i++){ // 과제 제출한 사람들 인덱스값 1
int a = sc.nextInt();
arr[a] = 1;
}
for(int i = 1; i <= 30; i++){ // 과제 제출하지 않은, 인덱스값이 0인 인덱스 출력
if(arr[i] != 1) {
System.out.println(i);
}
}
}
}
int[] arr= new int[31];
여기에서 [31]을 한 이유?
for (int i = 1; i <29; i++)처럼 1부터 시작하는 반복문을 쓰기 때문에, 배열 인덱스도 1~30을 쓰려면 int[31]로 만들어야 한다.
학생 번호는 1~30까지 존재하고 자바 배열은 0부터 시작한다.
학생 번호 = 배열 인덱스로 맞춰서 쓰고 싶다면 배열을 31로 만들어준다. 이때 arr[0]은 쓰이지 않는다.
> 실제 번호와 배열 인덱스를 일치시키고 싶을 때 하나 더 크게 만든다.
솔찌 아직도 이해가 잘 안 감;
그러나 확실히 [31]로 하니까 조건문, 반복문 쪽에서 1 더하고 빼고 안 해서 코드가 훨씬 직관적으로 보인다.
👉 왜 arr[i] = a; 가 아니라 arr[a] = 1; 일까?
이 코드는 "a번 학생이 제출했다" 라는 사실을 기록하려는 것.
- 제출한 학생 번호가 예를 들어 5라면?
- arr[5] = 1;
→ “5번 학생은 제출했다” 라고 표시하는 것.
즉,
배열의 인덱스를 '학생 번호'로 사용하고
값(1)로 제출 여부를 표시하는 방식.
=> 1과 0으로 제출 여부를 표시한다!
'코테 > 백준' 카테고리의 다른 글
| [백준 / java 11] 11654번 아스키 코드, 2743번 단어 길이 재기 (0) | 2025.05.15 |
|---|---|
| [백준 / java 11] 1차원 배열 > 3052번 나머지 (0) | 2025.05.14 |
| [백준 / java 11] 1차원 배열 > 10813번 공 바꾸기 (0) | 2025.05.12 |
| [백준 / java 11] 1차원 배열 > 10810번 공 넣기 (0) | 2025.05.10 |
| [백준 / java 11] 1차원 배열 > 10871번 X보다 작은 수, 2562번 최댓값 (0) | 2025.05.09 |