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'] |
'코딩테스트' 카테고리의 다른 글
[코딩테스트 - Python] 프로그래머스 Lv.1 문제 피드백 모음 (3) (0) | 2022.07.01 |
---|---|
[코딩테스트, Python] 프로그래머스 Lv.1 쉬운 문제들 피드백 모음 (1) (0) | 2022.06.26 |
[코딩테스트, Python] 프로그래머스 '소수 만들기' 문제 피드백 (0) | 2022.06.25 |
[코딩테스트, Python] 프로그래머스 '완주하지 못한 선수' 문제 피드백 (Feat. Hash Table) (0) | 2022.06.24 |
[코딩테스트, Python] 프로그래머스 '신규 아이디 추천' 문제 피드백 (0) | 2022.06.24 |