관리 메뉴

이모저모

주사위게임3, 수 조작하기1 본문

코딩공부/프로그래머스(파이썬)

주사위게임3, 수 조작하기1

bhoon 2024. 1. 2. 00:11

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