Waterbear

백준 13458: 시험감독 본문

프로그래밍/알고리즘 문제풀이

백준 13458: 시험감독

노간 2019. 9. 9. 09:27

문제

https://www.acmicpc.net/problem/13458

 

13458번: 시험 감독

첫째 줄에 시험장의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 각 시험장에 있는 응시자의 수 Ai (1 ≤ Ai ≤ 1,000,000)가 주어진다. 셋째 줄에는 B와 C가 주어진다. (1 ≤ B, C ≤ 1,000,000)

www.acmicpc.net

풀이

만약 시험장에 있는 응시자의 수(x)가 총감독관이 관리 가능한 수(A) 보다 작거나 같다면, 시험장에는 총 감독관 1명이 필요할 것이다. 만약 크다면 2가지 경우가 있다.

1.  x-A를 부감독관이 관리 가능한 수(B)로 나눴을 때 나머지가 0인경우

2. 나머지가 0 이상인 경우

나머지의 몪에 1의 경우 0, 2의 경우 1을 더한다.

 

코드

 

숏코딩 분석

내 코드는 내 코드지만 남이 잘한 코드를 분석하는게 공부가 제일 많이 되는 것 같다.

 

백준의 코드골프 네임드인 sait2000 님의 코드다. (분석을 위해 ;를 개행으로 바꿨다.)

input()
a,[b,c]=eval('map(int,input().split()),'*2)
print(sum(1-min(0,(b-n)//c)for n in a))

파이썬에서는 배열을 입력받을 때 굳이 배열의 길이를 알 필요가 없다. 따라서 N을 사용하지 않으므로 값을 저장하지 않았다.

내가 map 구문을 2번 반복한데 비해 eval함수를 이용해 한번에 값을 받았다.

eval을 풀어서 쓰면 다음과 같다. 

a,[b,c] = map(int,input().split()), map(int,input().split()),

이해가 안되는 부분은 마지막 쉼표가 에러를 발생시키지 않는 부분이다. (실제로 실험해보니 예외가 발생하지 않는다)

대괄호를 써서 각각의 map object를 원하는 대로 입력시키는 부분은 좋은 구문인 것 같다.

0인경우를 체크할 때 min을 쓰는 거는 진짜 상상도 못한 구문이다.

n-b가 아니라 일부러 b-n을 하여서... 음수를 받아오는 구문? 와 정말... 아름답다

list comprehension구문을 대괄호로 안 감싸고 이런 방법으로 사용할 수 있는것도 처음 알았다.

'프로그래밍 > 알고리즘 문제풀이' 카테고리의 다른 글

백준 14503: 로봇청소기  (0) 2019.09.09
백준 14500: 테트로미노  (0) 2019.09.09
07. WILDCARD  (0) 2019.05.27
06. FANMEETING  (0) 2019.05.27
05. FENCE  (0) 2019.05.13
3 Comments
  • 프로필사진 Sait2000 2020.05.12 00:28 이 글을 보고 6바이트 줄였습니다 ^^
  • 프로필사진 Sait2000 2020.05.12 00:33 해설을 좀 하자면 저 남는 콤마는 trailling comma라고 해서 파이선 뿐만 아니라 콤마가 쓰이는 여러 언어에서 마지막 부분에 일부러 콤마 하나를 더 쓰는 걸 허용합니다. 그렇게 하는 편이 diff가 예쁘다던가 하는 점이 있어서 그렇대요. a,[b,c]는 튜플이라서 대입이 가능합니다. (a, [b, c]) = ... 이렇게 쓸 수도 있어요. (b-n)//c는 파이선의 음수 나눗셈이 C++하고 달라서 -ceil((n-b)/c)이 됩니다.
  • 프로필사진 노간 2020.06.19 20:39 신고 와! 영광입니다. 항상 많이 참고하고 있습니다.
    의아하게 생각했는데 명칭이 있었군요 새로운 사실을 배워갑니다. 댓글 감사합니다 ^^
댓글쓰기 폼