풀이 과정
number=int(input())
students=list(map(int,input().split()))
B,C = map(int,input().split())
idx=0
for i in students:
students[idx]=i-B
if students[idx]<=0:
students[idx]=0
idx+=1
idx=0
total=0
for i in students:
if students[idx]%C!=0:
total+=students[idx]//C+1
idx+=1
else:
total+=students[idx]//C
idx+=1
print(total+number)
<1> 각 리스트 요소에 같은 값 (총 감독관)을 빼 주는 작업
for i in students:
students[idx]=i-B
if students[idx]<=0:
students[idx]=0
idx+=1
- for i in students: 를 구성하면, i는 students의 요소를 하나씩 꺼내오게 된다.
이 때 꺼내온 i에 B값을 빼 준다. (총감독관이 한번에 감시할 수 있는 수)
- students[idx] = i - B로 정의하면, students의 각 요소마다 B를 뺀 값이 입력되게 된다.
idx는 각 몇번째 요소에 넣을 것인지 정의하기 위해 쓰인다.
- 계산이 끝나면 idx는 1씩 증가시킨다. (다음 index가 계산될 수 있도록)
- B를 뺐을 때 각 요소에 음수가 입력되지 않도록 주의한다. 최종 계산 결과가 정상적으로 나오지 않게 된다.
<2> 필요한 부감독관 숫자 구하기
for i in students:
if students[idx]%C!=0:
total+=students[idx]//C+1
idx+=1
else:
total+=students[idx]//C
idx+=1
- students의 각각의 요소마다 C (부감독관이 한번에 감시할 수 있는 수)로 나눈 후 나머지가 있으면 C로 나눈 몫에 1을 더 해 준다. C로 나누어도 나머지가 남는다면, 1명을 더 배치해야 되기 때문이다.
예를 들어, 3명의 학생이 있고 2명을 감시할 수 있는 감독관이 있다면, 나머지가 1이 되어 1을 감시할 수 있는 감독관이 1명 더 필요하기 때문이다.
- 이 문제를 통해 느낀 것은, 나머지와 몫은 항상 짝을 이뤄 문제 풀이에 쓰인다는 점이었다.
오답노트
for i in students:
students[idx]=i-B
if students[idx]<=0:
students[idx]=0
idx+=1
음수 값을 고려하지 않고 한참을 헤맸다. 반례에는 반드시 음수가 나올 수 있는 건 아닌 지 검토가 필요하다.
'파이썬 > 파이썬 알고리즘' 카테고리의 다른 글
파이썬 코드업 1004번 1004 : [기초-출력] 출력하기04(설명) (0) | 2021.03.25 |
---|---|
파이썬 코드업 1001번 1001 : [기초-출력] 출력하기01(설명) (0) | 2021.03.25 |
파이썬 백준 2828번 사과 담기 게임 (0) | 2021.02.23 |
파이썬 백준 13301번 수학 합 (0) | 2021.02.20 |
파이썬 백준 8393번 수학 합 (0) | 2021.02.16 |
댓글