본문 바로가기
파이썬/파이썬 알고리즘

파이썬 백준 13458번 시험 감독

by Go! Jake 2021. 3. 23.

 

풀이 과정

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

음수 값을 고려하지 않고 한참을 헤맸다. 반례에는 반드시 음수가 나올 수 있는 건 아닌 지 검토가 필요하다.

 

 

댓글