이모저모
주사위게임3, 수 조작하기1 본문
1. 내 코드(dictionary 사용)
def solution(a, b, c, d):
num_list = [a,b,c,d]
num_list.sort()
same_list = {}
for i in num_list:
if i not in list(same_list.keys()):
same_list[i] = 1
else:
same_list[i] +=1
values_len = len(same_list.values())
if values_len == 1:
answer = a*1111
elif values_len == 2:
key_list = list(same_list.keys())
if same_list[key_list[0]]>same_list[key_list[1]]:
answer = (10*key_list[0] + key_list[1])**2
elif same_list[key_list[0]] < same_list[key_list[1]]:
answer = (10*key_list[1] + key_list[0])**2
else:
answer = (key_list[0]+key_list[1])*abs(key_list[0]-key_list[1])
elif values_len == 3:
ans_list = [k for k in same_list.keys() if same_list[k]==1]
answer = ans_list[0]*ans_list[1]
elif values_len == 4:
answer = min(list(same_list.keys()))
return answer
내 풀이이다. values_len이 2일 때 [1,3]만 고려하고 [3,1]인 경우를 고려하지 않아 오랜 시간 헤맸다.
모든 경우를 if 문으로 비교하기엔 어려울 것 같아 각 element의 등장 횟수를 저장해야겠다고 생각했고 key와 value로 엮을 수 있는 dictionary를 가장 먼저 고려하였다.
위의 풀이에서 value값과 key를 거꾸로 저장한 딕셔너리를 따로 저장한다면 더 효율적인 코드가 나올 것이라 생각한다.
2. 다른 풀이 .count() 활용
def solution(a, b, c, d):
nums = [a, b, c, d]
counts = [nums.count(i) for i in nums]
if max(counts) == 4:
return a * 1111
elif max(counts) == 3:
p = nums[counts.index(3)]
q = nums[counts.index(1)]
return (10 * p + q) ** 2
elif max(counts) == 2:
if min(counts) == 2:
return (a + c) * abs(a - c) if a == b else (a + b) * abs(a - b)
else:
p = nums[counts.index(2)]
return (a * b * c * d) / p**2
else:
return min(nums)
이런 코드도 있다고 한다. list의 자체 메소드 중에 .count()를 이용해 element의 등장 빈도를 count할 수 있음을 기억하자...
3. 수 조작하기
def solution(n, control):
set_num = set(list(control))
count_dict = {'w':0,'s':0,"d":0,"a":0}
for word in set_num:
count_dict[word] = list(control).count(word)
answer = n + 1*count_dict['w'] - 1*count_dict['s'] + 10*count_dict['d'] - 10*count_dict['a']
return answer
count를 이용해 풀어 보았다. 하지만 풀고보니 이경우 굳이 count를 안하고 돌리면서 덧셈 뺄샘을 하는 것 코드도 짧고 효율적이었다. 그 아이디어는 아래와 같다.
4. .zip()사용
def solution(n, control):
key = dict(zip(['w','s','d','a'], [1,-1,10,-10]))
return n + sum([key[c] for c in control])
물론 이 경우에도 zip을 사용 안하고 dict으로 바로 선언 하는게 효율적이긴 하지만 zip을 자주 사용하지 않아 기록용으로써 다른 사람의 코드를 가져와 보았다.
'코딩공부 > 프로그래머스(파이썬)' 카테고리의 다른 글
배열만들기2 (1) | 2024.01.02 |
---|---|
.reduce(), .join() 사용 (0) | 2024.01.02 |
리스트 정렬 & 슬라이싱 (0) | 2023.12.28 |
대소문자 바꿔서 출력하기 (0) | 2023.12.27 |
수 조작하기2 (0) | 2023.12.26 |