본문 바로가기

백준 (PYTHON)/Bronze

[PYTHON/Bronze V] 백준 3733번 Shares

반응형

 

문제 링크

 

문제 (번역)

 

N명의 사람들과 ACM 수석심판은 총 S 만큼의 주식을 보유하고 있으며, 이를 동등하게 나누어 갖기로 했다. (단, 보유한 주식이 할당받는 인원 수로 나누어 떨어지지 않는 경우 나머지가 발생할 수 있다.) X를 각 사람이 배분받는 몫이라고 가정하자. N과 S가 주어졌을 때, X의 최대값을 계산하라.

 

텍스트 파일로부터 데이터를 읽어오는 프로그램을 작성하라. 각 쌍은 1 ≤ N ≤ 10000 및 1 ≤ S ≤ 109의 정수 쌍으로 이루어져 있다. 항상 정당한 값이 들어오는 입력 데이터는 공백으로 구분되어 있으며 파일의 끝과 함께 종료된다. 아래 예시와 같이 각 숫자 쌍에 대해 프로그램은 X의 최대 값을 계산하고 해당 값을 차례대로 출력한다.

 

 


 

풀이

 

여태까지의 문제 중 가장 애를 많이 먹인 문제. 문제 자체가 어렵진 않으나 조건이 상당히 모호하게 제시되어 있다.

 

문제에는 텍스트 파일로부터 데이터를 읽어와야 한다고 작성되어 있다. 그러나 해당 방식의 데이터 운용은 실상 백준 사이트에서는 불가능하다. 입력 값을 어떻게 줘야하나 정말 오래 고민했는데, 한참이 지나서야 여타 문제와 마찬가지로 input을 사용하면 된다는 사실을 전해들었다. 이 글을 보는 사람들만이라도 나처럼 헷갈리지 않았으면 한다.

 

본 문제는 while 무한 루프와 파이썬의 예외 처리, 즉 try-except-else-finally를 이용하여 풀 수 있다. 

 

※ try:

try문에 작성된 코드를 실행할 경우 오류가 발생하는지 확인한다.

 

※ except (예외 상황):

try문에서 예외 처리가 필요한 상황, 즉 '특정 오류가 발생한 상황'에서 실행할 코드를 작성한다. 여러 개의 오류 예외 처리를 위해 except문을 여러 개 사용하는 것이 가능하다. 

 

※ else:

try문에서 예외 상황이 발생하지 않았을 경우 실행할 코드를 작성한다.

 

※ finally:

예외 상황 발생 유무와 관계 없이 반드시 실행되는 코드를 작성한다.

 

try문에서 N값과 S값을 입력받았을 때, 해당 값이 EOF(End of File) 값이라면 코드는 EOFError를 띄우게 된다. 반대로 이야기하자면, 이 에러가 발생했다는 것은 파일의 끝에 다다랐다는 것을 의미한다는 소리다. 따라서 이 시점에서 except문을 이용해 코드를 종료시키면 문제 조건에 들어맞는 코드를 작성할 수 있다. 

 

 

코드

 

while 1:

	try:
    		N, S = map(int, input().split())
	except EOFError:
    		break
	else:
    		print(S // (N + 1))

 

반응형