본문 바로가기

코딩테스트

[JAVA] 백준 2615 - 오목

728x90

 

🤔 문제 접근

정답 비율에서 알 수 있듯이 상당히 어려운 문제였다.

초기 상하좌우, 대각선 4방향으로 총 8가지 방향 벡터를 선언하고

재귀 호출을 통해 놓여진 돌의 개수가 5개인지 확인하도록 했다.

 

놓인 돌이 5개고 같은 방향으로 한번 더 진행 했을 때

같은 돌이 놓여져 있거나 초기 위치에서 한 칸 뒤로 갔을 때

같은 돌이 놓여져 있는 경우 놓인 돌이 6개 이상이 되므로 다른 오목을 찾게 끔 풀었다.

 

하지만 초기 풀이에서 놓친 것이 몇 가지 있었는데 

만약 오목일 경우 오목을 이루는 돌들 중 가장 왼쪽, 그리고 윗쪽에 있는 돌의 좌표를 출력해야 했다.

이 점을 놓치고 초기 좌표만 정답으로 출력하게 끔 했고 당연히 계속 틀렸다.

 

또한 방향 벡터가 8개일 필요없이 4가지 방향을 가지고 반대 방향일 경우를 고려해주면 되었다.

 

마지막으로 가장 왼쪽이며 위쪽 좌표를 출력하는 것을 고려하기가 어려웠는데 이는 

전체 map을 2중 for문으로 순회 할 때 열 증가 -> 행 증가 순으로 순회하는 것으로 하면 되었다.

 

🚨CODE

import java.io.*;
import java.util.*;

public class Main {
    static int[][] map;
    static int[][] d = {{0,1}, {1,0}, {1,1}, {-1,1}};
    public static void main(String[] args) throws Exception  {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        map = new int[19][19];

        // map 정보 저장
        for(int i = 0; i<19; i++){
            st = new StringTokenizer(br.readLine());
            for(int j = 0; j<19; j++){
                map[i][j] = Integer.parseInt(st.nextToken());

            }
        }

        // 열 -> 행으로 순회
        for(int j = 0; j<19; j++){
            for(int i = 0; i<19; i++){
                if(map[i][j] == 1 || map[i][j] == 2){
                    for(int k = 0; k<4; k++){
                        int nx = i;
                        int ny = j;
                        int count = 1;

                        while(true){
                            nx = nx+d[k][0];
                            ny = ny+d[k][1];

                            if(0<= nx && nx < 19 && 0<= ny && ny < 19){
                                if(map[i][j] == map[nx][ny])
                                    count++;
                                else
                                    break;
                            } else
                                break;
                        }

                        nx = i;
                        ny = j;

                        while(true){
                            nx = nx - d[k][0];
                            ny = ny - d[k][1];

                            if(0<= nx && nx < 19 && 0<= ny && ny < 19){
                                if(map[i][j] == map[nx][ny])
                                    count++;
                                else
                                    break;
                            } else
                                break;
                        }
                        if(count == 5){
                            System.out.println(map[i][j]);
                            System.out.printf("%d %d", i+1, j+1);
                            return;
                        }

                    }
                }

            }

        }

        System.out.println(0);

    }
}

 

728x90
반응형