[Python] 백준 4796번(캠핑) - 문자열 포메팅(f-string)

2021. 9. 2. 00:39Programming/Python

문제

등산가 김강산은 가족들과 함께 캠핑을 떠났다. 하지만, 캠핑장에는 다음과 같은 경고문이 쓰여 있었다.

캠핑장은 연속하는 20일 중 10일동안만 사용할 수 있습니다.

강산이는 이제 막 28일 휴가를 시작했다. 이번 휴가 기간 동안 강산이는 캠핑장을 며칠동안 사용할 수 있을까?

강산이는 조금 더 일반화해서 문제를 풀려고 한다. 

캠핑장을 연속하는 P일 중, L일동안만 사용할 수 있다. 강산이는 이제 막 V일짜리 휴가를 시작했다. 강산이가 캠핑장을 최대 며칠동안 사용할 수 있을까? (1 < L < P < V)

입력

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

출력

각 테스트 케이스에 대해서, 강산이가 캠핑장을 최대 며칠동안 사용할 수 있는지 예제 출력처럼 출력한다.


아이디어

1. 크게 아이디어라고 할 만한 건 없고 각 수의 관계를 살펴보니 쉽게 이해가 됐다.

 

ex) 연속하는 20일 중 10일만 이용가능 총 휴가일 수 28일(총 휴가일 수 28일 // 연속하는 일수 20일) * 이용가능 일수 10일 + (총 휴가일 수 28일 % 연속하는 일수 20일)

 

처음에 이렇게 생각해서 이대로 알고리즘을 구성했지만 틀렸다고 나왔다. 다시 확인해보니 특정 경우를 간과했었다.

예를 들어 연속하는 20일 중 5일만 이용가능 하고 총 휴가일 수가 28일이면 답이 달라진다. 그러나 내가 짜놓은 알고리즘대로면 이 경우도 앞의 예와 똑같은 답을 출력하게 된다. 따라서, 이 특정 경우만 if문을 활용해서 알고리즘에 추가해주면 된다.

코드

새롭게 알게 된 것

1. 처음에 입력값을 받을 때, [0, 0, 0]을 입력받을 때까지 계속해서 입력을 시켜야 하는데 이 부분을 잘몰라서 애를 먹었다. 결국 떠올린게 while문과 if문을 활용하는 거였는데, 다행히 올바르게 작동했다. 다른 분들 코드를 참고해보니 이렇게 간단하게 몇 줄로 표현하는 방법도 있다.

 

while True:

  test = list(map(int, sys.stdin.readline().split()))

  if test == [0, 0, 0]

     break

 

2. 나의 경우, 문자열 포메팅을 잘몰라서 내 코드를 보면 출력값 표현을 하는데 무려 4줄이나 소모한 걸 확인할 수 있다.

그런데 f-string을 활용하면 아래와 같이 한 줄로 표현가능하다.

 

print(f'Case {count}: {answer_list[i]}')

 

즉 특정한 변수 값을 지정해줘야 하는 부분만 {}로 감싸주고 나머지는 문자열로 채워주면 된다. 간단하다.

만약 중괄호도 출력하고 싶고 변수도 출력하고 싶을 때는 중괄호를 세 개를 써주면 된다.

 

{{{변수}}}