삼총사
답:
from itertools import combinations
def solution(number):
answer = 0
combi = list(combinations(number, 3))
for i in combi:
if sum(i) == 0:
answer +=1
return answer
문제 분석 및 해석
요소별로 중복이 없는 조합을 구하고
** 서로 다른 학생의 정수 번호가 같을 수 있습니다. 주의!!
학생 3명의 정수 번호를 더했을 때 0
더해서 0이되는지 확인
>>풀이생각
조합이구나! combinations써야지!
리뷰.
모듈 활용이외의 풀이도 도전해봐야겠다
counter 끼리 계산이 되는 것도 새로웠다
키패드 누르기
답:
key = {1:(0,0),2:(0,1),3:(0,2),
4:(1,0),5:(1,1),6:(1,2),
7:(2,0),8:(2,1),9:(2,2),
'*':(3,0),0:(3,1),'#':(3,2)}
def get_length(num_position, hand_position):
x = abs(num_position[0] - hand_position[0])
y = abs(num_position[1] - hand_position[1])
return x, y
def solution(numbers, hand):
answer = ''
left = (3,0)
right = (3,2)
for idx, num in enumerate(numbers):
if num in [1, 4, 7]:
answer += "L"
left = key[num]
elif num in [3, 6, 9]:
answer += "R"
right = key[num]
else: # num in [2, 5, 8, 0]
x, y = get_length(key[num], left)
left_length = x + y
a, b = get_length(key[num], right)
right_length = a + b
if left_length < right_length:
answer += "L"
left = key[num]
elif left_length > right_length:
answer += "R"
right = key[num]
else:
finger = hand[0].upper()
answer += finger
if finger == "L":
left = key[num]
else:
right = key[num]
return answer
문제 분석 및 해석
상하좌우 4가지 방향으로만 이동, 한 칸은 거리로 1
1, 4, 7 왼쪽
3, 6, 9 오른쪽
2, 5, 8, 0 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용
두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다. hand
>> 풀이생각
147 / 369면 해당 왼 / 오 손으로 누르기
이전에 누른 위치를 저장해둠 : 어떻게? --> 좌표를 지정하자!
저장해둔 위치에서 눌러야하는 번호(현재(왼/오)요소와 배열의 다음요소)와의 거리를 확인
더 가까운 오른쪽, 왼쪽으로 누르거나 같은 경우 hand를 사용
이 누른 결과물을 "L" "R" 로 answer 에 저장하여 return해야함
과정1.
L을 더해주고 손 위치를 저장
def solution(numbers, hand):
answer = ''
left = 0
right = 0
for idx, num in enumerate(numbers):
if num in [1, 4, 7]:
answer += "L"
left = num
elif num in [3, 6, 9]:
answer += "R"
right = num
else: # num in [2, 5, 8, 0]:
else를 계산하기 위해 키패드 이동 거리를 어떻게 계산할지 생각해보았다.
생각건데, y축은 // 3으로 나눈 몫, x축은 3으로 나눈 나머지 % 로 생각되었다
def solution(numbers, hand):
...
else: # num in [2, 5, 8, 0]
x = abs(num % 3)
y = abs(num // 3)
이렇게 계산하면 오류가 발생한당...
아마 0을 연산할 때인 것 같은데, module에 유효하지 않은 값을 넣었거나 zero를 넣었다는 오류가 발생한다.
과정2.
key 위치를 지정해주고, 현재위치를 좌표로 설정하여 풀이하기. left엄지와 right엄지의 자리를 지정해 시작한다.
좌표에서 눌러야하는 숫자의 좌표에서 얼마나 y축 x축 차이가 나는지 확인하여 검증하자
key dictionary를 만들고 left, right에 초기값을 할당했다.
해당 값은 left, right에 매번 저장하고 num의 좌표와 계산하여 서로를 비교하는 로직을 작성.
key = {1:(0,0),2:(0,1),3:(0,2),
4:(1,0),5:(1,1),6:(1,2),
7:(2,0),8:(2,1),9:(2,2),
'*':(3,0),0:(3,1),'#':(3,2)}
def solution(numbers, hand):
left = (3,0)
right = (3,2)
...
else: # num in [2, 5, 8, 0]
x, y = get_length(key[num], left)
left_length = x + y
a, b = get_length(key[num], right)
right_length = a + b
x, y좌표를 각각의 위치에서 빼서 확인하는 함수를 만들어 적용했다.
def get_length(num_position, hand_position):
x = abs(num_position[0] - hand_position[0])
y = abs(num_position[1] - hand_position[1])
return x, y
upper()함수로 왼손잡이, 오른손잡이를 확인 및 answer에 추가.
다음 요소를 위해 left right위치를 재 저장
finger = hand[0].upper()
answer += finger
if finger == "L":
left = key[num]
else:
right = key[num]
과정3.
오류 수정 중... 연산하는 함수가 잘못되어있는 것 같다. 계산 값이 적절하게 도출되지 않는다
아무리 생각해도 첫번째 방법으로 안 풀릴 문제가 아닌 것 같아서 다시 첫 번째 방법으로 도전!
계산하는 함수를 다시 만들었다
def get_length_position(num_position, hand_position):
x = abs(num_position % 3 - hand_position % 3)
y = abs(num_position // 3 - hand_position // 3)
return x, y
오류!!
값을 지정해줄 때 1개의 인자만 전달하여 비교하는 경우 0번 인덱스의 인자만 비교하는 오류가 있었다
잘 모르겠다면 연산한 값을 꼭 print해보자
left_length = get_length_position(num, left)
right_length = get_length_position(num, right)
print(left_length) # (1, 2)
print(right_length) # (0, 0)
계산 값을 sum 하여 비교하도록 변경
left_length = sum(get_length_position(num, left))
right_length = sum(get_length_position(num, right))
print(left_length) # 3
print(right_length) # 0
리뷰.
스터디에서 논의해보니... 결과값에 적절하게 r과 l을 계산 못하는 경우가 있다
문제1 get_length_position함수가 잘못된거같다
문제2 left right를 0으로 설정하다보니 문제가 생길 것 같다
>> [7, 8 ,0 ...]
l:0 r:0 > l:7 r:0 > l거리: 1 r거리:1 오른손잡이면 문제가 생김
느낀점:
역시나 지레 겁먹었던 것과는 달리 방법적인 것을 떠올리니 풀 수 있었다
좌표를 지정하는 방법도, 좌표를 직접 계산하는 방법도 떠올려 풀이할 수 있어서 매우 재밌었음
힘내... 잘 하고 있다구:)
'알고리즘 풀이' 카테고리의 다른 글
[알고리즘] 프로그래머스 | 소수 만들기 (0) | 2023.08.15 |
---|---|
[알고리즘] 프로그래머스 | 소수 찾기 Lv.1 (0) | 2023.08.12 |
[알고리즘] 프로그래머스 | 완주하지 못한 선수, 과일 장수 (0) | 2023.08.10 |
[알고리즘] 프로그래머스 | 3진법 뒤집기, 푸드파이트대회, 예산 (0) | 2023.08.09 |
[알고리즘] 프로그래머스 | 콜라츠 추측, 부족한 금액 계산하기, 최대공약수와 최소공배수 (0) | 2023.08.08 |