👨🏫ps/❄️프로그래머스
[프로그래머스] 롤케이크 자르기 [python]
peacekim
2023. 3. 24. 23:44
반응형
문제
생각보다 간단한 문제이다.
처음에는 list를 계속 slicing 해서 set으로 변환 후, 크기 체크를 할까 했는데, O(n^2)이여서 타임아웃이 날 거 같아서 다른 방법을 생각했다.
dictionary를 두 개 사용해서 풀었다.
처음에 철수의 dictionary에 topping에 있는 값을 key로 그리고 각 topping의 갯수를 value로 저장하였다.
앞에서부터 동생의 케이크에 토핑을 하나씩 추가하고, 철수의 토핑에서는 동생에 추가한 토핑을 -1하였다. 그래서 제거한 토핑의 갯수가 0이 되었다면, 철수의 dictionary에서 해당 토픽을 완전히 삭제하였다.
둘의 dictionary의 크기를 비교하여, 크기가 같다면 공정하게 나눈 것 이기 때문에 +1을 해주었다.
토핑에서 제거하는 것은 dictionary의 del을 사용하여 O(1)이였고, 추가하는 것도 dictionary를 사용하여 O(1)이였다.
총 O(N)의 시간복잡도를 가지는 로직이다.
다른 사람이 푼 코드보니, collections에 있는 Counter를 사용하면 첫번째 for문을 안해줘도 된다.
코드
def solution(topping):
answer = 0
# 철수 케이크
bro1 = {}
for t in topping:
if t in bro1:
bro1[t] += 1
else:
bro1[t] = 1
#동생 케이크
bro2 = {}
for t in topping:
# 둘의 딕셔너리 크기가 같다면 동일한 크기로 나눈거
if len(bro2) == len(bro1):
answer += 1
# 동생 케이크에 해당 토핑이 없다면 토핑 추가
if t not in bro2:
bro2[t] = 1
# 철수 토핑에는 하나 빼주기
bro1[t] -= 1
# 만약 철수가 해당 토핑을 아예 가지고 있지 않다면 제거
if bro1[t] == 0:
del bro1[t]
return answer
"""
토핑의 개수에 상관없이 각 조각에 동일한 가짓수의 토핑이 올라가면 공평하게 롤케이크가 나누어진 것이다.
[1,2,1,3,1,4,1,2] 세번째 토핑과 네번째 토핑 사이를 자르면 롤케이크의 토핑은 [1,2,1], [3,1,4,1,2]로 나뉘게 된다.
공평하게 자르는 방법, 무조건 두조각으로 나눠야함.
"""
반응형