문제
정보 초등학교 6학년 여학생들은 단체로 2박 3일 수학여행을 가기로 했다. 학생들이 묵을 숙소에는 방의 정원(방 안에 있는 침대 수)을 기준으로 세 종류의 방이 있으며, 같은 종류의 방들이 여러 개 있다. 정보 초등학교에서는 학생들에게 이 방들을 배정하되, 배정된 모든 방에 빈 침대가 없도록 하고자 한다.
예를 들어, 방의 종류가 5인실, 9인실, 12인실이고 6학년 여학생 전체가 113명 이라면, 5인실 4개, 9인실 5개, 12인실 4개를 예약하면 각 방에 남는 침대 없이 배정이 가능하다. 또한 12인실은 사용하지 않고 5인실 10개와 9인실 7개만 사용하는 것도 가능하다. 그러나 방의 종류가 3인실, 6인실, 9인실이고 6학년 여학생 전체가 112명이라면 빈 침대 없이 방을 배정하는 것은 불가능하다.
방의 정원을 나타내는 서로 다른 세 자연수와 전체 학생 수를 나타내는 자연수 하나가 주어졌을 때, 배정된 모든 방에 빈 침대가 없도록 방 배정이 가능한지를 결정하는 프로그램을 작성하시오. 단, 세 종류의 방은 모두 충분한 개수가 있다고 가정하며, 위의 예에서와 같이 세 종류의 방을 모두 활용하지 않고 한 종류 또는 두 종류의 방만 이용하여 배정하는 것도 허용한다.
입력
표준 입력으로 방의 정원을 나타내는 서로 다른 세 자연수 A, B, C (1 ≤ A < B < C ≤ 50)와 전체 학생 수를 나타내는 자연수 N (1 ≤ N ≤ 300)이 공백으로 분리되어 한 줄에 주어진다.
출력
빈 침대 없이 배정이 가능할 경우 표준 출력으로 1을, 불가능할 경우 0을 출력한다.
예제 입력 15 9 12 113
|
예제 출력 11
|
예제 입력 23 6 9 112
|
예제 출력 20
|
풀이
남는 침대가 없도록 방을 배정하는 문제이다.
입력의 수가 작아 브루트 포스로도 해결할 수 있으며, 만약 입력이 커질 경우엔 동적 계획법으로 풀이가 가능하겠다.
n이 a, b, c의 배수일 경우엔 그 방으로만 전부 배치하면 되므로 1을 출력한다.
아닐 경우엔 a와 b를 loop를 통해 차례대로 더해가며 나온 수를 n에서 뺀 나머지가 c로 나누어 떨어지는지 확인한다.
나누어 떨어질 경우 1을, 반복이 끝날 때까지 그런 경우가 없다면 0을 출력한다.
def solve():
a,b,c,n = map(int,input().split())
cur = 0
if n%a==0 or n%b==0 or n%c==0:
return 1
for i in range(n//a+1):
cur = a*i-b
for j in range(n//b+1):
cur += b
if cur > n:
break
if (n-cur)%c==0:
return 1
return 0
print(solve())
'알고리즘 연습 > 브루트 포스' 카테고리의 다른 글
[🥈2 / 백준 2615 / 파이썬] 오목 (0) | 2022.04.27 |
---|---|
[🥉1 / 백준 1145 / 파이썬] 적어도 대부분의 배수 (0) | 2022.04.21 |
[🥇1 / 백준 1285 / 파이썬] 동전 뒤집기 (0) | 2022.04.14 |
[🥉1 / 백준 9506 / 파이썬] 약수들의 합 (0) | 2022.01.28 |
[🥉2 / 백준 10448 / 파이썬] 유레카 이론 (0) | 2022.01.27 |