카카오 2019 겨울 인턴십 코딩테스트 풀이입니다
1. 크레인 인형 뽑기 게임
def solution(board, moves):
stack = []
answer = 0
for move in moves:
for b in board:
if b[move - 1] != 0:
stack.append(b[move - 1])
b[move - 1] = 0
break
if len(stack) >= 2 and stack[-2] == stack[-1]:
stack.pop()
stack.pop()
answer += 2
return answer
2. 튜플
from collections import Counter
def solution(s):
s = s.replace("{", '').replace("}", '')
s_l = list(map(int, s.split(',')))
count = Counter(s_l).most_common()
answer = [k for (k, v) in count]
return answer
{2} <- {2, 1}에 비해 내부 갯수가 더 적음
이 때 2가 1보다 먼저 등장했으므로 (2, 1) 과 같다
3. 불량 사용자
from itertools import permutations
def solution(user_id, banned_id):
answer = []
p_l = list(permutations(user_id, len(banned_id)))
for p in p_l:
t = True
for (u, b) in zip(p, banned_id):
if len(u) != len(b):
t = False
break
for (u_c, u_b) in zip(u, b):
if u_b == '*':
continue
if u_c != u_b:
t = False
break
if t:
p = set(p)
if p not in answer:
answer.append(p)
return len(answer)
각 순열의 원소 (p1, p2..., pn) 는 (ban1, ban2..., ban n)과 대응됩니다
4. 호텔 방 배정
from collections import defaultdict
def solution(k, room_number):
r = set()
p = defaultdict(int)
answer = []
for room in room_number:
now = room
visit = [room]
while now in r:
now = p[now]
visit.append(now)
for v in visit:
p[v] = now + 1
r.add(now)
answer.append(now)
return answer
5. 징검 다리 건너기
def solution(stones, k):
start, end = 0, max(stones)
answer = 0
while start <= end:
temp = []
mid = (start + end) // 2
cnt = 0
pos = True
for s in stones:
if s - mid + 1 <= 0:
cnt += 1
if cnt >= k:
pos = False
break
else:
cnt = 0
if pos:
start = mid + 1
if answer < mid:
answer = mid
else:
end = mid - 1
return answer
이상하게 카카오 문제는 2단계도 4단계처럼 느껴지는 난이도인 것 같아요 하하...
언젠가는 가볍게 재미로 올쏠을 하는 날이 올 수 있도록 노력해보겠습니다