[코드트리/INTERMEDIATE LOW] 컨베이어 벨트 (JAVA)
📖 문제
코드트리 | 코딩테스트 준비를 위한 알고리즘 정석
국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.
www.codetree.ai
💡 풀이 방식
1. 윗줄과 아랫줄을 따로 입력받는다. 아랫줄은 거꾸로 뒤집어 값을 입력받는다.
2. 윗줄을 오른쪽으로 밀 때 맨 오른쪽 값이 유실될 수 있으므로 윗줄의 맨 오른쪽값을 따로 저장해둔다. (이 값은 나중에 아랫줄 오른쪽 아래 자리에 넣는다.)
윗줄의 다른 칸들은 오른쪽으로 1칸씩 shift한다.
아랫줄을 왼쪽으로 밀 때 맨 왼쪽 값이 유실될 수 있으므로 아랫줄의 맨 왼쪽값을 따로 저장해둔다. (이 값은 나중에 윗줄 왼쪽 자리에 넣는다.)
윗줄의 다른 칸들은 왼쪽으로 1칸씩 shift한다.
3. 1초에 1번 회전하므로, 2번 과정을 T번 진행한다.
4. 윗줄은 그대로 출력하고, 아랫줄은 뒤집어서 입력받았으니 뒤집어서 출력한다.
💥 유의사항
양쪽 끝에 있는 값이 유실되지 않고 처리되도록 해야 함
🔺 코드
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
|
import java.util.*;
import java.io.*;
public class Main {
static int N, T;
static int[][] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
T = Integer.parseInt(st.nextToken());
arr = new int[2][N];
st = new StringTokenizer(br.readLine(), " ");
for(int i = 0 ; i < N ; i++) {
arr[0][i] = Integer.parseInt(st.nextToken());
}
st = new StringTokenizer(br.readLine(), " ");
for(int i = 0 ; i < N ; i++) {
arr[1][N - 1 - i] = Integer.parseInt(st.nextToken());
}
while(T --> 0) {
rotate();
}
print();
}
private static void rotate() {
// [윗줄]
// 윗줄 맨 오른쪽 값 따로 빼두기
int rightTop = arr[0][N - 1];
// 나머지 원소를 오른쪽으로 shift (오른쪽부터 채워넣음 !!)
for(int i = N - 1 ; i >= 1 ; i--) {
arr[0][i] = arr[0][i - 1];
}
// [아랫줄]
// 아랫줄 맨 왼쪽 값 따로 빼두기
int leftDown = arr[1][0];
for(int i = 0 ; i < N - 1 ; i++) {
arr[1][i] = arr[1][i + 1];
}
// 따로 뺐던 값 채우기
arr[0][0] = leftDown; // 맨 왼쪽 위 숫자 채우기
arr[1][N - 1] = rightTop; // 맨 오른쪽 아래 숫자 채우기
}
private static void print() {
StringBuilder sb = new StringBuilder();
for(int i = 0 ; i < N ; i++) {
sb.append(arr[0][i]).append(" ");
}
sb.append("\n");
// 아랫줄 출력 거꾸로
for(int i = N - 1 ; i >= 0 ; i--) {
sb.append(arr[1][i]).append(" ");
}
System.out.println(sb);
}
}
|
cs |
➕ 다른 풀이 방식
그냥 뒤집어진 거 신경쓰지 말고 입력받은 순서대로 오른쪽으로 shift해주면 된다.
💦 어려웠던 점
- 오른쪽으로 shift할 때 그냥 for문 앞쪽부터 마지막칸까지 방향(→)으로 진행하면 되는 거 아닐까? 라는 생각을 했었다,,,
- 아랫줄을 뒤집어서 입력받고, 뒤집어서 출력하고 했는데 굳이 이럴 필요가 없었던 것이었다!!
🧐 새로 알게 된 내용
1. 마지막 값 유실 방지 위한 변수 사용
- 격자 안에서 밀고 당길 때, 해당 이동 방향의 가장 끝쪽에 있는 값 lastVal이 유실되지 않도록 따로 저장한다.
2. 미는 방향
- 만약 오른쪽으로 민다면, 가장 마지막 칸부터 앞으로 오며 채워줘야 한다.(←) 앞에서부터 당기면, 정보가 중간에 유실될 수도 있기 때문이다.
for(int i = N - 1 ; i >= 1 ; i--) {
arr[0][i] = arr[0][i - 1];
}
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V |
(참고)
✔ 코드트리