크레인 인형뽑기 게임
def solution(board, moves):
col = list(0 for i in range(len(board)))
result = []
total = []
for m in moves:
doll = 0
while doll == 0 and col[m-1] < len(board):
doll = board[col[m-1]][m-1]
col[m-1] += 1
if doll != 0:
result.append(doll)
total.append(doll)
result = result[:-2] if len(result) >= 2 and result[-1] == result[-2] else result
return (len(total)-len(result))
col는 열마다 가장 위에 있는 인형이 몇 번째 행에 위치하는지 알기 위한 리스트이다. total은 집어 올린 인형을 모두 나타낸 리스트이고, result는 집어 올린 인형 중 연속해서 쌓여 없어진 인형을 제외한 리스트이다. 0은 빈칸을 의미하므로 0이 아닌 수가 나올 때까지 탐색하고 0이 아닌 수가 나오면 result와 total에 이를 추가한다. 한 번 움직일 때마다 result의 마지막 두 요소가 같은 인형인지 확인하는 과정을 거친다. 모든 과정이 끝나면 사라진 인형을 제외한 나머지 인형의 개수를 리턴한다. 이 문제는 stack을 활용하여 풀 수도 있다.
위클리 챌린지 2주차
def solution(scores):
answer = ''
for index, score in enumerate(list(map(list, zip(*scores)))):
if (max(score) == score[index] or min(score) == score[index])
and score.count(score[index]) == 1:
del score[index]
avg = sum(score) / len(score)
if avg >= 90:
answer += 'A'
elif 80 <= avg < 90:
answer += 'B'
elif 70 <= avg < 80:
answer += 'C'
elif 50 <= avg < 70:
answer += 'D'
else:
answer += 'F'
return answer
n번 학생에게 평가한 모든 점수를 같은 리스트에 담기 위해 행렬을 전치하였다. 학생들이 자기 자신을 평가한 점수가 유일한 최고점 또는 유일한 최저점이라면 그 점수를 제외하고 평균을 구해야 하므로, 조건에 충족하면 해당 점수를 리스트에서 제거하였다.
실패율
import collections
def solution(N, stages):
rates = {}
answer = []
count = 0
for i in range(N):
if count < len(stages):
rates[i+1] = stages.count(i+1)/(len(stages)-count)
else:
rates[i+1] = 0
count += stages.count(i+1)
sorted_answer = sorted(rates.items(), key = lambda x: x[1], reverse = True)
for key, value in sorted_answer:
answer.append(key)
return answer
rates는 스테이지별로 실패율을 담는 dict이다. 실패율이 높은 순으로 정렬하기 위해 sorted와 lambda를 활용하였다. 이후 정렬된 dict의 key값만 리턴하면 된다.
3진법 뒤집기
def solution(n):
result = ''
while n > 0:
n, mod = divmod(n, 3)
result += str(mod)
return int(result, 3)
10진법에서 n진수로 변환할 때는 divmod()를, n진수에서 10진수로 변환할 때는 int()를 활용한다.
비밀 지도
def solution(n, arr1, arr2):
result = []
for i in range(n):
bin_str = str(bin(arr1[i] | arr2[i]))
bin_str = bin_str.replace("0b","")
if len(bin_str) < n:
bin_str = '0'*(n-len(bin_str)) + bin_str
bin_str = bin_str.replace("1","#")
bin_str = bin_str.replace("0"," ")
result.append(bin_str)
return result
두 지도 중 어느 하나라도 벽(1)인 부분은 전체 지도에서도 벽이므로, 비트 연산 중 | 연산자를 사용한다. 그 다음 문자열로 전환하여 #과 공백으로 이루어진 문자열을 리스트에 추가하고, 리스트를 리턴한다.
다트 게임
def solution(dartResult):
total = []
answer = 0
num = ''
for i in range(len(dartResult)):
if dartResult[i].isdecimal():
num += dartResult[i]
if dartResult[i] == 'S':
answer += int(num)**1
total.append(answer)
num = ''
elif dartResult[i] == 'D':
answer += int(num)**2
total.append(answer)
num = ''
elif dartResult[i] == 'T':
answer += int(num)**3
total.append(answer)
num = ''
elif dartResult[i] == '*':
total[len(total)-1] *= 2
if len(total) >= 2:
total[len(total)-2] *= 2
elif dartResult[i] == '#':
total[len(total)-1] *= (-1)
answer = 0
return sum(total)
리스트의 요소가 숫자인 경우 num에 추가하고, S, D, T 중 하나면 num을 계산하여 리스트에 추가한다. *인 경우, 첫 번째 기회인지 아닌지 확인하여 점수를 계산한다.