문제에서 주어진 대로 그대로 짜면 된다.
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크기로 선언해 주어야 한다.
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++;
}
}
}
}