# 문제
34619번: 소대 배정
https://www.acmicpc.net/problem/34619
34619번: 소대 배정
오늘은 하늘이가 공군 기본군사훈련단에 입소하는 날이다. 하늘이가 배정된 대대에는 a개의 중대가 있고, 각 중대에는 b개의 소대가 있으며, 각 소대에는 정확히 n명의 훈련병이 배정된다.
www.acmicpc.net
# 접근
a는 중대의 수, b는 소대의 수, n은 소대당 인원, k는 하늘이의 입소 순서이다.n과 k에서의 연산을 통해 하늘이가 몇 번째 소대에 배정되는지 구하고, 그 소대가 몇 중대 몇 소대인지를 구하면 된다.
예를 들어 n = 3이라면, k = 7, 8, 9일 때 하늘이는 모두 3번째 소대에 입소할 것이므로 이 케이스에서 모두 같은 값을 내는 식을 만들면 된다. k/n 값을 올림하는 식이 위 조건을 만족한다.
| n | 3 | 3 | 3 | 3 | 3 |
| k | 6 | 7 | 8 | 9 | 10 |
| math.ceil(k/n) | 2 | 3 | 3 | 3 | 4 |
따라서 이제 m = math.ceil(k/n)이라 둔 다음, m번째 소대가 몇 중대 몇 소대인지를 구하면 된다.
i를 구하는 것도 m을 구한 것과 동일하게 m을 b로 나눈 뒤 올림해주면 된다. 만약 한 중대에 소대가 4개 있다면 5, 6, 7, 8번째는 모두 2중대에 들어가야 하기 때문이다.
j는 그보다 단순하게 그냥 m을 b로 나눈 나머지가 된다. 단, j가 0일 경우에는 j를 b로 설정해줘야 한다. 그렇지 않으면 a = 2, b = 3, m = 6 같은 경우에 2중대 0소대와 같은 결과가 나오게 되기 때문이다.
# 풀이
import math
a,b,n,k = map(int, input().split())
m=math.ceil(k/n)
i=math.ceil(m/b)
j=m%b
if j==0:
j=b
print(i,j)위 접근을 그대로 구현하였다. 올림 기능을 사용하기 위해 math 라이브러리의 ceil() 함수를 사용하였다.
추가로 다음 두 코드는 똑같이 작동한다.
#방법 1
j=m%b
if j==0:
j=b
#방법 2
j = (m - 1) % b + 1방법 1의 경우는 j의 범위가 0부터 b-1까지이기 때문에 0일 경우에 j를 b로 바꿔주는 작업을 거쳐야 한다.
반면에, 방법 2의 경우는 m을 (m - 1)로 만든 후 최종 연산 결과에 1을 더해 j의 범위를 자동으로 1부터 b 까지로 설정해준다.
방법 2가 훨씬 깔끔하지만 노베이스로 구현하는 입장에서는 방법 1을 더 쉽게 떠올릴 수 있을 것으로 보인다.
'개발 > 백준 문제풀이' 카테고리의 다른 글
| [백준] 30052번: 거리 두기 게임 [C/C++] (2) | 2023.10.05 |
|---|---|
| [백준] 15565번: 귀여운 라이언 [C/C++] (0) | 2023.10.03 |