Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 계수정렬
- structured_array
- AI전략게임
- 비둘기목
- 한국의 새
- 기러기목
- AI역량평가
- 백로과
- 참새과
- 흰날개해오라기
- 참새목
- 직박구리과
- SimpleCraft
- 가마우지과
- 오리과
- IBK기업은행 인턴
- keras
- python3
- Birthday paradox
- 비둘기과
- 한국의새
- Python
- 생일문제
- ADsP
- django
- 솔딱새과
- 맑은소리 스피치학원
- 딱다구리과
- 딥러닝 공부
- 딥러닝공부
Archives
- Today
- Total
진박사의 일상
[프로그래머스] Greedy 문제 - 조이스틱 본문
문제 : n개의 A로 이루어진 문자열을 조이스틱으로 상하좌우 이동하며 주어진 이름을 만드는 최소 횟수를 구하시오. (단 첫번째에서 왼쪽으로 움직이면 맨 오른쪽으로, A에서 위로 움직이면 Z로 이동)
def solution(name):
answer = 0
n = len(name)
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
updown_count = [0 for _ in range(n)] #알파벳 맞추는 게 어느 방향이 더 빠를지
#알파벳 맞추는 최소 이동 횟수 정하기
for idx, letter in enumerate(name):
if alphabet.find(letter) > len(alphabet) - alphabet.find(letter):
updown_count[idx] = len(alphabet)-alphabet.find(letter)
else:
updown_count[idx] = alphabet.find(letter)
#print(updown_count)
nonzero_point = [idx for idx, v in enumerate(updown_count) if v != 0]
if len(nonzero_point) == len(name): #0이 아닌 포인트 없음
answer += len(name) - 1
else:
index = 0
while len(nonzero_point):
#print(nonzero_point)
len_non = len(nonzero_point)
len_for_first = min(abs(nonzero_point[0] - index), abs(len(name) - nonzero_point[0])) #첫번째 점까지 거리
len_for_last = min(abs(nonzero_point[len_non-1] - index), abs(len(name) - nonzero_point[len_non-1] + index)) #마지막 점까지 거리
if len_for_first > len_for_last:
index = nonzero_point[len_non-1]
answer += len_for_last
else:
index = nonzero_point[0]
answer += len_for_first
#print(len_for_first, len_for_last, index)
nonzero_point.remove(index)
answer += sum(updown_count)
return answer
어후;;;; 문제 보기보다 엄청 어렵네요. 예상보다 생각해줘야 하는 테스트 케이스들도 많고... 한번에 통과하기는 쉽지 않은 타입의 문제였습니다.
포인트는
- index = 0 를 설정
- index를 기준으로 첫번째와 마지막 non-A 위치까지 이동하는 왼쪽 이동횟수, 오른쪽 이동 횟수를 각각 구함. 첫번째 왼쪽 횟수, 첫번째 오른쪽 횟수, 마지막 왼쪽 횟수, 마지막 오른쪽 횟수 총 4개의 거리
- 1의 4개 중에서 가장 짧은 것을 고르고 result에 이동 횟수 추가, index는 가장 짧은 거리로 갈 수 있는 첫번째 또는 마지막 위치로 갱신하고 해당 위치를 non-A에서 제거(여기서 세로 이동 횟수를 더해 이동 횟수를 0으로 만들어도 될듯)
- 2-3를 반복하며 더이상 non-A가 없을 때까지 반복
인데 말하면서도 어렵네요 ㅋㅋ...
'프로그래밍 > 코딩테스트 공부' 카테고리의 다른 글
[프로그래머스] 위클리 챌린지 6주차 (0) | 2021.09.08 |
---|---|
[이코테] 구현 문제 - 4문제 (0) | 2021.09.07 |
[프로그래머스] Greedy 문제 - 체육복 (0) | 2021.09.06 |
[이코테] Greedy 문제 - 6. 무지의 먹방 라이브 (0) | 2021.09.06 |
[이코테] Greedy 문제 - 5. 볼링공 고르기 (0) | 2021.09.06 |