Algorithm/Baekjoon

백준 / 2566번 / 최댓값

Gyuri 2022. 8. 5. 17:23

[문제]

<그림 1>과 같이 9×9 격자판에 쓰여진 81개의 자연수 또는 0이 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 행 몇 열에 위치한 수인지 구하는 프로그램을 작성하시오.

예를 들어, 다음과 같이 81개의 수가 주어지면

이들 중 최댓값은 90이고, 이 값은 5행 7열에 위치한다.

[입력]

첫째 줄부터 아홉 번째 줄까지 한 줄에 아홉 개씩 수가 주어진다. 주어지는 수는 100보다 작은 자연수 또는 0이다.

[출력]

첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 위치한 행 번호와 열 번호를 빈칸을 사이에 두고 차례로 출력한다. 최댓값이 두 개 이상인 경우 그 중 한 곳의 위치를 출력한다.

[예제 입력]

3 23 85 34 17 74 25 52 65
10 7 39 42 88 52 14 72 63
87 42 18 78 53 45 18 84 53
34 28 64 85 12 16 75 36 55
21 77 45 35 28 75 90 76 1
25 87 65 15 28 11 37 28 74
65 27 75 41 7 89 78 64 39
47 47 70 45 23 65 3 41 44
87 13 82 38 31 12 29 29 80

[예제 출력]

90
5 7

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int[][] arr = new int[9][9];
        for(int i=0; i<9; i++) {
            for(int j=0; j<9; j++) {
                arr[i][j] = sc.nextInt();
            }
        }

        int max = arr[0][0];
        int maxI = 0;
        int maxJ = 0;
        for(int i=0; i<9; i++) {
            for(int j=0; j<9; j++) {
                if(arr[i][j] > max) {
                    max = arr[i][j];
                    maxI = i;
                    maxJ = j;
                }
            }
        }
        System.out.println(max);
        System.out.println((maxI+1) + " " + (maxJ+1));
    }
}

2차원 배열에서 최댓값을 구하고, 

최댓값이 위치한 행 번호와 열 번호를 구하는 문제이다.

 

for문을 돌며 최댓값을 구해 max에 저장하고,

for문을 한 번 더 돌며 그 최댓값이 위치한 행 번호와 열 번호를 구한다.

 

행/열 번호를 나타내는 변수를 생성하고,

배열을 돌며 최댓값을 찾으면

n과 m에 행/열 값을 넣어준다.

 

주의할 점은, 

n과 m에 1을 더해줘야 한다는 것이다.  (1행 1열부터 시작하기 때문)

 

 


 

정답 얻기까지의 실패 코드 ..

아래부터는 실패 코드에 대한 이유이니까 굳이 읽지 않아도 된다.

 

이 문제는 분명히 맞게 푼 것 같고 코드에 문제가 없어보이는데,

실패가 꽤 많이 떴었다.

 

아래가 바로 그 문제의 코드..

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int[][] arr = new int[9][9];
        for(int i=0; i〈9; i++) {
            for(int j=0; j〈9; j++) {
                arr[i][j] = sc.nextInt();
            }
        }

        int max = arr[0][0];
        int maxI = 0;
        int maxJ = 0;
        for(int i=0; i〈9; i++) {
            for(int j=0; j〈9; j++) {
                if(arr[i][j] > max) {
                    max = arr[i][j];
                    maxI = i+1;
                    maxJ = j+1;
                }
            }
        }
        System.out.println(max);
        System.out.println(maxI + " " + maxJ);
    }
}

행과 열 변수인 maxI와 maxJ의 값이 문제였다.

위에서 말했듯이, 

1행 1열부터 시작하기 때문에, 구한 행/열 값에서 +1 을 반드시 해줘야 한다.

 

그런데 해당 코드는

0 0 으로 초기화 한 후, 

최대값인 행/열 위치를 구해 1을 싹 다 더해준 후, 출력한다.

 

위에서는 

0 0 으로 초기화 한 후,

최댓값인 행/열 위치를 구해 저장하고, 출력을 할 때 1을 더해줬다.

 

이게 문제이다.

0 0 으로 초기화를 했는데,

만일 arr[0][0]에 있는 수가 최댓값이라면?

 

for문 안의 if문 조건이 충족하지 않기 때문에

if(arr[i][j] > max)

초기화 된 값 (0 0) 이 그대로 출력된다.

 

이상으로.. 바보 같았던 삽질 회고 끝 ㅎㅎ..

'Algorithm > Baekjoon' 카테고리의 다른 글

백준 / 10816번 / 숫자 카드 2  (0) 2022.08.07
백준 / 9012번 / 괄호  (0) 2022.08.05
백준 / 10773번 / 제로  (0) 2022.08.05
백준 / 1247번 / 부호 (+ BigInteger 사용법)  (0) 2022.08.05
백준 / 2420번 / 사파리월드  (0) 2022.07.21