본문 바로가기
Algorithm/프로그래머스 문제 풀이

[Level 2] [python] 롤케이크 자르기

by B_Tori 2022. 11. 19.

문제

https://school.programmers.co.kr/learn/courses/30/lessons/132265

 

프로그래머스

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

programmers.co.kr

파이썬 풀이

첫 번째 풀이 (시간 초과)

단순히 for문을 통해 하나씩 차근차근 슬라이싱하며 나눠진 서브 리스트들을 집합 자료형으로 바꿔 중복을 없앤 뒤 길이를 비교하는 방법을 사용하였다.

그러나 대부분의 테스트 케이스에서 시간초과가 발생하였다.

def solution(topping):
    answer = 0
    for i in range(1, len(topping)) :
        a = len(set(topping[:i]))
        b = len(set(topping[i:]))
        if a == b :
            answer += 1
    
    return answer

두 번째 풀이 (다른 사람 풀이 참고)

결국 다른 사람의 풀이를 참고하였다.

colloections모듈의 Counter와 딕셔너리를 사용하는 방법을 사용하였다.

from collections import Counter
def solution(topping):
    answer = 0
    me = Counter(topping)
    bro = {}
    
    for i in range(len(topping)) :
        if topping[i] in bro :
            bro[topping[i]] += 1
        else :
            bro[topping[i]] = 1
        me[topping[i]] -= 1
        
        if me[topping[i]] == 0 :
            del me[topping[i]]
        
        if len(bro) == len(me) :
            answer +=1
    
    return answer

우선 Counter를 통해 어떠한 토핑을 몇 개씩 가지고 있는지 딕셔너리에 담아준다.

처음에는 나에게 모든 롤케이크를 배정하고 한 개씩 동생한테 넘겨주며 길이를 비교한다.

이 과정에서 슬라이싱은 사용하지 않고 단순히 딕셔너리의 값을 변경만 해주기 때문에 시간 복잡도를 줄일 수 있는 것 같다.

 

댓글