https://tech.kakao.com/2022/07/13/2022-coding-test-summer-internship/

 

2022 테크 여름인턴십 코딩테스트 해설

2022년 카카오 여름 인턴십 코딩 테스트가 지난 5월 7일에 5시간에 걸쳐 진행되었습니다. 시간이 부족하여 문제를 풀지 못하는 아쉬움이 없도록 1시간을 늘려 테스트를 진행한 것이 작년과 조금

tech.kakao.com

https://school.programmers.co.kr/learn/challenges?order=recent&page=1&partIds=31236

 

코딩테스트 연습 | 프로그래머스 스쿨

개발자 취업의 필수 관문 코딩테스트를 철저하게 연습하고 대비할 수 있는 문제를 총망라! 프로그래머스에서 선발한 문제로 유형을 파악하고 실력을 업그레이드해 보세요!

school.programmers.co.kr

 

코테 연습

2022 카카오 인터십 기출로 준비하자

 

성격 유형 검사

def solution(survey, choices):
    d = {
        "rion": 0,
        "corn": 0,
        "jay-g": 0,
        "apeach": 0
    }

    answer = []
    for s, c in zip(survey, choices):
        if s in ["AN", "NA"]:
            d["apeach"] += c-4 if s == "NA" else 4-c
        if s in ["JM", "MJ"]:
            d["jay-g"] += c-4 if s == "MJ" else 4-c
        if s in ["CF", "FC"]:
            d["corn"] += c-4 if s == "FC" else 4-c
        if s in ["RT", "TR"]:
            d["rion"] += c-4 if s == "TR" else 4-c

    for character in d:
        if character == "rion":
            answer.append("R" if d[character] >= 0 else "T")
        elif character == "corn":
            answer.append("C" if d[character] >= 0 else "F")
        elif character == "jay-g":
            answer.append("J" if d[character] >= 0 else "M")
        else:
            answer.append("A" if d[character] >= 0 else "N")

    return "".join(answer)
def solution(survey, choices):

    my_dict = {"RT":0,"CF":0,"JM":0,"AN":0}
    for A,B in zip(survey,choices):
        if A not in my_dict.keys():
            A = A[::-1]
            my_dict[A] -= B-4
        else:
            my_dict[A] += B-4

    result = ""
    for name in my_dict.keys():
        if my_dict[name] > 0:
            result += name[1]
        elif my_dict[name] < 0:
            result += name[0]
        else:
            result += sorted(name)[0]

    return result

 

위에 것이 내 답변이고 아래 것이 찾아본 모범 답안이다.
쉬운 구현 문제이기 때문에 빠르게 풀 것으로 계획하고 if문을 도배했다.
여러 분기가 생길 것을 예상하고 어떻게 하면 줄일 수 있을까 짧게 고민했지만 생각나는 것이 없었다.
모범 답안에서 배울 수 있는 것은
입력값을 그대로 딕셔너리 키값으로 이용하면 코드를 줄일 수 있는 것과
딕셔너리를 이용해서 분기를 줄이는 방법이다.
다르게 표현하면 해시를 잘 이용하자  라고 할 수 있다.

 

두 큐 합 같게 만들기

from collections import deque

def solution(queue1, queue2):
    sum_q = sum(queue1) + sum(queue2)
    if sum_q % 2 != 0:
        return -1

    cur_q1, sum_cur_q1 = deque(queue1), sum(queue1)
    cur_q2, sum_cur_q2 = deque(queue2), sum(queue2)
    cnt, ref, num_of_last = 0, sum_q // 2, len(queue1) * 3
    while True:
        if sum_cur_q1 == ref:
            break

        if cnt == num_of_last:
            cnt = -1
            break

        if sum_cur_q1 > ref:
            cur = cur_q1.popleft()
            cur_q2.append(cur)
            sum_cur_q2 += cur
            sum_cur_q1 -= cur
        else:
            cur = cur_q2.popleft()
            cur_q1.append(cur)
            sum_cur_q1 += cur
            sum_cur_q2 -= cur
        cnt += 1
    return cnt
def solution(queue1, queue2):
    target = (sum(queue1) + sum(queue2)) // 2
    cur = sum(queue1)
    queue3 = queue1 + queue2 + queue1

    s = 0
    e = len(queue1) - 1
    answer = 0
    while True:
        if cur == target:
            return answer
        if cur < target:
            e += 1
            if e >= len(queue3):
                return -1
            cur += queue3[e]
        else:
            cur -= queue3[s]
            s += 1
        answer += 1

 

투 포인터로 해결하는 것이 인상적이다.
sum을 매 실행마다 하는 것이 아니라 current_sum을 저장해두고 분기마다 더하거나 빼는 것으로 진행한다.
단순 N의 시간 복잡도를 가지는 문제이나 sum을 N마다 실행해버리면 N^2의 시간복잡도를 가지게 되는 것을 주의하자.