[백준] 1676, 1966 - Python3

shsh·2021년 10월 4일
0

백준

목록 보기
10/45

1966. 프린터 큐

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

내 풀이 - 성공

from sys import stdin

T = int(stdin.readline())

for _ in range(T):
    N, M = map(int, stdin.readline().split())
    q = list(map(int, stdin.readline().split()))
    nums = [i for i in range(N)]
    i = 0
    while i < N:
        if i+1 < N and q[i] < max(q[i+1:]):
            q.append(q.pop(i))
            nums.append(nums.pop(i))
        else:
            i += 1
            
    print(nums.index(M)+1)

(우선순위, 인덱스) 형태로 저장하고
min-heap, deque, ... 써봤는데 잘 안됐다...ㅎ

그래서 그냥 우선순위가 담긴 리스트 q 와 문서의 번호를 담은 nums 두개의 리스트를 사용
문서의 순서가 바뀔 때마다 q 와 nums 동시에 변경하도록 함

우선순위 값을 하나씩 보면서 자신 이후에 큰 값이 존재하면
q 와 nums 모두 pop 한 후 맨 뒤에 다시 append

큰 값이 없다면 다음 값 확인하러 넘어감 => i += 1

nums 에서 M 의 위치 + 1 을 print 해주면 된다

  • max(q[i+1:]) 에서 slicing 하지 않고
    그냥 max(q) 로 하고 q[i] 와 같으면 아예 pop 만 해서 제거해도 됐을 듯


1966. 팩토리얼 0의 개수

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

내 풀이 - 성공

from sys import stdin

N = int(stdin.readline())
ans = 0

five = 5
while five <= N:
    for n in range(five, N+1, five):
        ans += 1
    five *= 5
print(ans)

전에 leetcode 에서 비슷한 문제 풀었던 게 생각났다

0 의 개수는 곧 2*5 = 10 의 개수와 관련이 있다
=> 2 는 5 보다 무조건 많은 개수를 가지니까 생각하지 않고 오직 5 의 개수만 세주기

이 때, 25, 50, 75, ... 와 같이 5 가 여러개 있는 숫자 처리 주의
=> 25 = 5 * 5, 50 = 5 * 5 * 2, ...

따라서 5 의 제곱수들의 배수까지 모두 세줌

처음엔 5 부터 시작해서 5 의 배수 모두 세주고
그 다음엔 25 (5 의 제곱) 부터 시작해서 25 의 배수 모두 세주고, 125 ...

profile
Hello, World!

0개의 댓글