백준

[백준] 상근타워 #3541

곽가누 2025. 1. 16. 01:51

기억할 것 

n이 엄청 크다 (1000000 그이상 ) -> 시간 초과 날 가능성이 있다

문제

상근이는 남는 돈으로 매우 높은 빌딩 "상근타워"를 지었다.

상근타워에는 엘리베이터가 m개가 있다. 각 엘리베이터에는 두 버튼이 있다. i번째 엘리베이터의 한 버튼은 ui 층을 올라가는 버튼이고, 다른 버튼은 di층 내려가는 버튼이다.

상근타워의 가장 아래층(로비)은 0층이고, 그 다음 층부터는 증가하는 자연수이다. 엘리베이터를 타고 지하로 내려갈 수 없으며, 건물은 매우 높아 끝이 없다고 가정한다.

상근이는 상근타워의 로비에 서있다. 이제, 엘리베이터중 하나를 골라서 타려고 한다. 엘리베이터를 탄 이후에는 다른 엘리베이터로 바꿔탈 수 없다. 이때, 엘리베이터 버튼을 정확하게 n번 눌러서 갈 수 있는 가장 낮은 층(로비는 제외)을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 n과 m이 주어진다. (1 ≤ n ≤ 1,000,000, 1 ≤ m ≤ 2,000) 다음 m개 줄에는 각 엘리베이터의 버튼 ui와 di가 주어진다. (1 ≤ ui, di ≤ 1000)

출력

엘리베이터를 타고 버튼을 n번 눌러서 갈 수 있는 가장 낮은 층을 출력한다.

예제 입력 1 복사

10 3
15 12
15 4
7 12

예제 출력 1 복사

13
 

 

처음엔 아 그냥 구현만 하면 되지 하고 암생각없이 풀어서 시간초과 남,, 계속 계산되는 부분은 최소공배수 개념을 이용하여 쳐내는 게 필요. 

 

오답 코드

import sys
n, m = map(int, sys.stdin.readline().split())
elevators = []
for i in range(m):
    a,b = map(int, sys.stdin.readline().split())
    elevators.append((a,b))


tmp = []

for elevator in elevators:
    current = 0
    for j in range(n):
        if current > elevator[1] : 
            current -= elevator[1]
        else :
            current += elevator[0]

    tmp.append(current)
print(min(tmp))

 

정답 코드

import sys
import math 
n, m = map(int, sys.stdin.readline().split())
elevators = []
for i in range(m):
    a,b = map(int, sys.stdin.readline().split())
    elevators.append((a,b))


tmp = []

for elevator in elevators:
    current = 0
    lcm = math.lcm(elevator[0], elevator[1])
    k =( n % (lcm //elevator[0] + lcm //elevator[1])) + lcm //elevator[0] + lcm //elevator[1]

    for j in range(k):
        if current > elevator[1] : 
            current -= elevator[1]
        else :
            current += elevator[0]

    tmp.append(current)

print(min(tmp))

 

 

 

'백준' 카테고리의 다른 글

연속합 #1912  (0) 2024.11.18
포도주 시식 #2156  (0) 2024.11.18
빙산 #2573  (0) 2024.08.18
단어 공부 #1157  (0) 2024.08.16
합분해 #2225  (0) 2024.08.11