티스토리 뷰

문제 풀러가기✍🏻

 


서론

역대급 오답 제출이 많았던, 시행착오가 많았던 문제다. index를 익숙하게 다루지 못 했기 때문이다.

시행착오(Trial&Error)

51132976 - 컴파일 에러

Main.java:10: error: ';' expected
            for(int i = 0 i < 28i++) {
                         ^
Main.java:10: error: ';' expected
            for(int i = 0 i < 28i++) {
                                ^
Main.java:11: error: ';' expected
                arr[i] = Integer.parseInt(br.readLine())    
                                                        ^
3 errors

 ;를 빼먹어서 컴파일 에러가 발생했다.

51132993 - 컴파일 에러

Main.java:19: error: variable a might not have been initialized
                        if(a != 0) {
                           ^
Main.java:26: error: variable a might not have been initialized
            if(a < b) {
               ^
2 errors

변수의 초기화에서 잘못 알고 있던 부분이 있었다.

int a, b = 0;

위 코드에서는, b만 초기화가 된 상태이다. a는 선언만 된 상태이다. intelliJ에서도 컴파일러가 a가 초기화되지 않았다고 에러 메시지를 주고 있다.

java: variable a might not have been initialized

51133143 - 컴파일 에러

Main.java:22: error: unexpected type
                    a == 0 ? a = i : b = i;
                           ^
  required: variable
  found:    value
1 error

조건문을 중복 사용해서 에러가 발생한 듯 싶다.(정확x)

if (a == 0 || b == 0) {
    a == 0 ? a = i : b = i;
}

51133159 - 컴파일 에러

Main.java:22: error: not a statement
                    a == 0 ? (a = i) : (b = i);
                           ^
1 error

 "선언문이 아니다"라는 메시지가 발생했다.

51133337 - 컴파일 에러

Main.java:23: error: incompatible types: boolean cannot be converted to int
                        nArr[j] = false;
                                  ^
Main.java:28: error: incomparable types: int and boolean
                if(nArr[i] == false) {
                           ^
2 errors

int타입의 배열의 요소를 boolean 타입으로 형 변환할 수 없다는 에러가 발생했다.

두 번째 에러는 int와 boolean 타입은 비교할 수 없다는 에러이다.

51133742 - 컴파일 에러

Main.java:15: error: ';' expected
                    bw.write(i + 1 + "\n")
                                          ^
1 error

 ;를 빼먹어서 컴파일 에러가 발생했다.

51133746 - 런타임 에러 (ArrayIndexOutOfBounds)

index의 범위를 벗어나 발생한 에러이다.

51133783 - 틀렸습니다.

 i를 출력해야 하는데, i + 1을 출력해서 틀렸다.

출석번호가 1 ~ 30번이지만, 인덱스는 0부터 시작한다.

for문을 i = 1부터 반복하면 되기 때문에, 배열을 다음과 같이 선언하면 된다.

int[] arr = new int[31];

 

풀이(Solution)

int형 배열의 모든 요소는 0으로 자동 초기화된다.

1 ~ 30번 학생을 표현하기 위해 31개의 요소를 갖는 int형 배열을 생성한다.

입력 받은 수가 곧 제출한 학생의 출석번호이다. 따라서 출석번호에 해당하는 인덱스를 가진 요소에 대해 1을 대입하여,

자동 초기화되어 0이 저장되어 있는 미제출한 학생과 구분이 가능해진다.

for(int i = 1; i <= 28; i++) {
    list[Integer.parseInt(br.readLine())] = 1;               
}

for문을 1 ~ 30까지 반복하여, list 배열의 요소가 여전히 0일 경우, 출석번호인 i와 개행문자("\n")를 출력한다.

출력 조건은 다음 두 가지이다.

  1. 출력은 2줄이다.
  2. 1번째 줄엔 제출하지 않은 학생의 출석번호 중 가장 작은 것을 출력하고, 2번째 줄에선 그 다음 출석번호를 출력한다.

i가 애초에 오름차순으로 반복문이 실행되기 때문에, 2번 조건도 자동적으로 충족된다.

 

BufferedReader & BufferedWriter 풀이 순서

  1. try-catch문 '예외처리'
  2. BufferedReader, BufferedWriter 객체 생성
  3. br.readLine()으로 입력 처리
  4. bw.write()으로 출력 처리
  5. br.close(), bw.close()로 처리 완료

코드

import java.io.*;

class Main {
    public static void main(String[] args) {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
            int[] list = new int[31];
            for(int i = 1; i <= 28; i++) {
                list[Integer.parseInt(br.readLine())] = 1;               
            }
            
            for(int i = 1; i <= 30; i++) {
                if(list[i] == 0) {
                    bw.write(i + "\n");
                }
            }
            br.close();
            bw.close();
            
        } catch(IOException e) {}
    }
}

 

 

댓글
공지사항