본문 바로가기
개발/문제풀이

프로그래머스 '롤케이크 자르기' 파이썬 풀이

by beomcoder 2024. 1. 3.
728x90
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/132265
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

def solution(topping):
    ans, front, end = 0, {}, {}
    for t in topping:
        end[t] = end.get(t, 0) + 1
    for t in topping:
        end[t] -= 1
        front[t] = 1
        if end[t] == 0: del end[t]
        ans += len(front.keys()) == len(end.keys())
        # if len(front.keys()) > len(end.keys()): break
    return ans

 

내가 푼 방법

1. 처음에는 for문으로 topping 리스트를 돌면서 한칸씩 옮기면서 양쪽의 리스트를 set으로 묶었다. 그렇게 했더니 테스트케이스는 성공했지만 제출결과에서는 2개빼고 전부 시간초과가 나왔다. 그래서 다른 방법을 생각해야했다.

 

2. 두번째는 토핑의 개수를 전부 센다음, 한칸씩 이동하면서 토핑을 옮기는 방식을 사용했다. 

for t in topping:
        end[t] = end.get(t, 0) + 1

'''
처음 for문에선 토핑의 개수를 전부 세주었다.
딕셔너리의 get은 end[t]와 거의 같은 의미이다.

end[t]로 값을 가져올때는 없다면 오류가 발생하지만,
get으로 가지고 온다면 None으로 가지고 온다. 
end.get(t, default=None)이기때문에 default부분을 0으로 바꾸어주었다.
'''

for t in topping:
    end[t] -= 1
    front[t] = 1
    if end[t] == 0: del end[t]
    ans += len(front.keys()) == len(end.keys())

'''
두번째 for문에서는 토핑을 한칸씩 옮기면서 end의 토핑을 front에 옮겼다.
end의 같은 토핑들을 전부 옮겨 0이 됐다면, key를 없애주었다.
토핑의 총 개수는 상관없이 서로 다른 토핑의 개수가 같아야 하기 때문이다.

그래서 정답에 front의 서로다른토핑의 개수와 end의 서로다른토핑의 개수가 같다면
1을 추가하여주었다.
'''

# if len(front.keys()) > len(end.keys()): break

'''
만약 숫자가 더 컸다면 주석을 사용했을 것 같다.
'''

 

 

728x90
반응형

댓글