본문 바로가기
알고리즘/백준 solved.ac PS

[백준][solved.ac][Silver 5][Python] 4796번 : 캠핑

by 빛밤하늘 2021. 6. 12.
반응형

밑의 링크는 백준에서의 문제 링크입니다.

 

4796번: 캠핑

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, L, P, V를 순서대로 포함하고 있다. 모든 입력 정수는 int범위이다. 마지막 줄에는 0이 3개 주어진다.

www.acmicpc.net

 

 

 

 

 

 

 

 

파이썬 코드와 결과입니다.

# readline을 사용하기 위해 import합니다.
from sys import stdin


# 테스트 케이스의 번호를 저장하는 변수를 선언합니다.
# 1부터 시작하므로 1로 초기화합니다.
case = 1

# L, P, V가 모두 0일 때까지 반복합니다.
while True:
    # 캠핑장을 연속하는 P일 중, L일 동안만 사용할 수 있다. 강산이는 이제 막 V일짜리 휴가를 사직했다.의
    # L, P, V를 공백으로 구분해 입력합니다.
    # 1 < L < P < V
    # 각각 정수형으로 변환합니다.
    L, P, V = map(int, stdin.readline().split(' '))

    # L, P, V가 모두 0이라면
    if L == P == V == 0:
        # 반복문을 탈출합니다.
        break

    # 휴가 일수 V를 연속하는 P일로 나눈 몫을 저장하는 변수를 선언합니다.
    P_cnt = V // P
    # 휴가 일수 V를 연속하는 P일로 나눈 뒤의 나머지를 저장하는 변수를 선언합니다.
    remain_day = V % P
    # 캠핑장을 최대로 사용할 수 있는 일수를 저장하는 변수를 선언합니다.
    # P_cnt와 L의 곱으로 초기화합니다.
    camping_day = P_cnt * L

    # remain_day가 L보다 크거나 같다면
    if remain_day >= L:
        # remain_day동안 캠핑장을 사용할 수 있는 L일 모두 캠핑장을 사용할 수 있으므로
        # camping_day에 L을 더해줍니다.
        camping_day += L
    # remain_day가 L보다 작다면
    else:
        # remain_day만큼 더 캠핑장을 사용할 수 있으므로
        # camping_day에 remain_day를 더해줍니다.
        camping_day += remain_day

    # 출력 형식에 맞게 출력합니다.
    print(f'Case {case}: {camping_day}')

    # 테스트 케이스의 번호에 1을 더해줍니다.
    case += 1

결과

 

처음 제출했을 때는 remain_day와 L일의 크기를 비교해주는 것을 고려하지 않고

무작정 camping_day에 remain_day를 더해줘버려서

remain_day가 L보다 클 때, 맞지 않는 결과가 나와 틀렸습니다 결과가 나왔습니다.

 

그리고 풀고나서 카테고리를 확인해봤는데 그리디 알고리즘을 의도한 문제였습니다.

그런데 그리디 알고리즘을 이용해서 이 문제를 푸는 방법이

계산 방법을 통해서 풀었던 제 방식보다 빠른 방법인지는 모르겠습니다.

 

나중에 그리디 알고리즘을 적용해서 한 번 더 풀어봐야겠습니다.

 

 

 

※ 궁금한 부분, 이상한 점 및 오타는 댓글에 부탁드립니다.

※ 더 효율적이고 빠른 정답을 환영합니다.

반응형

댓글