Post

특별한 다이얼 자물쇠

특별한 다이얼 자물쇠 문제를 Java로 해결한 풀이입니다. 그리디 알고리즘을 활용하여 앞에서부터 차례로 다이얼을 맞추며 최소 회전 횟수를 구하는 방법을 설명합니다.

특별한 다이얼 자물쇠

특별한 다이얼 자물쇠 알고리즘 문제 풀이 참고 이미지

일반적인 다이얼 자물쇠는 위로 돌리면 숫자가 증가, 아래로 돌리면 숫자가 감소합니다.
하지만 이 다이얼얼 자물쇠는 조금 특별합니다.

특징은 다음과 같습니다:

  • 특정 다이얼에서 up(+) 또는 down(-) 회전을 하면, 그 다이얼부터 마지막 다이얼까지 모두 함께 회전한다.
  • 예를 들어, 다이얼이 12자리라고 할 때:
    • 3번째 다이얼에서 1칸 up3번째부터 12번째까지 모든 다이얼 숫자가 1 증가
    • 7번째 다이얼에서 3칸 down7번째부터 12번째까지 모든 다이얼 숫자가 3 감소

문제 정의

현재 다이얼 상태 dials가 주어졌을 때, 이를 목표 상태 target으로 만들고자 한다.
이때 필요한 최소 회전 횟수를 구해볼까?


조건

  • 다이얼의 개수:
    1 <= dials.length <= 100000
  • 다이얼의 숫자는 0 ~ 9 범위를 갖는다.
    (숫자는 회전하면서 순환한다. 예: 9에서 +1 → 0)

예시

예제 1

1
2
3
dials   = {0,0,0,0,0,0}
target  = {1,2,3,4,5,6}
result  = 6

설명: 각 단계마다 하나씩 올려가면 된다.


예제 2

1
2
3
dials   = {9,8,7}
target  = {0,7,7}
result  = 4

예제 3

1
2
3
dials   = {0,6,1,4,5}
target  = {8,3,1,9,6}
result  = 15

요약

  • 핵심 아이디어:
    앞에서부터 차례로 맞추면서, 필요한 회전만큼 뒤까지 모두 조정하는 방식으로 최소 횟수를 찾는다.
  • 다이얼이 하나씩 맞춰질 때, 그 뒤의 다이얼 상태도 자연스럽게 바뀌기 때문에 이를 고려해야 한다.




알고리즘 문제 풀이 참고 다이어그램


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
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;


public class Solution {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] dials_arr = br.readLine().split(" ");
		String[] target_arr = br.readLine().split(" ");
		int N = dials_arr.length;
		int[] dials = new int[N];
		int[] target = new int[N];
		
		for (int i = 0; i < N; i++) {
			dials[i] = Integer.parseInt(dials_arr[i]);
			target[i] = Integer.parseInt(target_arr[i]);
		}
		
		
		int cnt = 0;
		int add = 0;
		for (int i = 0; i < N; i++) {
			// 음수처리
			if (add < 0) add += 10;
			// 현재 숫자
			int cur = (add + dials[i]) % 10;
			
			int up = (target[i] + 10 - cur) % 10;
			int down = (cur + 10 - target[i]) % 10;
			
			if (up >= down) {
				cnt += down;
				add -= down;
			}
			else if (up < down) {
				cnt += up;
				add += up;
			}
		}
		
		// 출력
		System.out.println(cnt);
		
		
	}
}
This post is licensed under CC BY 4.0 by the author.

Trending Tags