반응형
[광고 누르면 오늘의 행운 상승!!]
문제의 저작관은 SW Expert Academy에 있습니다.
1. 참고사항
백준의 2048(EASY)와 유사하지만 더 쉬운 문제다.
백준 2048(EASY)는 중복순열과 Dequeue를 이용하여 풀렸지만
이 문제는 Dequeue만을 이용해도 쉽게 풀린다.
2. 풀이
1. 방향을 dir배열에 숫자로 치환하여 저장한다.
2. Dequeue를 이용하여 맵의 각 요소를 방향에 맞게 이동시킨 후 벽을 만나면 방향에 맞게
앞 or 뒤에 저장한다.
3. 오른쪽, 왼쪽은 가로 dequeue에 저장하고 위, 아래는 세로 dequeue에 저장한다.
4. dequeue에서 값을 빼면서 다음과 같은 행동을 수행한다.
- 값을 넣을 곳이 0일 때 : 값을 넣음
- 값을 넣을 곳이 자신과 같은 값일 때 : 자신과 더해준다. (더하기)
- 값을 넣을 곳이 자신과 다른 값일 때 : 카운트를 증가시키고 카운트만큼 이동한 위치에 값을 저장한다.(밀기)
5. 변화된 map을 출력한다.
package Study5;
import java.io.*;
import java.util.*;
class Position{
int row, col,value;
public Position(int row, int col,int value) {
this.row = row;
this.col = col;
this.value = value;
}
}
public class game2048 {
public static final int[] dx = {-1,0,1,0};
public static final int[] dy = {0,1,0,-1};
public static int T,N,ans,dir;
public static int[][] map;
public static void main(String[] args) throws Exception {
System.setIn(new FileInputStream("test.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
T = Integer.parseInt(st.nextToken());
for (int tc = 1; tc <= T; tc++) {
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
switch(st.nextToken()) {
case "up": dir = 0;break;
case "down": dir = 2;break;
case "left": dir = 3;break;
case "right":dir = 1;break;
}
map = new int[N][N];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
go();
System.out.println("#" + tc);
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
System.out.print(map[i][j] + " ");
}
System.out.println();
}
}
}
public static void go() {
ArrayList<Deque<Position>> list = new ArrayList<>();
for (int i = 0; i < N; i++) {
list.add(new LinkedList<>());
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
int nx=i,ny=j;
if(map[i][j] == 0) continue;
while(true) {
nx += dx[dir];
ny += dy[dir];
if(nx<0 || nx >=N || ny<0 || ny>=N) {
nx -= dx[dir];
ny -= dy[dir];
if (dir == 0){
list.get(j).add(new Position(nx,ny,map[i][j]));
}else if (dir == 1){
list.get(i).push(new Position(nx,ny,map[i][j]));
}else if (dir == 2){
list.get(j).push(new Position(nx,ny,map[i][j]));
}else if (dir == 3){
list.get(i).add(new Position(nx,ny,map[i][j]));
}
map[i][j] = 0;
break;
}
}
}
}
for (int i = 0; i < N; i++) {
int cnt = 0;
while(!list.get(i).isEmpty()) {
Position pos = list.get(i).poll();
int nxq = pos.row + dx[(dir+2)%4]*cnt;
int nyq = pos.col + dy[(dir+2)%4]*cnt;
if(map[nxq][nyq] == 0) {
//map이 0이라면 값을 채운다.
map[nxq][nyq] = pos.value;
}else if(map[nxq][nyq] == pos.value){
//map에 숫자가 있는데 나와 같다면 더하고 cnt를 증가시킨다.
map[nxq][nyq] += pos.value;
cnt++;
}else {
//map에 숫자가 있는데 나와 다르다면 cnt를 증가시키고 map에 저장한다.
cnt++;
nxq = pos.row + dx[(dir+2)%4]*cnt;
nyq = pos.col + dy[(dir+2)%4]*cnt;
map[nxq][nyq] = pos.value;
}
}
}
}
}
반응형
'2. 알고리즘사이트 > 2. Swea' 카테고리의 다른 글
등산로 조성 [SWEA 1949][JAVA][모의 SW역량 테스트][DFS] (0) | 2020.05.01 |
---|---|
보물상자 비밀번호 [SWEA 5658][JAVA][모의 SW 역량테스트] (0) | 2020.04.29 |
재관이의 대량 할인 [SWEA 4050][JAVA] (0) | 2020.04.29 |
프로세서연결하기 [SWEA 1767][JAVA][SW Test 샘플문제] (0) | 2020.04.27 |
파핑파핑 지뢰찾기 [SWEA 1868][JAVA][D4] (0) | 2020.03.16 |