[SWEA] 6109. 추억의 2048게임 D4 - Simulation
제출일 : 2019-11-03
문제 풀이 시간 : 1H 30M
난이도 : ★★★
Problem
link : https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWbrg9uabZsDFAWQ
Input
각 테스트 케이스의 첫 번째 줄에는 하나의 정수 N(1≤N≤20)과 하나의 문자열 S가 공백 하나로 구분되어 주어진다.
S는 “left”, “right”, “up”, “down”의 넷 중 하나이며 각각 타일들을 왼쪽, 오른쪽, 위쪽, 아래쪽으로 이동시키겠다는 뜻이다.
다음 N개의 줄의 i번째 줄에는 N개의 정수가 공백 하나로 구분되어 주어진다.
이 정수들은 0이거나 2이상 1024이하의 2의 제곱수들이다.
i번째 줄의 j번째 정수는 격자의 위에서 i번째 줄의 왼쪽에서 j번째에 있는 칸에 있는 타일에 어떤 정수가 적혀 있는지 나타내며,
0이면 이 칸에 타일이 없음을 의미한다.
Output
각 테스트 케이스마다 ‘#t’(t는 테스트케이스 번호를 의미하며 1부터 시작한다)를 출력하고 한 줄을 띄운 후,
N줄에 걸쳐 격자의 어떤 위치에 어떤 숫자가 적힌 타일이 있는지 입력 형식과 같은 형식으로 출력한다.
Example
input
2
5 up
4 8 2 4 0
4 4 2 0 8
8 0 2 4 4
2 2 2 2 8
0 2 2 0 0
2 down
16 2
0 2
output
#1
8 8 4 8 8
8 4 4 2 4
2 4 2 0 8
0 0 0 0 0
0 0 0 0 0
#2
0 0
16 4
Solution & Inpression
시뮬레이션 문제
차근차근 구현하면 되는 문제......
Code
언어 : JAVA
메모리 : 73,768 kb
실행시간 : 363 ms
import java.io.FileInputStream;
import java.util.Scanner;
public class Solution {
public static void main(String[] args) throws Exception {
System.setIn(new FileInputStream("res/input.txt"));
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for (int tc = 1; tc <= T; tc++) {
int N = sc.nextInt();
String cmd = sc.next();
int[][] in = new int[N][N];
int[][] out = new int[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
in[i][j] = sc.nextInt();
}
}
switch (cmd) {
case "up":
for (int j = 0; j < N; j++) { // 열 우선 탐색
for (int i = 0; i < N - 1; i++) { // 위부터 아래로
if (in[i][j] == 0) // 현재 값이 0이면 패스
continue;
int idx = i + 1;
while (in[idx][j] == 0) { // 비교할 값이 0이면 다음값
if (idx == N - 1) // 끝까지 탐색
break;
idx++;
}
if (in[idx][j] == 0) // 비교할 값이 0이면 패스
continue;
if (in[i][j] == in[idx][j]) { // 합치고 지우고
in[i][j] += in[i][j];
in[idx][j] = 0;
i = idx;
}
}
int cur = 0;
for (int i = 0; i < N; i++) { // 결과 입력
if (in[i][j] != 0) {
out[cur++][j] = in[i][j];
}
}
}
break;
case "down":
for (int j = 0; j < N; j++) { // 열 우선 탐색
for (int i = N - 1; i > 0; i--) { // 아래부터 위
if (in[i][j] == 0) // 현재 값이 0이면 패스
continue;
int idx = i - 1;
while (in[idx][j] == 0) { // 비교할 값이 0이면 다음값
if (idx == 0) // 끝까지 탐색
break;
idx--;
}
if (in[idx][j] == 0) // 비교할 값이 0이면 패스
continue;
if (in[i][j] == in[idx][j]) { // 합치고 지우고
in[i][j] += in[i][j];
in[idx][j] = 0;
i = idx;
}
}
int cur = N - 1;
for (int i = N - 1; i >= 0; i--) { // 결과 입력
if (in[i][j] != 0) {
out[cur--][j] = in[i][j];
}
}
}
break;
case "left":
for (int i = 0; i < N; i++) { // 행우선 탐색
for (int j = 0; j < N - 1; j++) { // 왼쪽부터 오른쪽으로
if (in[i][j] == 0) // 현재 값이 0이면 패스
continue;
int idx = j + 1;
while (in[i][idx] == 0) { // 비교할 값이 0이면 다음값
if (idx == N - 1) // 끝까지 탐색
break;
idx++;
}
if (in[i][idx] == 0) // 비교할 값이 0이면 패스
continue;
if (in[i][j] == in[i][idx]) { // 합치고 지우고
in[i][j] += in[i][j];
in[i][idx] = 0;
j = idx;
}
}
int cur = 0;
for (int j = 0; j < N; j++) { // 결과 입력
if (in[i][j] != 0) {
out[i][cur++] = in[i][j];
}
}
}
break;
case "right":
for (int i = 0; i < N; i++) { // 행우선 탐색
for (int j = N-1; j > 0; j--) { // 오른쪽 부터 왼쪽으로
if (in[i][j] == 0) // 현재 값이 0이면 패스
continue;
int idx = j - 1;
while (in[i][idx] == 0) { // 비교할 값이 0이면 다음값
if (idx == 0) // 끝까지 탐색
break;
idx--;
}
if (in[i][idx] == 0) // 비교할 값이 0이면 패스
continue;
if (in[i][j] == in[i][idx]) { // 합치고 지우고
in[i][j] += in[i][j];
in[i][idx] = 0;
j = idx;
}
}
int cur = N-1;
for (int j = N-1; j >=0 ; j--) { // 결과 입력
if (in[i][j] != 0) {
out[i][cur--] = in[i][j];
}
}
}
break;
}
System.out.println("#" + tc);
for (int[] is : out) {
for (int i : is) {
System.out.print(i + " ");
}
System.out.println();
}
} // end of TC
}// end of Main
}
'Problem > SWEA' 카테고리의 다른 글
[SWEA] 2117. 홈 방범 서비스 - Simulation (0) | 2019.11.12 |
---|---|
[SWEA] 5658. 보물상자 비밀번호 - Simulation (0) | 2019.11.03 |
[SWEA] 5431. 민석이의 과제 체크하기 D3 (0) | 2019.10.19 |
[SWEA] 1208. Flatten D3 (0) | 2019.10.19 |
[SWEA] 1204. 최빈수 구하기 D2 (0) | 2019.10.19 |