백준 2566 최댓값 구하기 [JAVA]

Ga0·2023년 3월 21일
0

baekjoon

목록 보기
3/123

  • 이문제를 포스트하고자 한 것은 내 코드가 틀렸기 때문이다.

문제 해설

  • 일단 이 문제를 정리 해보자면, 사실 정리라고 할 것도 없이 쉽게 이해할 수 있는 문제이다.
  • 행이 9이고, 열이 9인 격자판(행렬)에 있는 모든 값들 중 가장 큰 값과 그 큰 값의 인덱스 (행, 열)값을 출력하면 되는 문제이다.

틀린코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer token;
        StringBuilder sb = new StringBuilder();

        int max = 0; //최댓값을 저장하는 변수

        for(int i = 1; i <= 9; i++){
            token = new StringTokenizer(br.readLine());
            for(int j = 1; j <= 9; j++){
                int compare = Integer.parseInt(token.nextToken());
                if(max < compare) { //생각 해보니 배열에 저장할 필요가 없음X
                    // 최댓값과 그 인덱스만 알면되기 때문
                    max = compare;
                    sb.setLength(0); //초기화 //기존의 값은 필요없기 때문
                    sb.append(max + "\n").append(i +" " +j);
                }
            }
        }
        br.close();
        System.out.println(sb);
    }
}
  • 그래서, 나는 이 문제가 2차원 배열 문제이기는 하지만 최댓값만 출력하면 되는 거면 굳이(?) 모든 값들을 2차원 배열에 저장할 필요가 있는건가?
    -> 메모리를 조금이라도 아끼자...! 라는 마음으로 2차원 배열을 사용하지 않았다.

    -> 위의 코드를 작성해 콘솔에 값을 띄워봤더니 어? 예시랑 출력값이 같네??
    -> 이때까지만 해도 내가 쓴 풀이 방식이 맞는 것 같았다.

    -> 이 실패하였습니다. 를 마주하기 전에는 말이다...

  • 이 포스트를 하고 있는 이 와중에도 위의 코드가 왜 안되는지는 모르겠지만, 2차원 배열의 문제이니까 2차원 배열로도 풀어서 맞았습니다. 를 띄울려고 한다.


맞은 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

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

        int arrays[][] = new int[9][9];


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

        int max = 0; //최댓값을 저장하는 변수
        int row = 0; //최댓값의 행을 저장하는 변수
        int col = 0; //최댓값의 열 인덱스를 저장하는 변수

        for(int i = 0; i < 9; i++){
            for(int j = 0; j < 9; j++){
                if(max < arrays[i][j]){
                    max  = arrays[i][j];
                    row = i;
                    col = j;
                }
            }
        }
        System.out.println(max + "\n" + (row+1) + " " + (col+1) + " ");
    }
}

콘솔 화면

결과

  • 2차원 배열을 쓰니 바로 맞았다.

틀린 이유를 알고 싶어서 기준 틀렸던 코드에 2차원 배열을 추가해보았다.

또 틀린 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer token;
        StringBuilder sb = new StringBuilder();

        int arrays[][] = new int[9][9];

        int max = 0; //최댓값을 저장하는 변수

        for(int i = 0; i < 9; i++){
            token = new StringTokenizer(br.readLine());
            for(int j = 0; j < 9; j++){
                int compare = Integer.parseInt(token.nextToken());

                arrays[i][j] = compare;

                if(max < compare) {
                    max = compare;
                    sb.setLength(0); //초기화 //기존의 값은 필요없기 때문
                    sb.append(max + "\n").append((i+1) +" " +(j+1) + " ");
                }
            }
        }
        br.close();
        System.out.println(sb);
    }
}

  • 2차원 배열문제는 아닌가보다... 무슨 문제일까...

또 또 틀린 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer token;
        StringBuilder sb = new StringBuilder();

        int arrays[][] = new int[9][9];



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

        int max = 0; //최댓값을 저장하는 변수

        for(int i = 0; i < 9; i++){
            for(int j = 0; j < 9; j++){
                if(max < arrays[i][j]){
                    max = arrays[i][j];
                    sb.delete(0, sb.length());
                    sb.append(max + "\n");
                    sb.append((i+1) + " ");
                    sb.append((j+1));
                }
            }
        }

        br.close();
        System.out.println(sb);
    }
}

-> 조금씩 고쳐보면서 다 확인 해봤는데 계속 틀렸다고 나온다.

-> 콘솔 값을 다르게 줬을때 문제가 되거나 그렇지도 않다..

결과

  • 덕분에 틀렸습니다 3스택

느낀점

  • 사실 느낀점이라고 할 건 없고, 아직도 왜 내가 푼 방식이 틀렸는지 이해하지 못해서 만약, 이 포스트를 우연히 보는 분이 계신다면 조용히 알려주시고 갔으면 좋겠다. (내가 푼 방식이 왜 안되는지 말이다.) 눈으로는 틀린 이유를 도저히 못찾을 것 같아서...

2개의 댓글

comment-user-thumbnail
2024년 3월 5일

if(max < compare)
부분에서

if(max <= compare)
를 추가해주시면 맞는 답으로 나옵니다.

1개의 답글