반응형

 

[광고 누르면 오늘의 행운 상승!!]

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWbrg9uabZsDFAWQ&categoryId=AWbrg9uabZsDFAWQ&categoryType=CODE&&&

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

문제의 저작관은 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;
				}	
			}
		}
	}
}
반응형

+ Recent posts