티스토리 뷰

반응형


#. Problem

* The copyright in this matter is in BOJ




#. Resolution Process

  1. Read and understand problem

  2. Redefine the problem + abstract

  3. Create solution plan (select Algorithm, Data structure)

  4. Prove the plan (check performance time and usage memory)

  5. Carry out the plan

  6. Look back on the plan and find a way to improve it


#. Solve


추억의(?) 2048 문제


각 방향별로의 동작을 구현하지 않고

단순하게 회전으로 방향을 right로 맞춰준 후 숫자들을 밀어주었다.

단, 마지막에 다시 원래 방향으로 돌려줘야한다는 것 !!


#. Code


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
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class BOJ12208 {
 
    static int N, map[][];
    static int dir;
 
    public static void main(String[] args) throws IOException {
 
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
 
        int T = Integer.parseInt(br.readLine());
        for (int tc = 1; tc <= T; tc++) {
 
            st = new StringTokenizer(br.readLine());
            N = Integer.parseInt(st.nextToken());
            map = new int[N][N];
            String d = st.nextToken();
            // right, up, left, down;
            if (d.equals("right"))
                dir = 0;
            else if (d.equals("up"))
                dir = 1;
            else if (d.equals("left"))
                dir = 2;
            else
                dir = 3;
            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());
                }
            }
 
            process();
 
            System.out.println("Case #" + tc + ":");
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < N; j++) {
                    System.out.print(map[i][j] + " ");
                }
                System.out.println();
            }
        }
    }
 
    private static void process() {
 
        for (int i = 0; i < dir; i++)
            rotate90();
 
        start();
        if (dir != 0) {
            for (int i = 0; i < 4 - dir; i++) {
                rotate90();
            }
        }
    }
 
    private static void start() {
 
        for (int i = 0; i < N; i++) {
            // 당기기
            poll(i);
            // 합치기
            for (int j = N - 1; j > 0; j--) {
                if (map[i][j] == map[i][j - 1]) {
                    map[i][j] = map[i][j] * 2;
                    map[i][j - 1= 0;
                }
            }
            // 당기기
            poll(i);
        }
 
    }
 
    private static void poll(int i) {
        
        for (int j = N - 1; j > 0; j--) {
            if(map[i][j] == 0) {
                int idx = j - 1;
                while(idx > 0 && map[i][idx] == 0) {
                    idx--;
                }
                map[i][j] = map[i][idx];
                map[i][idx] = 0;
            }
        }
        
    }
 
    private static void rotate90() {
 
        int[][] tmpMap = new int[N][N];
        // 배열 복사
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                tmpMap[i][j] = map[i][j];
            }
        }
        // 회전
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                map[j][N - 1 - i] = tmpMap[i][j];
            }
        }
    }
 
}
 
cs


반응형
댓글
최근에 올라온 글
최근에 달린 댓글
링크
Total
Today
Yesterday