https://tech.kakao.com/2022/07/13/2022-coding-test-summer-internship/
https://school.programmers.co.kr/learn/challenges?order=recent&page=1&partIds=31236
코테 연습
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의 시간복잡도를 가지게 되는 것을 주의하자.
'알고리즘' 카테고리의 다른 글
11.18 알고리즘 문제풀이 (0) | 2023.11.18 |
---|---|
다이나믹 프로그래밍 정리 (0) | 2023.11.16 |
11.15 알고리즘 문제풀이 (0) | 2023.11.15 |
오늘의 알고리즘, 소프티어 회의실 예약, 순서대로 방문하기 (0) | 2023.11.04 |
오늘의 알고리즘, 소프티어 수퍼바이러스, 강의실 배정 (0) | 2023.11.03 |