Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- spring
- 다익스트라
- 백준
- COSPRO
- PS
- 알고리즘
- 엘라스틱서치
- java
- 백준코딩테스트
- 다이나믹프로그래밍
- 재귀함수
- dp
- DFS
- 자바PS
- 01BFS
- 완전탐색
- COSPROJAVA1급
- YBMCOS
- 구현
- QUICKSTARTGUIDE
- 취득후기
- 세그먼트트리
- 게더타운시작
- GatherTown
- 우선순위큐
- 시뮬레이션
- 네트워크플로우
- 이젠 골드구현도 어렵네..
- BFS
- deque
Archives
- Today
- Total
공부공간
BOJ - 17837 ) 새로운게임 2 본문




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;
}
}

+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