안녕하세요 세기무민입니다.
이번에 돌아온 포스팅은 프로그래머스 알고리즘 풀이 문제로 돌아왔습니다.
문제설명
입출력 예시
문제풀이
우선 저는 이 문제를 보자마자 메모장에 그림을 그렸습니다.
전화기가 위와 같이 있다고 가정하면 일단 왼쪽의 숫자들은 3으로 나눴을 때 나머지가 1인 경우의 수
오른쪽의 숫자들은 3으로 나눴을 때 나머지가 0인 경우의 수라는 것을 알 수 있습니다.
그런 뒤 이 문제에서 가장 중요한건 가운데 숫자를 클릭하는 방법인데
우선은 가운데 숫자들은 3가지의 조건을 생각해봤습니다.
1. 왼쪽과 오른쪽의 길이가 같은 경우
2. 왼쪽이 오른쪽 길이보다 큰 경우
3. 오른쪽이 왼쪽 길이보다 큰 경우
위와 같이 3가지로 나눌 수 있는데 그렇다면 어떻게 길이를 구분할 지 고민해본 끝에 좌표 이동을 생각해봤는데
아래의 예를 들어보겠습니다.
위와 같은 그림을 보면 5에 가장 가까운 번호는 4가 됩니다.
좌표로 생각해봐도 left가 1칸만 이동하는 경우라면 center에 도착할 수 있는 반면 right는 위, 옆으로
총 2칸을 이동해야 하기 때문에 left가 가까운 번호가 됩니다.
결론적으로는 현재의 center값에서 left와 right값을 뺀 결과에 거리를 구한다면 가장 단거리를 구할 수 있습니다.
코드
def solution(numbers, hand):
leftHand = 10
rightHand = 12
lx, rx = 0, 0, 0
ly, ry = 0, 0, 0
leftDis = 0
rightDis = 0
result = ""
for i in numbers:
if i == 0:
i = 11
if i == "#":
i = 12
if i == "*":
i = 10
if i % 3 == 1:
result += "L"
leftHand = i
elif i % 3 == 0:
result += "R"
rightHand = i
else:
lx = (abs(i - leftHand)) // 3
ly = (abs(i - leftHand)) % 3
rx = (abs(i - rightHand)) // 3
ry = (abs(i - rightHand)) % 3
leftDis = (lx + ly)
rightDis = (rx + ry)
if leftDis > rightDis:
result += "R"
rightHand = i
elif rightDis > leftDis:
result += "L"
leftHand = i
elif rightDis == leftDis:
if hand == "right":
result += "R"
rightHand = i
else:
result += "L"
leftHand = i
return result
abs를 사용하여 음수가 나오지 않도록 만들어줍니다.
그리고 leftHand와 rightHand의 10과 12는 처음 *과 #을 누르고 있다는 가정이기 때문에 초기값을 지정해주며
만약 *와 #가 나온다면 해당 숫자로 바꿔주면 됩니다.
그리고 왼쪽거리와 오른쪽거리가 동일한 경우라면 hand 값에 따라 지정해주면 됩니다.
결과
[GitHub]
다음에도 더 알찬 포스팅으로 찾아오겠습니다.
'Algorithm > 프로그래머스' 카테고리의 다른 글
프로그래머스 자물쇠와 열쇠 문제 풀이 - [세무민의 코딩일기] (0) | 2022.05.17 |
---|---|
프로그래머스 비밀지도 문제 풀이 - [세무민의 코딩일기] (0) | 2022.02.28 |
[세무민의 코딩일기] 프로그래머스 : 우유와 요거트가 담긴 장바구니 문제 풀이 (0) | 2022.01.07 |
[세무민의 코딩일기] 프로그래머스 : 헤비 유저가 소유한 장소 문제 풀이 (0) | 2022.01.05 |
프로그래머스 실패율(2019 KAKAO BLIND RECRUITMENT) 문제 풀이 (0) | 2021.11.16 |