공부공간

BOJ - 17837 ) 새로운게임 2 본문

알고리즘/구현,시뮬

BOJ - 17837 ) 새로운게임 2

개발자가될수있을까? 2020. 10. 16. 16:41

 

 


www.acmicpc.net/problem/17837

17837번: 새로운 게임 2

재현이는 주변을 살펴보던 중 체스판과 말을 이용해서 새로운 게임을 만들기로 했다. 새로운 게임은 크기가 N×N인 체스판에서 진행되고, 사용하는 말의 개수는 K개이다. 말은 원판모양이고, 하�

www.acmicpc.net


3 가지를 나누어서 생각해보면, 움직이는 다음 좌표가 흰색인경우

잠깐 TEMP 리스트에 담고 진행한다.

 

빨간색인경우 TEMP 리스트를 뒤집고 진행한다.

 

파랑색인경우, 또 3가지로 나뉜다.

파랑 -> 흰 이면 현재값만 방향을 바꾸어주고 흰색처리

파랑 -> 빨 이면 현재값만 방향을 바꾸어주고 빨강색처리

파->파이면 이동하지 않는다.

 

매턴중간에 4개가 쌓였는지 체크하기위해 좌표를 가지고다닌다.


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

public class 새로운게임2 {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int n = Integer.parseInt(st.nextToken());
		int k = Integer.parseInt(st.nextToken());
		int map[][] = new int[n+1][n+1];
		ArrayList<Integer> posmap[][] = new ArrayList[n+1][n+1];
		for(int i=1; i<= n ;i++) {
			st = new StringTokenizer(br.readLine());
			for(int j=1; j<=n; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
				posmap[i][j] = new ArrayList<>();
			}
		}
		int kpos[][] = new int[k+1][5];
		int dir[][] = {{0,0},{0,1},{0,-1},{-1,0},{1,0}};
		for(int i=1; i<=k;i++) {
			st = new StringTokenizer(br.readLine());
			kpos[i][0] =Integer.parseInt(st.nextToken()) ; // y
			kpos[i][1] =Integer.parseInt(st.nextToken()) ; // x
			kpos[i][2] =Integer.parseInt(st.nextToken()) ; // d
			kpos[i][3] =i ; // 몇번째
			kpos[i][4] =0;  // index
			posmap[kpos[i][0]][kpos[i][1]].add(i);
		}
		// 말이 k 개 쌓이면 종료
		int answer = -1;
		top :
		for(int i=1 ; i<=1000 ; i++) {
			for(int j=1;j<=k;j++) {
				int y = kpos[j][0];
				int x = kpos[j][1];
				int d = kpos[j][2];
				int index = kpos[j][4];
				int ny = y + dir[d][0];
				int nx = x + dir[d][1];
				if( isrange(ny,nx,n) && map[ny][nx] == 0) {
					ArrayList<Integer> temp = new ArrayList<>();
					for(int ii= index ; ii < posmap[y][x].size() ; ii++) {
						temp.add(posmap[y][x].get(ii));
						posmap[y][x].remove(index);
						ii--;
					}
					// temp를 ny , nx에 add 하면서 kpos update
					for(int ii=0; ii < temp.size() ;ii++) {
						int now = temp.get(ii);
						posmap[ny][nx].add(now);
						kpos[now][0] = ny;
						kpos[now][1] = nx;
						kpos[now][4] = posmap[ny][nx].size()-1;
					}
				} else if( isrange(ny,nx,n) && map[ny][nx] == 1) {
					
					ArrayList<Integer> temp = new ArrayList<>();
					for(int ii= index ; ii < posmap[y][x].size() ; ii++) {
						temp.add(posmap[y][x].get(ii));
						posmap[y][x].remove(index);
						ii--;
					}
					// temp를 ny , nx에 add 하면서 kpos update
					for(int ii=temp.size()-1; ii >=0  ;ii--) {
						int now = temp.get(ii);
						posmap[ny][nx].add(now);
						kpos[now][0] = ny;
						kpos[now][1] = nx;
						kpos[now][4] = posmap[ny][nx].size()-1;
					}
				} else {
					// blue
					if(d==1) d=2;
					else if(d==2) d=1;
					else if(d==3) d=4;
					else if(d==4) d=3;
					ny = y + dir[d][0];
					nx = x + dir[d][1];
					if(!isrange(ny, nx, n) || map[ny][nx]==2) {
						kpos[j][2]=d;
					} else {
						if(map[ny][nx]==0) {
							ArrayList<Integer> temp = new ArrayList<>();
							for(int ii= index ; ii < posmap[y][x].size() ; ii++) {
								temp.add(posmap[y][x].get(ii));
								posmap[y][x].remove(index);
								ii--;
							}
							for(int ii=0; ii < temp.size() ;ii++) {
								int now = temp.get(ii);
								posmap[ny][nx].add(now);
								kpos[now][0] = ny;
								kpos[now][1] = nx;
								kpos[now][4] = posmap[ny][nx].size()-1;
							}
							kpos[j][2] = d;
						} else if(map[ny][nx]==1) {
							ArrayList<Integer> temp = new ArrayList<>();
							for(int ii= index ; ii < posmap[y][x].size() ; ii++) {
								temp.add(posmap[y][x].get(ii));
								posmap[y][x].remove(index);
								ii--;
							}
							for(int ii=temp.size()-1; ii >=0  ;ii--) {
								int now = temp.get(ii);
								posmap[ny][nx].add(now);
								kpos[now][0] = ny;
								kpos[now][1] = nx;
								kpos[now][4] = posmap[ny][nx].size()-1;
							}
							kpos[j][2] = d;
						}
					}
				}
				
				
				
				if(posmap[kpos[j][0]][kpos[j][1]].size() >=4) {
					answer =i;
					break top;
				}
			}
		}System.out.println(answer);
		
	}

	private static boolean isrange(int ny, int nx, int n) {
		
		return ny>=1&&nx>=1&&ny<=n&&nx<=n;
	}

}

 

K개 쌓이는 줄알고 풀다가 4개이상만 되면 끝내주면된다.

 
+2021.01.07) 제목정정 17831->17837 장장쓰님감사합니다

'알고리즘 > 구현,시뮬' 카테고리의 다른 글

BOJ - 18870 ) 좌표압축  (0) 2020.11.24
BOJ - 14719 ) 빗물  (0) 2020.10.26
BOJ - 17140 ) 이차원 배열과 연산  (1) 2020.09.14
BOJ - 14499 ) 주사위 굴리기  (0) 2020.09.07
프로그래머스 ) 블록게임  (0) 2020.09.07
Comments