[문제]
<그림 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 |