2022.06.27

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

 

 

 

 

 

'[1차] 비밀지도' 문제

 

나의 답안

 

def solution(n, arr1, arr2):
    
    answer = [""]*n
    
    for i in range(n):
        map1, map2 = [0]*n, [0]*n
        map1_place, map2_place = n-1, n-1
        
        while (arr1[i]):
            map1[map1_place] = arr1[i] % 2
            arr1[i] = arr1[i] // 2
            map1_place -= 1
        while (arr2[i]):
            map2[map2_place] = arr2[i] % 2
            arr2[i] = arr2[i] // 2
            map2_place -= 1

        for j in range(n):
            if map1[j] == 1 or map2[j] == 1:
                answer[i] = answer[i] + str("#")
            else:
                answer[i] = answer[i] + str(" ")
                        
    return answer

 

모범 답안

 

def solution(n, arr1, arr2):
    answer = []
    for i, j in zip(arr1, arr2):
        a12 = bin(i|j)[2:]
        a12 = a12.rjust(n, '0')
        a12 = a12.replace('1', '#')
        a12 = a12.replace('0', ' ')
        answer.append(a12)
    return answer

 

  • bin( ) : 2진수 string으로 값을 return해줌. (ex. bin(10) = '0b1010', bin(15) = '0b1111')

 

  • rjust( n, 'x' ) : 문자를 오른쪽으로 정렬 후 n자리 수에서 남는 수만큼 'x'로 채워줌. (ex. '123'.rjust(5, 'x') = 'xx123')
  • ljust( n, 'x' ) : 문자를 왼쪽으로 정렬 후 n자리 수에서 남는 수만큼 'x'로 채워줌. (ex. '123'.ljust(5, 'x') = '123xx')
  • zfill( n ) : 문자를 오른쪽으로 정렬 후 n자리 수에서 남는 수만큼 '0'으로 채워줌. (ex. '123'.zfill(5) = '00123')

 

 

 

 

 


 

 

 

 

 

'로또의 최고 순위와 최저 순위' 문제

 

나의 답안

 

def solution(lottos, win_nums):
    
    lottos = set(lottos)
    lottos.discard(0)

    same_num = 0
    for i in lottos:
        for j in win_nums:
            if i == j:
                same_num += 1
                break

    answer = []
    if same_num == 0:
        if len(lottos) == 6:
            answer = [6, 6]
        else:
            answer = [1 + len(lottos), 6]
    elif same_num == 1:
        answer = [len(lottos), 6]
    else:
        answer = [1 + len(lottos) - same_num, 7 - same_num]
    
    return answer

 

등수가 6이 넘어가는 경우와 같은 모든 case를 잘 고려해야 한다.

 

  • lottos.remove(0) : set 함수 내에 0이 없으면 'KeyError: 0' 오류가 남.
  • lottos.discard(0) : set 함수 내에 0이 없어도 잘 실행됨.
  • set 함수에서 원소를 지울 때는 discard( )를 써야 함.

 

 

 

모범 답안

 

def solution(lottos, win_nums):

    rank = [6,6,5,4,3,2,1]

    zero = lottos.count(0)
    answer = 0
    for i in win_nums:
        if i in lottos:
            answer += 1
            
    return rank[zero + answer], rank[answer]

 

rank를 list로 만들 생각을 왜 못 했을까?

return에  2개 이상의 값을 주면 output이 list로 나온다는 것도 새롭게 알게 되었다.

 

 

 

 

 

 


 

 

 

 

 

'[1차] 다트 게임' 문제

 

나의 답안

 

def solution(dartResult):

    last, curr, total = 0, 0, 0 

    for num, i in enumerate(dartResult):
        if i in ['2', '3', '4', '5', '6', '7', '8', '9']:
            total += last
            last = curr
            curr = int(i)
        elif i == '0':
            if not num == 0:
                if not dartResult[num-1] == '1':
                    total += last
                    last = curr
                    curr = int(i)
        elif i == '1':
            if dartResult[num+1] == '0':
                total += last
                last = curr
                curr = 10
            else:
                total += last
                last = curr
                curr = 1
        elif i in ['S', 'D', 'T']:
            if i == 'D':
                curr **= 2
            elif i == 'T':
                curr **= 3
        elif i in ['*', '#']:
            if i == '*':
                last *= 2
                curr *= 2
            else:
                curr *= (-1)

    return total + last + curr

 

모범 답안 (1)

 

import re

def solution(dartResult):
    bonus = {'S' : 1, 'D' : 2, 'T' : 3}
    option = {'' : 1, '*' : 2, '#' : -1}
    p = re.compile('(\d+)([SDT])([*#]?)')
    dart = p.findall(dartResult)
    for i in range(len(dart)):
        if dart[i][2] == '*' and i > 0:
            dart[i-1] *= 2
        dart[i] = int(dart[i][0]) ** bonus[dart[i][1]] * option[dart[i][2]]

    return sum(dart)

 

  • p = re.compile('(\d+)([SDT])([*#]?)') : set 함수 내에 0이 없으면 'KeyError: 0' 오류가 남.
  • dart = p.findall(dartResult) : set 함수 내에 0이 없어도 잘 실행됨. (ex. dartResult = '1S2D*3T' => dart = [('1', 'S', ''), ('2', 'D', '*'), ('3', 'T', '')]

 

코드는 간단하지만 정규식을 사용하면 실행 시간이 더 길다.

 

 

 

모범 답안 (2)

 

def solution(dartResult):

    dartResult = dartResult.replace('10', 't')
    last, curr, total = 0, 0, 0 

    for num, i in enumerate(dartResult):
        if i in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 't']:
            total += last
            last = curr
            if i == 't':
                curr = 10
            else:
                curr = int(i)
                
        elif i in ['S', 'D', 'T']:
            if i == 'D':
                curr **= 2
            elif i == 'T':
                curr **= 3
                
        elif i in ['*', '#']:
            if i == '*':
                last *= 2
                curr *= 2
            else:
                curr *= (-1)

    return total + last + curr

 

dartResult에 있는 10을 모두 't'로 바꿔주었다.

 

 

 

 

 


 

 

 

 

 

'두 정수 사이의 합' 문제

 

나의 답안

 

def solution(a, b):
    if a == b:
        return a
    elif a > b:
        temp = a
        a = b
        b = temp
    
    answer = 0
    for i in range(a, b+1):
        answer += i
    return answer

 

모범 답안 (1)

 

def solution(a, b):
    
    if a > b:
        a, b = b, a

    return sum(range(a, b+1))

 

  • a, b = b, a : 두 값을 바꿔줌.

 

  • sum(range(a, b+1)) : a와 b 사이의 모든 정수의 합을 계산해줌.

 

 

 

모범 답안 (2)

 

def solution(a, b):
    
    return (abs(a-b)+1)*(a+b)//2

 

  • abs( ) : 절댓값을 return해줌.

 

수학적 지식을 이용하여 시간 복잡도와 코드 간결성을 모두 다 잡았다.

 

 

 

 

 


 

 

 

 

 

'문자열 내 마음대로 정렬하기' 문제

 

나의 답안

 

def solution(strings, n):
    
    if n == 0:
        return sorted(strings)
    else:
        st_n, answer = [], []
        for i in strings:
            st_n.append(i[n])
        for i in sorted(set(st_n)):
            st = []
            for j in strings:
                if i == j[n]:
                    st.append(j)
            for j in sorted(st):
                answer.append(j)
        return answer

 

모범 답안

 

def solution(strings, n):
    
    return sorted(sorted(strings), key=lambda x: x[n])

 

  • lambda 함수 : 이름이 없는 함수. 코드가 간결하고 메모리 절약이 가능함.

 

Code Result
func = lambda x : x + 1
func (4)
5
animal = [ 'cat', 'tiger', 'dog', 'snake' ]
sorted(animal, key = lambda x : len(x))
['cat', 'dog', 'tiger', 'snake']

 

복사했습니다!