반응형

www.acmicpc.net/problem/5373

 

5373번: 큐빙

각 테스트 케이스에 대해서 큐브를 모두 돌린 후의 윗 면의 색상을 출력한다. 첫 번째 줄에는 뒷 면과 접하는 칸의 색을 출력하고, 두 번째, 세 번째 줄은 순서대로 출력하면 된다. 흰색은 w, 노란

www.acmicpc.net

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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
#include <iostream>
#define rep(i,n) for(int i=0;i<n;i++)
using namespace std;
enum {U, D, L, R, F, B};
char cube[6][3][3];
int t, n;
string cmd;
 
// 큐브 초기화
void init() {
    rep(i, 3) {
        rep(j, 3) {
            cube[U][i][j] = 'w';
            cube[D][i][j] = 'y';
            cube[L][i][j] = 'g';
            cube[R][i][j] = 'b';
            cube[F][i][j] = 'r';
            cube[B][i][j] = 'o';
        }
    }
}
 
// 큐브 출력
void print() {
    rep(i, 3) {
        rep(j, 3)
            cout << cube[U][i][j];
        cout << '\n';
    }
}
 
// 표면 회전
void rot(char surface, char dir) {
    char temp[3][3];
    int pos;
    if (surface == 'U')
        pos = U;
    else if (surface == 'F')
        pos = F;
    else if (surface == 'L')
        pos = L;
    else if (surface == 'B')
        pos = B;
    else if (surface == 'R')
        pos = R;
    else if (surface == 'D')
        pos = D;
    
    // 시계방향 회전
    if (dir == '+') {
        rep(i, 3) {
            temp[0][i] = cube[pos][2 - i][0];
            temp[2][i] = cube[pos][2 - i][2];
            temp[1][i] = cube[pos][2 - i][1];
        }
    }
    // 반시계방향 회전
    else {
        rep(i, 3) {
            temp[0][i] = cube[pos][i][2];
            temp[2][i] = cube[pos][i][0];
            temp[1][i] = cube[pos][i][1];
        }
    }
    rep(i, 3) {
        rep(j, 3)
            cube[pos][i][j] = temp[i][j];
    }
}
void func(string cmd) {
    char temp[3];
 
    // 표면 회전시킴
    rot(cmd[0], cmd[1]);
 
    // 윗면 시계방향일 때 인접한 면 회전
    if (cmd == "U+") {
        rep(i, 3)
            temp[i] = cube[F][0][i];
 
        rep(i, 3
            cube[F][0][i] = cube[R][0][i];
        rep(i, 3)
            cube[R][0][i] = cube[B][0][i];
        rep(i, 3)
            cube[B][0][i] = cube[L][0][i];
        rep(i, 3)
            cube[L][0][i] = temp[i];
    }
 
    // 윗면 반시계방향일 때 인접한 면 회전
    else if (cmd == "U-") {
        rep(i, 3)
            temp[i] = cube[F][0][i];
 
        rep(i, 3
            cube[F][0][i] = cube[L][0][i];
        rep(i, 3)
            cube[L][0][i] = cube[B][0][i];
        rep(i, 3)
            cube[B][0][i] = cube[R][0][i];
        rep(i, 3)
            cube[R][0][i] = temp[i];
    }
 
    // 아랫면 시계방향일 때 인접한 면 회전
    else if (cmd == "D+") {
        rep(i, 3)
            temp[i] = cube[F][2][i];
 
        rep(i, 3
            cube[F][2][i] = cube[L][2][i];
        rep(i, 3)
            cube[L][2][i] = cube[B][2][i];
        rep(i, 3)
            cube[B][2][i] = cube[R][2][i];
        rep(i, 3)
            cube[R][2][i] = temp[i];
    }
    // 아랫면 반시계방향일 때 인접한 면 회전
    else if (cmd == "D-") {
        rep(i, 3)
            temp[i] = cube[F][2][i];
 
        rep(i, 3)
            cube[F][2][i] = cube[R][2][i];
        rep(i, 3)
            cube[R][2][i] = cube[B][2][i];
        rep(i, 3)
            cube[B][2][i] = cube[L][2][i];
        rep(i, 3)
            cube[L][2][i] = temp[i];
    }
 
    // 왼쪽 시계방향일 때 인접한 면 회전
    else if (cmd == "L+") {
        rep(i, 3)
            temp[i] = cube[U][i][0];
 
        rep(i, 3
            cube[U][i][0= cube[B][2-i][2];
        rep(i, 3)
            cube[B][i][2= cube[D][2-i][0];
        rep(i, 3)
            cube[D][i][0= cube[F][i][0];
        rep(i, 3)
            cube[F][i][0= temp[i];
    }
 
    // 왼쪽 반시계방향일 때 인접한 면 회전
    else if (cmd == "L-") {
        rep(i, 3)
            temp[i] = cube[U][i][0];
 
        rep(i, 3
            cube[U][i][0= cube[F][i][0];
        rep(i, 3)
            cube[F][i][0= cube[D][i][0];
        rep(i, 3)
            cube[D][i][0= cube[B][2-i][2];
        rep(i, 3)
            cube[B][i][2= temp[2-i];
    }
 
    // 오른쪽 시계방향일 때 인접한 면 회전
    else if (cmd == "R+") {
        rep(i, 3)
            temp[i] = cube[U][i][2];
 
        rep(i, 3
            cube[U][i][2= cube[F][i][2];
        rep(i, 3)
            cube[F][i][2= cube[D][i][2];
        rep(i, 3)
            cube[D][i][2= cube[B][2-i][0];
        rep(i, 3)
            cube[B][i][0= temp[2-i];
    }
 
    // 오른쪽 반시계방향일 때 인접한 면 회전
    else if (cmd == "R-") {
        rep(i, 3)
            temp[i] = cube[U][i][2];
 
        rep(i, 3
            cube[U][i][2= cube[B][2-i][0];
        rep(i, 3)
            cube[B][i][0= cube[D][2-i][2];
        rep(i, 3)
            cube[D][i][2= cube[F][i][2];
        rep(i, 3)
            cube[F][i][2= temp[i];
        
    }
 
    // 앞면 시계방향일 때 인접한 면 회전
    else if (cmd == "F+") {
        rep(i, 3)
            temp[i] = cube[U][2][i];
 
        rep(i, 3
            cube[U][2][i] = cube[L][2-i][2];
        rep(i, 3)
            cube[L][i][2= cube[D][0][i];
        rep(i, 3)
            cube[D][0][i] = cube[R][2-i][0];
        rep(i, 3)
            cube[R][i][0= temp[i];
        
    }
 
    // 앞면 반시계방향일 때 인접한 면 회전
    else if (cmd == "F-") {
        rep(i, 3)
            temp[i] = cube[U][2][i];
 
        rep(i, 3
            cube[U][2][i] = cube[R][i][0];
        rep(i, 3)
            cube[R][i][0= cube[D][0][2-i];
        rep(i, 3)
            cube[D][0][i] = cube[L][i][2];
        rep(i, 3)
            cube[L][i][2= temp[2-i];
    }
 
    // 뒷면 시계방향일 때 인접한 면 회전
    else if (cmd == "B+") {
        rep(i, 3)
            temp[i] = cube[U][0][i];
 
        rep(i, 3)
            cube[U][0][i] = cube[R][i][2];
        rep(i, 3)
            cube[R][i][2= cube[D][2][2-i];
        rep(i, 3)
            cube[D][2][i] = cube[L][i][0];
        rep(i, 3)
            cube[L][i][0= temp[2-i];
 
    }
 
    // 뒷면 반시계방향일 때 인접한 면 회전
    else if (cmd == "B-") {
        rep(i, 3)
            temp[i] = cube[U][0][i];
 
        rep(i, 3
            cube[U][0][i] = cube[L][2-i][0];
        rep(i, 3)
            cube[L][i][0= cube[D][2][i];
        rep(i, 3)
            cube[D][2][i] = cube[R][2-i][2];
        rep(i, 3)
            cube[R][i][2= temp[i];
    }
}
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> t;
    while (t--) {
        init();
        cin >> n;
        rep(i, n) {
            cin >> cmd;
            func(cmd);
        }
        print();
    }
}
cs
반응형

'백준 > 삼성기출' 카테고리의 다른 글

백준 17142  (0) 2021.08.04
백준 17143  (0) 2021.07.19
백준 16234  (0) 2021.04.30
백준 15683  (0) 2021.04.30
백준 13458  (0) 2021.04.29
반응형

www.acmicpc.net/problem/16234

 

16234번: 인구 이동

N×N크기의 땅이 있고, 땅은 1×1개의 칸으로 나누어져 있다. 각각의 땅에는 나라가 하나씩 존재하며, r행 c열에 있는 나라에는 A[r][c]명이 살고 있다. 인접한 나라 사이에는 국경선이 존재한다. 모

www.acmicpc.net

1
2
3
4
5
6
7
8
    bool flag = true;
    while (flag) {
        memset(visited, 0sizeof(visited));
        flag = bfs();
        if(flag)
            ans++;
    }
    cout << ans;
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    rep(k, 4) {
        int nx = x + dx[k];
        int ny = y + dy[k];
        if (nx < 0 || nx >= n || ny < 0 || ny >= n || visited[nx][ny]) continue;
        int gap = abs(arr[x][y] - arr[nx][ny]);        
        if (gap >= l && gap <= r) {    // 차이가 L 이상 R 이하이면
            visited[nx][ny] = 1;    // 방문처리
            q.push({ nx, ny });
            sum += arr[nx][ny];        // 인구수 더하기
            cnt++;                    // 연합 도시 숫자 추가
            v.push_back({ nx, ny });
        }
    }
}
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 연합 있으면
if (cnt > 1) {
    ret = true;
                    
    int tmp = sum / cnt;
    // 연합 도시 인구수 갱신
    for (pii p : v) {
        int px = p.first;
        int py = p.second;
        arr[px][py] = tmp;
    }
}
sum = 0;
cnt = 0;
v.clear();
cs

 

 

 

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
#include <iostream>
#include <cstring>
#include <queue>
#include <vector>
#define pii pair<intint>
#define rep(i,n) for(int i=0;i<n;i++)
using namespace std;
int n, l, r, arr[51][51], ans, sum, cnt;
int dx[] = { 010-1 };
int dy[] = { 10-10 };
bool visited[51][51];
queue<pii> q;
vector<pii> v;
bool bfs() {
    bool ret = false;
    rep(i, n) {
        rep(j, n) {
            if (!visited[i][j]) {
                visited[i][j] = 1;
                sum += arr[i][j];
                cnt++;
                v.push_back({ i,j });
                q.push({ i,j });
                while (!q.empty()) {
                    int x = q.front().first;
                    int y = q.front().second;
                    q.pop();
                    rep(k, 4) {
                        int nx = x + dx[k];
                        int ny = y + dy[k];
                        if (nx < 0 || nx >= n || ny < 0 || ny >= n || visited[nx][ny]) continue;
                        int gap = abs(arr[x][y] - arr[nx][ny]);        
                        if (gap >= l && gap <= r) {    // 차이가 L 이상 R 이하이면
                            visited[nx][ny] = 1;    // 방문처리
                            q.push({ nx, ny });
                            sum += arr[nx][ny];        // 인구수 더하기
                            cnt++;                    // 연합 도시 숫자 추가
                            v.push_back({ nx, ny });// 연합 도시 좌표 추가
                        }
                    }
                }
                // 연합 있으면
                if (cnt > 1) {
                    ret = true;
                    
                    int tmp = sum / cnt;
                    // 연합 도시 인구수 갱신
                    for (pii p : v) {
                        int px = p.first;
                        int py = p.second;
                        arr[px][py] = tmp;
                    }
                }
                sum = 0;
                cnt = 0;
                v.clear();
            }
        }
    }
    return ret;
}
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> l >> r;
    rep(i, n) {
        rep(j, n)
            cin >> arr[i][j];
    }
    bool flag = true;
    while (flag) {
        memset(visited, 0sizeof(visited));
        flag = bfs();
        if(flag)
            ans++;
    }
    cout << ans;
}
cs
반응형

'백준 > 삼성기출' 카테고리의 다른 글

백준 17143  (0) 2021.07.19
백준 5373 [복습필수]  (0) 2021.04.30
백준 15683  (0) 2021.04.30
백준 13458  (0) 2021.04.29
백준 3190  (0) 2021.04.29
반응형

www.acmicpc.net/problem/15683

 

15683번: 감시

스타트링크의 사무실은 1×1크기의 정사각형으로 나누어져 있는 N×M 크기의 직사각형으로 나타낼 수 있다. 사무실에는 총 K개의 CCTV가 설치되어져 있는데, CCTV는 5가지 종류가 있다. 각 CCTV가 감

www.acmicpc.net

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void dfs(int x, int y, int idx) {
    if (idx == cnt) {
        ans = min(ans, zeros());
        return;
    }
    int rotate = 4;
    int i = cctvs[idx].first;
    int j = cctvs[idx].second;
    int cctv = arr[i][j];
 
    if (cctv == -2)
        rotate = 2;
 
    else if (cctv == -5)
        rotate = 1;
 
    rep(k, rotate) {
        look(i, j, cctv, k, 1);
        visited[i][j] = 1;
        dfs(i, j, idx+1);
        visited[i][j] = 0;
        look(i, j, cctv, k, 0);
    }
}
cs

 

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
void look(int x, int y, int cctv, int direction, int cmd) {
    // direction: 0, 1, 2, 3
    if (cctv == -1) {
        lookDirection(x, y, direction, cmd);
    }
    // direction: 0, 1
    else if (cctv == -2) {
        lookDirection(x, y, direction, cmd);
        lookDirection(x, y, (direction+2)%4, cmd);
    }
 
    // direction: 0, 1, 2, 3
    else if (cctv == -3) {
        lookDirection(x, y, direction, cmd);
        lookDirection(x, y, (direction + 1) % 4, cmd);
    }
 
    // direction: 0, 1, 2, 3
    else if (cctv == -4) {
        lookDirection(x, y, direction, cmd);
        lookDirection(x, y, (direction + 1) % 4, cmd);
        lookDirection(x, y, (direction + 2) % 4, cmd);
    }
 
    // direction: 
    else if (cctv == -5) {
        lookDirection(x, y, 0, cmd);
        lookDirection(x, y, 1, cmd);
        lookDirection(x, y, 2, cmd);
        lookDirection(x, y, 3, cmd);
    }
}
cs

 

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
#include <iostream>
#include <algorithm>
#define pii pair<intint>
#define rep(i,n) for(int i=0;i<n;i++)
using namespace std;
int n, m, arr[9][9], temp, ans= 987654321;
pii cctvs[9];
int cnt;
bool visited[9][9];
void lookDirection(int x, int y, int direction, int cmd) {
    while (x >= 0 && x < n && y >= 0 && y < m) {
        if (arr[x][y] == -6break;
        if (arr[x][y] < 0) {
            if (direction == 0) y++;
            else if (direction == 1) x++;
            else if (direction == 2) y--;
            else if (direction == 3) x--;
            continue;
        }
        // 우
        if (direction == 0) {
            if (cmd)
                arr[x][y++]++;
            else
                arr[x][y++]--;
        }
        // 하
        else if (direction == 1) {
            if (cmd)
                arr[x++][y]++;
            else
                arr[x++][y]--;
        }
        // 좌
        else if (direction == 2) {
            if (cmd)
                arr[x][y--]++;
            else
                arr[x][y--]--;
        }
        // 상
        else if (direction == 3) {
            if (cmd)
                arr[x--][y]++;
            else
                arr[x--][y]--;
        }
    }
}
void look(int x, int y, int cctv, int direction, int cmd) {
    // direction: 0, 1, 2, 3
    if (cctv == -1) {
        lookDirection(x, y, direction, cmd);
    }
    // direction: 0, 1
    else if (cctv == -2) {
        lookDirection(x, y, direction, cmd);
        lookDirection(x, y, (direction+2)%4, cmd);
    }
 
    // direction: 0, 1, 2, 3
    else if (cctv == -3) {
        lookDirection(x, y, direction, cmd);
        lookDirection(x, y, (direction + 1) % 4, cmd);
    }
 
    // direction: 0, 1, 2, 3
    else if (cctv == -4) {
        lookDirection(x, y, direction, cmd);
        lookDirection(x, y, (direction + 1) % 4, cmd);
        lookDirection(x, y, (direction + 2) % 4, cmd);
    }
 
    // direction: 
    else if (cctv == -5) {
        lookDirection(x, y, 0, cmd);
        lookDirection(x, y, 1, cmd);
        lookDirection(x, y, 2, cmd);
        lookDirection(x, y, 3, cmd);
    }
}
int zeros() {
    int ret = 0;
    rep(i, n) {
        rep(j, m)
            if (arr[i][j] == 0) ret++;
    }
    return ret;
}
void dfs(int x, int y, int idx) {
    if (idx == cnt) {
        ans = min(ans, zeros());
        return;
    }
    int rotate = 4;
    int i = cctvs[idx].first;
    int j = cctvs[idx].second;
    int cctv = arr[i][j];
 
    if (cctv == -2)
        rotate = 2;
 
    else if (cctv == -5)
        rotate = 1;
 
    rep(k, rotate) {
        look(i, j, cctv, k, 1);
        visited[i][j] = 1;
        dfs(i, j, idx+1);
        visited[i][j] = 0;
        look(i, j, cctv, k, 0);
    }
}
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> m;
    rep(i, n) {
        rep(j, m) {
            cin >> temp;
            arr[i][j] = temp * -1;            // arr[i][j]: cctv가 감시 가능한 영역이면 + 1
            if(temp>=1&&temp<=5)            // cctv 번호, 벽과 겹칠 수 있으므로, (입력) * -1 해서 음수로 저장
                cctvs[cnt++= { i,j };
        }
    }
    dfs(000);
    cout << ans;
}
cs
반응형

'백준 > 삼성기출' 카테고리의 다른 글

백준 5373 [복습필수]  (0) 2021.04.30
백준 16234  (0) 2021.04.30
백준 13458  (0) 2021.04.29
백준 3190  (0) 2021.04.29
백준 13460  (0) 2021.03.07
반응형

www.acmicpc.net/problem/13458

 

13458번: 시험 감독

첫째 줄에 시험장의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 각 시험장에 있는 응시자의 수 Ai (1 ≤ Ai ≤ 1,000,000)가 주어진다. 셋째 줄에는 B와 C가 주어진다. (1 ≤ B, C ≤ 1,000,000)

www.acmicpc.net

 

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
#include <iostream>
#define ll long long
#define rep(i,n) for(int i=1;i<=n;i++)
using namespace std;
ll n, arr[1000001], b, c, ans;
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> n;
    rep(i, n)
        cin >> arr[i];
 
    cin >> b >> c;
    rep(i, n) {
        // 총 감독관
        arr[i] -= b;
        ans++;
 
        // 부 감독관
        if (arr[i] > 0) {
            ll temp = (arr[i] / c);
            arr[i] -= temp * c;
            ans += temp;
            if (arr[i] > 0)
                ans++;
        }
    }
    cout << ans;
}
cs
반응형

'백준 > 삼성기출' 카테고리의 다른 글

백준 16234  (0) 2021.04.30
백준 15683  (0) 2021.04.30
백준 3190  (0) 2021.04.29
백준 13460  (0) 2021.03.07
백준 12100 [복습 필수]  (0) 2021.03.03
반응형

www.acmicpc.net/problem/3190

 

3190번: 뱀

 'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임

www.acmicpc.net

 

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
#include <iostream>
#include <queue>
#define pii pair<intint>
#define rep(i,n) for(int i=1;i<=n;i++)
using namespace std;
int arr[101][101], n, k, a, b, l, x;
int dx[] = { 010-1 };
int dy[] = { 10-10 };
char c, turn[10001];
bool visited[101][101];
queue<pii> q;
void dfs(int x, int y, int direction, int sec) {
    // 종료 조건
    // 1. 벽에 부딪힘
    // 2. 자기 몸에 부딪힘
    if (x <= 0 || x > n || y <= 0 || y > n || visited[x][y]) {
        cout << sec;
        exit(0);
    }
 
    // 머리 방문
    visited[x][y] = 1;
    q.push({ x, y });
 
    // 사과 없으면 꼬리 줄이기
    if (!arr[x][y]) {
        int tx = q.front().first;
        int ty = q.front().second;
        q.pop();
        visited[tx][ty] = 0;
    }
 
    // 사과 한 번 먹으면 더 이상 못 먹음
    arr[x][y] = 0;    
 
    // 방향 전환
    int next_direction = direction;
    if (turn[sec] == 'L'
        next_direction = (direction + 3) % 4;
    else if(turn[sec] == 'D')
        next_direction = (direction + 1) % 4;
 
    // 머리 다음 위치
    int nx = x + dx[next_direction];
    int ny = y + dy[next_direction];
    dfs(nx, ny, next_direction, sec + 1);
}
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> k;
    rep(i, k) {
        cin >> a >> b;
        arr[a][b] = 1;
    }
    cin >> l;
    rep(i, l) {
        cin >> x >> c;
        turn[x] = c;
    }
    q.push({ 1,1 });
    visited[1][1= 1;
    dfs(1201);
}
cs
반응형

'백준 > 삼성기출' 카테고리의 다른 글

백준 15683  (0) 2021.04.30
백준 13458  (0) 2021.04.29
백준 13460  (0) 2021.03.07
백준 12100 [복습 필수]  (0) 2021.03.03
백준 20055  (0) 2021.02.23
반응형

[문제] 정렬 포함한 쿼리 실행 시 NPE 발생.

[원인] 검색 조건으로 전달받은 String 비교 시 '==' 사용

[해결] 문자열 비교는 '=='가 아닌, .equals() 사용

 

정렬 포함한 쿼리 실행 시 NPE 발생.

테스트 코드에서는 문제없이 잘 실행됐는데, 실제 API 호출할 때 NPE가 떠서 처음에는 EntityManager가 제대로 주입이 안돼서 그런줄 알았다. 테스트 코드에서는 EntityManager를 명시해줬는데,

CourseRepositoryImpl에서는 JPAQueryFactory만 명시하고 EntityManager는 따로 명시 안했기 때문이다.

따로 명시 안한 이유는

 

① 김영한님의 스프링 강의에서도 명시를 안했음

② 예전에 다른 개인 프로젝트 할 때도 명시 안했는데 잘 됐었음

③ SpringBoot, Spring Data JPA에서 알아서 찾아줄 거라고 생각했음

 

테스트 코드에서는 실행이 되는데, 실제 API를 호출했을 때는 NPE가 발생하니까 당연히 EntityManager 문제일 줄 알았는데, 몇 시간째 찾아봐도 도저히 고쳐지지 않았다. 그래서 에러 로그를 다시 살펴보니 orderBy 부분이 문제였다... 개 멍청한 짓 해서 시간만 날렸다...

아니 근데 솔직히 이거 생각 못한 이유가, 정렬하는 부분이 문제였으면 테스트 코드에서도 안돼야 하는거 아닌가??

 

뭐 어쨌든 문제 원인을 찾았으니 다행이다.

정렬 조건인 cond가 제대로 전달됐는지 확인하기 위한 코드 두 줄을 추가했다.

(원래 sout이 아니라 로그로 출력하는 것이 좋다고 하는데, 아직 로그 사용법을 잘 모르겠다.)

 

 

①-1 테스트 코드에서 cond = distance 실행 결과

테스트 코드에서는 검색 조건이 잘 전달되었고, 테스트도 성공했다.

 

① -1 테스트 코드에서 cond = null 실행 결과

cond = null 이면 courseRepository.searchCourses() 자체에서 NPE가 발생하기 때문에 테스트 코드 실행했을 때 에러가 뜨는 것이 맞는 것 같다.

 

② API 호출할 때 cond = distance 실행 결과

아니 분명히 cond = distance로 전달 잘 됐으면서 null이라고 한다. 테스트 코드랑 분명 똑같이 한건데 왜 안되는거지??

API request에서 parameter 전달할 때 잘못된건가???

그래서 혹시나 해서 검색 조건 처리하는 코드를 다시 살펴봤다.

아....! 문자열 비교인데 왜 '=='를 썼지??

그래서 == 대신 .equals()로 바꿔서 해봤다.

잘 나온다...

진짜 개 멍청한 실수였다... 이래서 기본기가 중요한가보다...

coding-factory.tistory.com/536

 

[Java] 문자열 비교하기 == , equals() 의 차이점

자바에서 일반적인 데이터 타입의 비교는 ==이라는 연산자를 사용하여 비교합니다. 하지만 String 문자열의 값을 비교할때에는 ==이 아닌 equals()라는 메소드를 사용하여 비교를 합니다. equals와 ==

coding-factory.tistory.com

 

반응형

'개발' 카테고리의 다른 글

gpx 를 이미지로 변환  (0) 2021.05.05
UserProfileDto NPE  (0) 2021.05.04
[연습] travis-ci  (0) 2021.04.27
[연습] springboot, rest api 서버, 카카오 소셜로그인, jwt  (0) 2021.04.26
캡스톤 메모  (0) 2021.04.02
반응형

travis-ci.org에 접속하니, 곧 서버가 종료된다고한다.

travis-ci.com을 사용하라고 한다. 들어가보니까 그냥 똑같은거 같다.

 

.travis.yml 파일은 반드시 build.gradle 과 같은 위치에 있어야한다.

이거 때문에 의미 없는 commit을 수차례나 했지만 travis는 아무 반응도 없었다...

같은 위치로 옮기니까 됐다.

 

./gradlew: Permission denied

이 오류는 전에 책 따라할 때도 마주쳤던 오류다.

gradlew 권한만 추가해주면 간단하게 해결할 수 있다.

before_install:
- chmod +x gradlew

 

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
language: java
jdk:
  - openjdk11
 
branches:
  only:
    - master
 
# Travis CI 서버의 Home
cache:
  directories:
    - '$HOME/.m2/repository'
    - '$HOME/.gradle'
 
script: "./gradlew clean build"
 
before_install:
  - chmod +x gradlew
 
#CI 실행 완료 시 메일로 알람
notifications:
  email:
    recipients:
      - suhoji2021@gmail.com
 
 
 
 
cs

 

-----------------------------

원인은 모르겠는데 test 코드 부분에서 계속 에러가 떴다.

test코드 주석처리 하니까 완료

반응형
반응형

developers.kakao.com/docs/latest/ko/kakaologin/rest-api

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

www.youtube.com/watch?v=NwQ_55l0Za4&list=PL93mKxaRDidECgjOBjPgI3Dyo8ka6Ilqm&index=67

1. 인가 코드 받기

https://kauth.kakao.com/oauth/authorize?client_id=0424bf7b6fda69a5ef3c591a8d4f0f43&redirect_uri=localhost:8080/auth/kakao/callback&response_type=code

 

 

응답 확인용 코드

1
2
3
4
    @GetMapping("auth/kakao/callback")
    public @ResponseBody String kakaoCallback(String code){
        return "카카오 인증 완료, code: " + code;
    }
cs

주소 창에서도 코드를 확인할 수 있다.

 

 

2. 토큰 받기

반응형

'개발' 카테고리의 다른 글

[연습] querydsl 정렬 포함한 쿼리 실행 시 NPE 발생  (0) 2021.04.29
[연습] travis-ci  (0) 2021.04.27
캡스톤 메모  (0) 2021.04.02
Travis CI와 AWS S3 연동  (0) 2021.03.08
ec2 서버에 프로젝트 배포  (0) 2021.03.08

+ Recent posts