2022.06.26

프로그래머스 Lv.1 쉬운 문제들 피드백 모음 (1)

 

 

 

 

 

'없는 숫자 더하기' 문제

 

나의 답안

 

def solution(numbers):
    
    num = [1,2,3,4,5,6,7,8,9,0]
    
    answer = 0
    for i in num:
        if i not in numbers:
            answer += i

    return answer

 

모범 답안

 

def solution(numbers):
    return 45 - sum(numbers)

 

너무나 간결한 코드..

왜 이렇게는 생각을 못했을까?

 

 

 

 

 


 

 

 

 

 

'내적' 문제

 

나의 답안

 

def solution(a, b):
    
    answer = 0
    for i in range(len(a)):
        answer += a[i]*b[i]
    
    return answer

 

모범 답안

 

def solution(a, b):
    return sum([a*b for a, b in zip(a, b)])

 

  • zip(x, y) : 두 그룹의 데이터를 순서대로 엮어줌. 만약 인자의 길이가 다르면 더 긴 그룹의 나머지 인자들은 버려짐.

 

 

 

 

 


 

 

 

 

 

'실패율' 문제

 

나의 답안

 

import collections

def solution(N, stages):

    all_player = len(stages)
    stage_player = collections.Counter(stages)
    fault = dict()

    for i in range(1, N+1):
        if i in stage_player:
            fault[i] = stage_player[i]/all_player
            all_player -= stage_player[i]
        else:
            fault[i] = 0

    answer, delete = [], []
    while(len(fault) != 0):
        fault_max = max(fault.values())
        for i in fault.keys():
            if fault[i] == fault_max:
                delete.append(i)
                answer.append(i)
        for j in delete:
            del fault[j]
        delete = []

    return answer

 

모범 답안

 

import collections

def solution(N, stages):

    all_player = len(stages)
    stage_player = collections.Counter(stages)
    fault = dict()

    for i in range(1, N+1):
        if i in stage_player:
            fault[i] = stage_player[i]/all_player
            all_player -= stage_player[i]
        else:
            fault[i] = 0
            
    return sorted(fault, key=fault.get, reverse=True)

 

  • sorted(x, key=x.get, reverse=True) : x를 내림차순으로 정렬하여 그의 key 값만 출력해줌.

 

 

 

 

 


 

 

 

 

 

'3진법 뒤집기' 문제

 

나의 답안

 

def solution(n):

    if n == 0:
        return 0

    trans = []

    while (3**len(trans) <= n):
        trans.append(0)

    for i in range(len(trans)-1, -1, -1):
        if n >= (3**i)*2:
            trans[i] = 2
            n = n - (3**i)*2
        elif n >= (3**i)*1:
            trans[i] = 1
            n = n - (3**i)*1

    answer = 0
    for i, j in enumerate(trans):
        answer += j*3**(len(trans)-1-i)

    return answer

 

  • for i, j in enumerate(x) : list x를 i = 원소 번호, j = 원소 값 순으로 출력해줌.

 

 

 

모범 답안

 

def solution(n):
    tmp = ''
    while n:
        tmp += str(n % 3)
        n = n // 3

    answer = int(tmp, 3)
    return answer

 

  • int(x, 3) : 3진법으로 쓰여진 숫자 x를 10진법으로 변환해서 출력해줌.

 

 

 

 

 


 

 

 

 

 

'최소직사각형' 문제

 

나의 답안

 

def solution(sizes):

    w, h = [], []
    max_w, max_h = 0, 0

    for i in sizes:
        w.append(i[0])
        h.append(i[1])
        if i[0] > max_w:
            max_w = i[0]
            min_h = i[1]
        if i[1] > max_h:
            max_h = i[1]
            min_w = i[0]

    if max_w >= max_h:
        while True:
            max_h = max(h)
            if min_h >= max_h:
                return max_w*min_h
            for i in range(len(h)):
                if max_h == h[i]:
                    if w[i] >= h[i]:
                        return max_w*h[i]
                    else:
                        if w[i] > min_h:
                            min_h = w[i]
                            h[i] = 0
                        else:
                            h[i] = 0
    else:
        while True:
            max_w = max(w)
            if min_w >= max_w:
                return max_h*min_w
            for i in range(len(w)):
                if max_w == w[i]:
                    if h[i] >= w[i]:
                        return max_h*w[i]
                    else:
                        if h[i] > min_w:
                            min_w = h[i]
                            w[i] = 0
                        else:
                            w[i] = 0

 

모범 답안

 

def solution(sizes):
    return max(max(x) for x in sizes) * max(min(x) for x in sizes)

 

복사했습니다!