문제
https://school.programmers.co.kr/learn/courses/30/lessons/42860#
1. 주어진 이름과 같은 길이를 가지며 A로만 구성된 문자열을, 주어진 이름으로 바꿔야 한다.
2. 다음과 같이 조이스틱을 각 방향으로 움직일 수 있다.
3. 이때 조이스틱 조작 횟수의 최솟값을 구하는 문제이다.
틀린 풀이
상하 조이스틱은 ord를 사용해 조이스틱 간의 거리를 구할 수 있다.
좌우 조이스틱은 연속된 A의 최대 길이를 구하고 len(name)-1에서 빼주면 된다고 생각했다.
→ 커서가 문자열의 맨앞에서 시작된다는 점을 간과해서 틀렸다.
def solution(name):
answer = 0
leng = len(name)
init = "A" * leng
arr = []
for idx, n in enumerate(name):
# 주어진 알파벳으로 바꾸기 위한 최소 이동 거리 찾기
if n != "A":
dif = abs(ord("A") - ord(n))
answer += min(dif, 26 - dif)
else:
arr.append(idx)
# name에 A가 없다면 leng-1 만큼 좌우 이동
if len(arr) == 0:
answer += leng - 1
return answer
# 연속된 A값들의 최대 길이 찾기
cnt = 1
maxl = 1
for i in range(1, len(arr)):
if arr[i - 1] == arr[i]:
cnt += 1
else:
maxl = max(maxl, cnt)
cnt = 1
answer += leng - 1 - maxl
return answer
제출한 코드
다른 블로그를 참고했다.
1. while문을 통해 현재 위치 idx보다 오른쪽에 위치하고 "A"가 아닌 문자의 인덱스 중 최소값(post)를 구한다.
2. 사이에 낀 A의 값을 피하기 위한 방법 중 가장 최소값을 구해준다.
move
문자열에서 제일 앞 문자와 끝 문자까지 커서를 이동시키기 위한 최소 거리
2 * idx + len(name) - post
시작점 → idx
idx → 시작점
시작점 → 왼쪽으로 이동해 post 까지의 거리합
2 * (len(name) - post) + idx
시작점 → 왼쪽으로 이동해 post
post → 끝점
끝점 → 오른쪽으로 이동해 idx
→ 반복문에서 위 값들 중 최솟값을 찾아서 move에 저장
def solution(name):
answer = 0
move = len(name) - 1
for idx, n in enumerate(name):
answer += min(ord(n) - ord("A"), ord("Z") - ord(n) + 1)
post = idx + 1
while post < len(name) and name[post] == "A":
post += 1
move = min([move, 2 * idx + len(name) - post, idx + 2 * (len(name) - post)])
answer += move
return answer
참고
회고
좌우 이동할 때 커서가 문자열 맨앞에서 시작된다는 걸 고려하지 않고 맘대로 풀었다.
그리고 참고한 코드를 이해하는데까지 엄청 오래걸렸다.
점점 코테 실력이 퇴화되는 것 같다...... 그래도 즐기면서 했으면 좋겠다.
이걸 풀어 제껴 버려야겠다고 생각하니 오히려 더 깊게 생각을 못하는 것 같다.
스스로 일정 시간 안에 풀이가 떠오르지 않거나 틀린 게 보이지 않으면 다른 풀이를 참고했었는데 이제는 다시 고민하는데에 집중할 필요가 있는 것 같다. 다음부터는 진득하게 시간의 여유를 가지고, 또 마음의 여유가 있을 때 풀어야겠다.
'코테 준비' 카테고리의 다른 글
[프로그래머스] 큰 수 만들기 (js) (1) | 2024.03.28 |
---|---|
[프로그래머스] 숫자 블록 (python) (0) | 2024.03.22 |
[프로그래머스] 2024 Kakao Winter Internship 산 모양 타일링 (python) (1) | 2024.03.21 |
[프로그래머스] 시소 짝꿍 (python) (0) | 2024.03.19 |
[프로그래머스] 숫자 변환하기 (python) (2) | 2024.03.16 |