카카오 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단계처럼 느껴지는 난이도인 것 같아요 하하...
언젠가는 가볍게 재미로 올쏠을 하는 날이 올 수 있도록 노력해보겠습니다
