본문 바로가기

Notice
Recent Posts
Recent Comments
«   2024/12   »
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 31
Tags
더보기
Archives
관리 메뉴

6109. 추억의 2048 게임 (D4) 본문

알고리즘 문제풀기/SW Expert Academy

6109. 추억의 2048 게임 (D4)

알광(Algwang) 2018. 11. 30. 17:14

문제 링크 : https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWbrg9uabZsDFAWQ&categoryId=AWbrg9uabZsDFAWQ&categoryType=CODE


2048 게임을 몇 번만에 풀수 있는지 혹은 풀 수 있는지 없는지를 물어보는 문제가 아닌 단순히 주어지는 방향으로 한 번 시행했을 때의 결과를 출력하는 문제이다.

기본적인 방법은 UP의 경우 위에서부터 아래로 내려가면서, DOWN의 경우 아래에서 위로 올라가면서 확인을 한다.

우선, 방향이 문자열로 들어온다. 생각한 방법은 2가지이다.
1. 문자열 그대로 받은 후 strcmp를 통한 비교
2. up / left / right / down 이므로 문자열의 첫번째 글자만 비교
편의상 2번 방법을 사용하여 방향을 int 형으로 바꿔준다.

이제 사용한 방법에 대해 알아보자. UP을 예로 들어서 보면, 각 열의 제일 윗 칸부터 확인한다.
이전에 나온 0이 아닌 값을 저장하기 위해 temp를 사용한다. 이 때, 나올 수 있는 경우의 수는 4가지이다.

1-1. temp가 0이고 새로 나온 칸이 0이 아닌 경우
1-2. temp가 0이고 새로 나온 칸이 0인 경우
1-3. temp가 0이 아니고 temp와 새로 나온 칸이 같은 경우
1-4. temp가 0이 아니고 temp와 새로 나온 칸이 다른 경우

1,2번 방법은 temp가 0일 경우 새로 나온 칸의 값을 받는 것으로 한번에 해결이 가능하다. 즉, 2번의 경우를 그냥 지나칠 수 있게 된다.
이제 3,4번 경우를 생각해보자. 3번의 경우는 합쳐질 수 있는 경우에 속하므로 temp*2를 해서 새로운 맵에 넣어준다. 그리고 이미 합쳐졌으므로 이전 값을 저장할 필요가 없어지기 때문에 temp를 0으로 초기화해준다.
4번은 temp와 새로 나온 칸의 값이 다르므로 temp를 새로운 맵에 넣어주고 새로 나온 값을 temp로 한다. 단, 주의할 점은 새로 나온 칸이 0일 수도 있기 때문에 이 경우 그냥 지나치는 처리를 해줘야 한다.

마지막으로 예외처리가 필요한 부분은 끝 칸에 도달했을 경우이다.
끝 칸에 도달했을 경우의 수는 3가지로 나뉜다.

2-1. 마지막 칸과 합쳐야하는 경우
2-2. 마지막 칸을 합치지 않고 집어넣는 경우
2-3. 마지막 칸이 0인 경우

이 3가지 경우의 수를 한번에 해결이 가능하다. 최종적으로 남은 temp를 새로운 맵에 넣어주면 되는 것이다. 2-1은 1-3의 과정을 거치고 temp는 0이 된다. temp를 0으로 초기화해준 이유이다. 2-3은 1-1과 1-4에 의해 역시 temp가 0이 된다. 마지막으로 2-2는 1,2와 1-4에 의해 temp에 마지막 칸-의 값이 들어가게 된다. 따라서 마지막 칸의 값이 정상적으로 들어가게 된다.

- 소스코드 -


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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
#define _CRT_SECURE_NO_WARNINGS
 
#include<iostream>
 
using namespace std;
 
int main() {
    ios_base :: sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    int T;
    cin >> T;
    for (int test_case = 1; test_case <= T; test_case++) {
        int N, direc;
        char direction[6];
        cin >> N >> direction;
        int map[21][21= { 0 };
        int new_map[21][21= { 0 };
        //#1 strcmp를 통해 direction을 비교한다.
        
        /*if (!strcmp(direction,"down")) {
        }*/
 
        //////////////////////////////////////////
        //#2 direction[0]만을 비교한다 ( U, D, L, R )
        
        if (direction[0== 'u') {
            direc = 0;
        }
        else if (direction[0== 'd') {
            direc = 1;
        }
        else if (direction[0== 'l') {
            direc = 2;
        }
        else {
            direc = 3;
        }
        //////////////////////////////////////////
 
        for (int i = 0; i < N; ++i) {
            for (int j = 0; j < N; ++j) {
                cin >> map[i][j];
            }
        }
        switch (direc) {
        case 0:
            for (int j = 0; j < N; j++) {
                int temp = 0;
                int index = 0;
                for (int i = 0; i < N; i++) {
                    if (temp == 0) {
                        temp = map[i][j];
                    }
                    else if (temp == map[i][j]) {
                        new_map[index][j] = temp * 2;
                        index++;
                        temp = 0;
                    }
                    else {
                        if (map[i][j] == 0) {
                        }
                        else {
                            new_map[index][j] = temp;
                            index++;
                            temp = map[i][j];
                        }
                    }
                    if (i == N - 1) {
                        new_map[index][j] = temp;
                    }
                }
            }
            break;
        case 1:
            for (int j = 0; j < N; j++) {
                int temp = 0;
                int index = N-1;
                for (int i = N-1; i >= 0; i--) {
                    if (temp == 0) {
                        temp = map[i][j];
                    }
                    else if (temp == map[i][j]) {
                        new_map[index][j] = temp * 2;
                        index--;
                        temp = 0;
                    }
                    else {
                        if (map[i][j] == 0) {
                        }
                        else {
                            new_map[index][j] = temp;
                            index--;
                            temp = map[i][j];
                        }
                    }
                    if (i == 0) {
                        new_map[index][j] = temp;
                    }
                }
            }
            break;
        case 2:
            for (int i = 0; i < N; i++) {
                int temp = 0;
                int index = 0;
                for (int j = 0; j < N; j++) {
                    if (temp == 0) {
                        temp = map[i][j];
                    }
                    else if (temp == map[i][j]) {
                        new_map[i][index] = temp * 2;
                        index++;
                        temp = 0;
                    }
                    else {
                        if (map[i][j] == 0) {
                        }
                        else {
                            new_map[i][index] = temp;
                            index++;
                            temp = map[i][j];
                        }
                    }
                    if (j == N - 1) {
                        new_map[i][index] = temp;
                    }
                }
            }
            break;
        case 3:
            for (int i = 0; i < N; i++) {
                int temp = 0;
                int index = N - 1;
                for (int j = N - 1; j >= 0; j--) {
                    if (temp == 0) {
                        temp = map[i][j];
                    }
                    else if (temp == map[i][j]) {
                        new_map[i][index] = temp * 2;
                        index--;
                        temp = 0;
                    }
                    else {
                        if (map[i][j] == 0) {
                        }
                        else {
                            new_map[i][index] = temp;
                            index--;
                            temp = map[i][j];
                        }
                    }
                    if (j == 0) {
                        new_map[i][index] = temp;
                    }
                }
            }
            break;
        deafult:
            break;
        }
        cout << "#" << test_case << "\n";
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                cout << new_map[i][j] << " ";
            }
            cout << "\n";
        }
    }
    
 
    return 0;
}
cs


Comments