맞는데 왜 틀릴까..?

알고리즘 문제/구현

[Java] 구현 (쿠키의 신체 측정)

안도일 2023. 3. 3. 17:49

 

https://www.acmicpc.net/problem/20125

 

20125번: 쿠키의 신체 측정

쿠키런은 데브시스터즈에서 제작한 모바일 러닝 액션 게임이다. 마녀의 오븐에서 탈출한 쿠키들과 함께 모험을 떠나는 게임으로, 점프와 슬라이드 2가지 버튼만으로 손쉽게 플레이할 수 있는

www.acmicpc.net

 

 

이 전까지 문자열을 입력으로 받아올 때 항상 String 배열을 사용했다. 문자열 2차원 배열을 받아온다 하면 묻지도 따지지도 않고 String [][]을 사용했는데 이 비용이 크다는 걸 깨달았다.

 

char [][]를 사용해서 한 줄로 들어온 String을 저장할 수 있었던 것이다!

 

 

public class Main {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        int N = Integer.parseInt(br.readLine());

        String[][] square = new String[N][N];

        int count=0;
        int left_arm=0, right_arm=0, left_leg=0, right_leg=0, center=0;


        Point head = new Point(-1,-1);
        for(int i=0; i<N; i++){
            square[i] = br.readLine().split("");

            if(head.x == -1) {
                for (int j = 0; j < N; j++) {
                    if (square[i][j].equals("*")) {
                            head.x = i+2;
                            head.y = j+1;
                    }
                }
            }
        }

        System.out.println(head.x + " " + head.y);


        for(int i=0; i<N; i++){

            if(square[head.x-1][i].equals("*")){
                if(i < head.y-1)
                    left_arm++;
                else if (i > head.y-1)
                    right_arm++;
            }
        }


        for(int i=head.x; i<N; i++){

            if(square[i][head.y-1].equals("*"))
                center++;

            if(square[i][head.y-1-1].equals("*"))
                left_leg++;

            if(square[i][head.y-1+1].equals("*"))
                right_leg++;

        }


        System.out.print(left_arm + " " + right_arm + " " + center + " " + left_leg + " " + right_leg);
    }
}

 

처음 제출했던 방식인데 String으로 2차원 배열을 생성해서 문자열을 담았다. 1트에 성공하긴 했으나 소요된 메모리와 시간이 워낙 커서 분석해 보다가 아마 String 때문이 아닐까 생각했는데 어느 정도 맞는 생각이었다.

 

public class Main {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        int N = Integer.parseInt(br.readLine());

        char[][] square = new char[N][N];

        int count=0;
        int left_arm=0, right_arm=0, left_leg=0, right_leg=0, center=0;


        Point head = new Point(-1,-1);
        for(int i=0; i<N; i++){
            square[i] = br.readLine().toCharArray();

            if(head.x == -1) {
                for (int j = 0; j < N; j++) {
                    if (square[i][j] == '*') {
                            head.x = i+2;
                            head.y = j+1;
                    }
                }
            }
        }

        System.out.println(head.x + " " + head.y);


        for(int i=0; i<N; i++){

            if(square[head.x-1][i] == '*'){
                if(i < head.y-1)
                    left_arm++;
                else if (i > head.y-1)
                    right_arm++;
            }
        }


        for(int i=head.x; i<N; i++){

            if(square[i][head.y-1] == '*')
                center++;

            if(square[i][head.y-1-1] == '*')
                left_leg++;

            if(square[i][head.y-1+1] == '*')
                right_leg++;

        }


        System.out.print(left_arm + " " + right_arm + " " + center + " " + left_leg + " " + right_leg);
    }
}

 

두 번째로 낸 제출인데 char [][]로 toCharArray()를 사용했다.

 

 

배열 타입만 바꿨을 뿐인데 메모리는 5배 시간은 3배 줄어들었다. 앞으로 String은 피하고 단일 문자라면 char를 사용하자.

 

'알고리즘 문제 > 구현' 카테고리의 다른 글

[Java] 구현 (한 줄로 서기)  (0) 2023.02.18
구현 (마법사 상어와 토네이도)  (0) 2022.07.01
구현 (누울 자리를 찾아라)  (0) 2022.04.27