
https://www.acmicpc.net/problem/1773
문제 전문은 링크 참조
문제가공
- 각자 다른 등차를 가진 등차수열들의 합집합을 구한다.
코드작성
- 등차2 % 등차1 == 0 이면 등차1의 수열은 등차2의 수열의 모든 값을 가지기 때문에 계산할 필요가 없으므로 걸러낸다.
- 값을 구할때, 연산속도가 나눗셈(/,%) 보다는 곱셈(*)이 빠르므로 곱셈을 이용한다.
import sys
N,C = map(int, sys.stdin.readline().split())
interval = []
fireworks = {}
answer = 0
for i in range(1, N + 1):
interval.append(int(sys.stdin.readline()))
interval.sort()
for s_idx,i in enumerate(interval):
if i== 0 : continue
for e_idx in range(s_idx+1,len(interval)):
v = interval[e_idx]
if v ==0: continue
if v % i == 0 :
interval[e_idx] = 0
interval = list(filter(lambda x: x != 0, interval))
for inter in interval:
i = 1
while True:
firework = i * inter
if(i * inter > C):
break
fireworks[firework] = fireworks.get(firework,0)+1
i+=1
print(len(fireworks))
개선된 풀이
문제를 통과하고 나서 다른 사용자들의 풀이를 보니,
입력된 시간(C)만 큼 배열에 공간을 확보하고
배열[폭죽] = 1 을 할당하여 1의 개수를 구하는 형태로 구현했고, 속도도 빨랐다.
리뷰
규칙성을 찾아내는데 한참 애먹었다.
예제(N = 2) 만 봤을 때는 각 수열의 리스트를 더하고, 최소공배수의 갯수를 제거하면 되나 싶었지만, 문제는 1≤N≤100이기 때문에
N ≥3 부터는 최소공배수들의 최소공배수도 계산해야햐고 재귀적으로 흘러가서 그냥 반복문을 때려 박았다.
메모리,시간제한 모두 간당간당하게 통과했다 (2초제한 / 1996ms)
.
.
.
어쨋든 통과했죠?
'Python > 백준 (BOJ)' 카테고리의 다른 글
| [BOJ][B2]좋은 자동차 번호판 - 1871 (0) | 2025.08.14 |
|---|---|
| [BOJ][B2]문어 숫자 - 1864 (0) | 2025.08.13 |
| [BOJ][B2]추론 - 1731 (0) | 2025.08.11 |
| [BOJ][B2]암호- 1718 (0) | 2025.08.10 |
| [BOJ][B2]손익분기점-1712 (1) | 2025.08.09 |