[BOJ] 13458. 시험 감독

Jimeaning·2023년 4월 10일
0

코딩테스트

목록 보기
71/143

Python3

문제

입출력

입출력 예시

키워드

  • 구현

나의 풀이 (시도)

import sys

n = int(sys.stdin.readline())

a = map(int, sys.stdin.readline().split())
b, c = map(int, sys.stdin.readline().split())

ans = 0

for i in range(n):
    for j in a:
        j -= b
        ans += 1
        while j > 0:
            j -= c
            ans += 1
print(ans)

시간초과가 떴다. 아마 반복문을 너무 많이 써서 그런 거 같다.

주요 포인트

n은 어차피 정수만 들어오기 때문에 int를 쓰지 않아도 된다.
int(stdin.readline()) 대신 stdin.readline()을 사용하면 시간이 28ms 단축된다.

a는 입력받고 리스트로 처리한다.
b, c는 입력받고 map에 넣는다.

총 감독 숫자가 될 변수 ans를 선언하고 0으로 초기화한다.

반복문 (강의실 개수만큼 반복)
1. 만약 총감독관(b)이 한 강의실에 배정된 학생 수(a[i])보다 많다면,
학생 수에서 감시 가능한 인원만큼 빼준다.
총 감독관 수를 1 늘린다.

  • 부감독관 수 구하기
    1) 만약 남은 학생 수가 부감독관이 맡을 수 있는 학생만 있으면 (a[i] % c == 0)
    총 감독관에 a[i]를 c로 나눈 몫만큼 더한다.
    2) 만약 나누어 떨어지지 않으면
    총 감독관에 a[i]를 c로 나눈 몫 + 1만큼 더한다.
  1. 만약 학생 수보다 총감독관(b)이 맡을 수 있는 학생이 더 많다면,
    총감독관 수를 1 늘린다.

최종 총감독관 수를 출력한다.

최종 코드

import sys

n = sys.stdin.readline()

a = list(map(int, sys.stdin.readline().split()))
b, c = map(int, sys.stdin.readline().split())

ans = 0

for i in range(len(a)):
    if a[i] > b:
        a[i] -= b
        ans += 1
        
        if a[i] % c == 0:
            ans += a[i] // c
        else:
            ans += (a[i] // c) + 1
    else:
        ans += 1
print(ans)

추가

(23.4.13 업데이트)

import sys

n = int(sys.stdin.readline())
a = list(map(int, sys.stdin.readline().split()))
b, c = map(int, sys.stdin.readline().split())

gam = 0
gam += n

for i in range(n):
    a[i] -= b
    if a[i] > 0:
        if (a[i] % c) == 0:
            gam += a[i] // c
        else: gam += a[i] // c + 1
        
print(gam)

gam은 총 감독의 수를 저장하는 변수이다.

  • 어차피 총감독관은 한 강의실에 한 명만 들어갈 수 있으므로 강의실 수만큼 미리 더했다.
  • 총감독관이 관리할 수 있는 학생 수를 먼저 빼준다.
  • 만약 강의실에 있는 학생이 남았다면, 두 가지 경우로 나눠 부감독관 수를 계산한다.
    1) 남은 학생 수와 부감독관이 관리할 수 있는 학생 수를 나눴을 때 나누어 떨어지면
    그대로 나눠준 후 몫을 gam 변수에 더한다.
    2) 나누어 떨어지지 않으면,
    나눠준 몫 + 1만큼 더한다.

(+ 23/5/19)

n = int(input())
a = list(map(int, input().split()))
b, c = map(int, input().split())

ans = 0
ans += n

for i in a :
    i -= b
    if i > 0 :
        if i % c == 0 :
            ans += i // c
        else : ans += i // c + 1

print(ans)

sys.stdin.readline 쓸 필요 없음 (804ms에서 620ms까지 줄임)

피드백

형변환이 시간을 더 잡아먹는다는 것을 알게 되었다. 시간초과를 해결하기 위해 코드를 더 다듬고 고민하는 과정이 필요한 문제였다.

참고

https://velog.io/@dding_ji/baekjoon13458

profile
I mean

0개의 댓글