ps:problems:programmers:42860
                조이스틱
| ps | |
|---|---|
| 링크 | programmers.co.kr/… | 
| 출처 | 프로그래머스 | 
| 문제 번호 | 42860 | 
| 문제명 | 조이스틱 | 
| 레벨 | Level 2 | 
| 분류 | 
 애드혹  | 
	
| 시간복잡도 | O(n) | 
| 인풋사이즈 | n<=20 | 
| 사용한 언어 | Python | 
| 해결날짜 | 2020/12/14 | 
| 태그 | |
풀이
- 알파벳을 설정하는 조작 (조이스틱의 위, 아래 방향)과 커서를 이동시키는 조작 (조이스틱의 왼쪽, 오른쪽 방향)을 나눠서 생각하자. 따로 구한다음에 마지막에 더해서 리턴하면 된다,
 - 알파벳을 설정하는 조작은 단순하다. 어떤 알파벳 x를 만들려면, 위로 올려서 만드는 방법과 아래로 내려서 만드는 방법, 두가지 중에서 짧은 것을 선택하면 된다.
 - 커서를 이동시키는 조작은 좀 복잡하다. 거기에 문제 자체도 헷갈리기 쉽게 되어있다.
- 문제에서 헷갈리기 쉬운 부분은
- 첫 번째 위치에서 왼쪽으로 이동하면 마지막 문자로 커서가 이동한다
 - 그러나, 마지막 위치에서 오른쪽으로 이동하면 첫 문자로 커서가 이동하지는 않는다
 
 - 그러면 이동 방식은 다음 네가지중 최소값이 된다
- 1. 시작 위치에서 커서를 계속 오른쪽으로 이동한다
 - 2. 시작 위치에서 커서를 계속 왼쪽으로 이동한다
 - 3. 시작 위치에서 얼마만큼 커서를 오른쪽으로 이동했다가, 다시 왼쪽으로 계속 이동한다.
- BBAAAAAAAAAABBBB 같은 경우이다,
 
 - 4. 시작 위치에서 얼마만큼 커서를 왼쪽으로 이동했다가, 다시 오른쪽으로 계속 이동한다.
- BBBBAAAAAAAAAABB 같은 경우이다,
 
 
 - A가 아닌 문자의 위치를 t[i] 에 저장해 놓으면,
- 1은 t[-1]까지 이동해야 하니까, 그냥 t[-1]
 - 2은 맨 오른쪽에서부터 t[0]까지 이동해야 하니까, len(name) - t[0]
 - 3는 t[i]번만큼 오른쪽으로 이동했다가 다시 그만큼 왼쪽으로 이동해서 제자리로 온 뒤, 맨 오른쪽에서 t[i+1]까지 왼쪽으로 이동. 그래서 t[i] + t[i] + (len(name) - t[i+1])
 - 4는 t[i+1]까지 왼쪽으로 이동했다가 다시 그만큼 오른쪽으로 이동해서 제자리로 온 뒤, t[i]까지 오른쪽으로 이동. 그래서 (len(name) - t[i+1]) + (len(name) - t[i+1]) + t[i]
 
 - 이것의 최소값을 구하면 된다
 
 
코드
"""Solution code for "Programmers 42860. 조이스틱".
- Problem link: https://programmers.co.kr/learn/courses/30/lessons/42860
- Solution link: http://www.teferi.net/ps/problems/programmers/42860
"""
ORD_A = ord('A')
def solution(name):
    u_d_count = sum(min(ord(c) - ORD_A, ORD_A - ord(c) + 26) for c in name)
ps/problems/programmers/42860.txt · 마지막으로 수정됨: 2022/01/17 16:22 저자 teferi
                
                
토론