알고리즘

[프로그래머스] [PCCE 기출문제] 9번 / 지폐 접기

swanzzz 2025. 3. 11. 16:35
반응형

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

우선 문제부터 정의해 보겠습니다.

 

1. 지폐를 지갑에 넣기 위해 주어진 지폐를 절반씩 접습니다.

 

2. 지폐의 길이 중 더 길이가 긴 곳을 반으로 접습니다.

 

3. 만약 지폐가 바로 들어가거나 혹은 90도 회전했을 때 들어간다면 지폐를 그만접고 접은 횟수를 출력합니다.

 

문제 자체는 간단합니다.

주어진 지폐를 접는데 지갑에 들어갈때 까지 접으면 되는 것 입니다.

 

또한 제한사항을 확인해 보면 wallet 과 bill 에 주어지는 지폐의 종류는 1장이고 가로와 세로의 길이가 담겨있다는 것을 알 수 있습니다.

 

그렇다면 주어진 지폐에 대해 지갑에 들어가도록 가장 큰 부분을 접고 지갑에 들어갈 때까지 무한반복 하여야 하니 while 문을 떠올릴 수 있습니다.

 

이제 while 문의 조건을 생각해 보겠습니다.

 

지폐는 지갑에 들어갈 때 까지만 접으면 되니 반대로 어느 한부분이라도 지갑에 들어가지 않는다면 지폐를 계속 접어야 합니다.

 

즉 bill의 가장 작은부분 -> min(bill) 이

wallet의 가장 작은부분 -> min(wallet) 보다 크다면 반으로 접어야 하고

 

마찬가지로

bill의 가장 큰 부분 max(bill) 이 wallet의 가장 큰 부분 max(wallet) 보다 크다면 반으로 접어야 합니다.

 

따라서 코드로 작성해 보면 다음과 같이 됩니다.

 

def solution(wallet, bill):
    answer = 0
    
    # 종료조건 어느 한쪽이 지갑보다 큰 경우에는 무한 반복
    while min(bill) > min(wallet) or max(bill) > max(wallet):
        
        # 더 큰쪽 찾아서 접기
        if bill[0] > bill[1]:
            bill[0] = bill[0] // 2
        else:
            bill[1] = bill[1] // 2
        
        # 정답 +1
        answer += 1
        
    return answer

 

while 문의 수행 조건으로 가장 작은 부분이 큰 경우 또는 가장 큰 부분이 더 큰 경우 계속해서 while문이 동작하도록 설정해 주었습니다.

 

여기에 더 큰쪽을 찾아서 반으로 접고 접은 횟수를 더해줍니다.

 

만약 while 문을 탈출 했다면 지폐가 지갑에 들어갔다는 의미이니 정답을 출력해주면 됩니다.

 


[결과]

반응형