[JAVA] SWEA 4615 - 재미있는 오셀로 게임

hyng·2022년 1월 24일
0

SWEA

목록 보기
17/78

solution

문제에서 주어진 대로 그대로 짜면 된다.

1) 문제에서 "돌을 놓을 수 없는 곳은 입력으로 주어지지 않는다."라고 했기 때문에 입력으로 주어지는 위치(y, x)에 돌을 놓고 위, 아래, 왼쪽, 오른쪽, 위 왼쪽 대각선, 위 오른쪽 대각선, 아래 왼쪽 대각선, 아래 오른쪽 대각선을 각각 보면서 바꿔줄 수 있는 돌은 바꿔주면 된다.

2) "단, 자신이 놓을 돌과 자신의 돌 사이에 상대편의 돌이 있을 경우에만 그곳에 돌을 놓을 수 있고, 그때의 상대편의 돌은 자신의 돌로 만들 수 있다"
라고 해서 항상 자신이 놓을 돌과 자신의 돌 사이에 하나의 돌만 오는 줄 알았는데, 1개 이상의 돌이 올수 있다. 예를 들어 내가 놓을 돌이 흑돌(=1)이라면 1221 또는 12221 이런 식으로 올수 있고 만약 1(내가 놓을 돌)221 이렇게 왔다면 흑돌(=1) 사이의 2개의 백돌(=2)을 모두 흑돌(=1)로 만들 수 있는 것. 그럼 결과는 1111 이렇게 된다.
또 다른 경우로 1(내가 놓을 돌)212 이렇게 온다면 흑돌 사이에 있는 1212 1개의 백돌(=2)만 흑돌(=1)로 바꿀 수 있다. 결과는 1112 이렇게 된다.

3) 인덱스에 주의
입력에서는 1-N까지로 주어지기 때문에 입력을 받을 때 y, x 값에 -1씩을 해주거나 배열을 N+1크기로 선언해 주어야 한다.

code

import java.util.*;
class Location{
    int y;
    int x;
    Location(int y, int x){
        this.y = y;
        this.x = x;
    }
}

class Solution
{
    static int wc = 0;
    static int bc = 0;

	public static void main(String args[]) throws Exception
	{
		Scanner sc = new Scanner(System.in);
        StringBuffer sb = new StringBuffer();


        int T = Integer.parseInt(sc.nextLine());
        for(int tc=1; tc<=T; tc++){
            sb.append("#").append(tc).append(" ");

            wc = 0;
            bc = 0;
            int N = sc.nextInt();
            int M = sc.nextInt();

            int map[][] = new int[N+1][N+1];


            init(map,N);

      
            for(int i=0; i<M; i++){
                int y = sc.nextInt();
                int x = sc.nextInt();
                int c = sc.nextInt();

                placeStone(map, N, y, x, c);
               
            }
            sb.append(bc).append(" ").append(wc).append("\n");
        }
        System.out.println(sb);
	}
    static void init(int map[][], int N){
        //흑돌 1, 백돌 2
        map[N/2][N/2] = 2;
        map[N/2+1][N/2+1] = 2;
        wc += 2;

        map[N/2][N/2+1] = 1;
        map[N/2+1][N/2] = 1;
        bc += 2;
    }
    static void placeStone(int map[][], int N, int y, int x, int c){
       
       
        //위, 아래, 왼쪽, 오른쪽, 위 왼쪽 대각선, 위 오른쪽 대각선, 아래 왼쪽 대각선, 아래 오른쪽 대각선
        int dy[] = {-1,1,0,0,-1,-1,1,1};
        int dx[] = {0,0,-1,1,-1,1,-1,1};
        for(int i=0; i<8; i++){
             Queue<Location> queue = new LinkedList<>();
            int ny = y + dy[i];
            int nx = x + dx[i];

            while(!isOutOfArray(ny, nx, N)){
                if(map[ny][nx] == c){
                    checkMap(queue, map, c);
                    break;
                }else if(map[ny][nx] != 0){
                    queue.add(new Location(ny,nx));
                }else{
                    break;
                }
                ny += dy[i];
                nx += dx[i];
            }
            
        }
        map[y][x] = c;
        if(c == 1){
            bc++;
        }else{
            wc++;
        }
    }
    static boolean isOutOfArray(int y, int x, int N){
        if(y <= 0 || x <= 0 || y > N || x > N)
            return true;
        return false;
    }
    
    static void checkMap(Queue<Location> queue, int map[][], int c){
        while(!queue.isEmpty()){
            Location loc = queue.poll();
            map[loc.y][loc.x] = c;
            if(c == 1){
                bc++;
                wc--;
            }else{
                bc--;
                wc++;
            }
        }
    }
}
profile
공부하고 알게 된 내용을 기록하는 블로그

0개의 댓글