2 minute read




문제 풀이


9X9 격자판 크기에 주어지는 값들 중 최댓값을 찾고, 최댓값이 어느 행, 어느 열에 위치하는지를 구해야 한다.
중첩 반복문으로 2차원 배열을 활용해 접근하면 손쉽게 알아낼 수 있다.


아이디어 도출

  • 격자판에 주어지는 9X9 크기의 입력값들을 2차원 배열에 저장한다.
  • 위에서 만든 2차원 배열을 순회하며 최댓값을 찾는다.


아이디어대로 코드를 작성해보자.

1
2
3
4
5
6
7
8
int[][] arr = new int[9][9];

for(int i=0; i<9; i++) {
    StringTokenizer st = new StringTokenizer(br.readLine());
    for(int j=0; j<9; j++) {
        arr[i][j] = Integer.parseInt(st.nextToken());
    }
}

9X9 크기의 2차원 배열 arr를 선언하여 초기화하고, 입력으로 받는 격자판의 값들을 arr 배열에 저장한다.

1
2
3
int max = 0;
int row = 0;
int col = 0;

그리고 구해야 할 최댓값과 최댓값의 행과 열을 변수로 만들어 담기위해 미리 변수를 각각 0으로 초기화한다.

1
2
3
4
5
6
7
8
9
for(int i=0; i<arr.length; i++) {
    for(int j=0; j<arr[i].length; j++) {
        if(arr[i][j] > max) {
            max = arr[i][j];
            row = i+1;
            col = j+1;
        }
    }
}

그리고 이중 for문으로 2차원 배열 arr를 순회하며 격자판들의 값중에서 최댓값과 최댓값의 행과 열을 찾아 각각의 변수에 저장하면 된다.


모든 격자판(81칸)의 값이 0이라면?

위와 같이 코드를 작성하고 제출하니 정답 내역이 100%까지 가서 “틀렸습니다” 로 나왔다.
오답이 될만한 테스트케이스를 살펴보니 역시 작성한 코드에는 허점이 있었다.

바로 모든 격자판의 값이 0일 경우이다. 말 그대로 81칸, 모든 격자판의 값이 0이라면 결국 첫번째로 나오는 1번째 행, 1번째 열의 0이 최댓값이 된다.
그런데 내가 작성한 코드는 0번째 행, 0번째 열을 출력하고 있었다.
바로 최댓값 변수 max의 초기값을 0으로 주었기 때문이다.
그렇게 위의 이중 for문 내에 있는 조건문을 충족하지 못하기에 행과 열을 탐색하지 못하고 반복문이 종료되어 문제가 발생하게 되었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int max = -1;
int row = 0;
int col = 0;
for(int i=0; i<arr.length; i++) {
    for(int j=0; j<arr[i].length; j++) {
        if(arr[i][j] > max) {
            max = arr[i][j];
            row = i+1;
            col = j+1;
        }
    }
}

bw.write(max+"\n" + row + " " + col + "\n");

위와 같이 max 변수를 -1 음수로 두어 격자판의 값이 0이어도 최댓값을 탐색할 수 있도록 수정하니 정상적으로 정답을 낼 수 있었다.



작성코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import java.io.*;
import java.util.*;

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int[][] arr = new int[9][9];

        for(int i=0; i<9; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            for(int j=0; j<9; j++) {
                arr[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        int max = -1;
        int row = 0;
        int col = 0;
        for(int i=0; i<arr.length; i++) {
            for(int j=0; j<arr[i].length; j++) {
                if(arr[i][j] > max) {
                    max = arr[i][j];
                    row = i+1;
                    col = j+1;
                }
            }
        }

        bw.write(max+"\n" + row + " " + col + "\n");

        bw.flush();
        bw.close();
        br.close();
    }   
}

회고

  • 최댓값의 초기값이 2차원 배열을 순회하며 충족해야 하는 조건에 부합되지 않아 문제가 발생했지만, 빠르게 문제가 무엇인지 알아내어 수정할 수 있었다.