SWEA
[SWEA] 16800. 구구단 걷기 (Python/D3)
dev스카이
2024. 11. 14. 19:57
[문제 링크] 👇
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
풀이 방법
💡 약수 이용하기
N 이 10 일 경우 최소 이동 경로는 다음과 같다. 아래 그림은 곱셈표이다.
2와 5는 10의 약수와 같다. 따라서 10의 약수를 구해야 하는데, 두 수의 곱의 차가 가장 작은 i와 j 를 구해야 한다.
(1, 1) 에서 (2, 5) 까지 가려면, i는 2가 되어야 하고, j는 5가 되어야 한다.
- i ➜ 2 - 1 = 1
- j ➜ 5 - 1 = 4
따라서 답은 1 + 4 = 5 이다.
Solution
T = int(input()) # 테스트 케이스 수
for test_case in range(1, T + 1):
N = int(input())
# N 약수 구하기
min_num = N
x, y = 0, 0
for i in range(1, int(N**0.5) + 1):
if N % i == 0:
if (N // i) - i < min_num: # 약수의 차가 제일 작은 거
x = i
y = N // i
result = (x - 1) + (y - 1)
print(f"#{test_case} {result}")
개선할 곳
약수를 구하고 최소 차이를 찾는 부분에서 min_num 변수를 활용하지 않고, 단순히 (N // i) - i가 최소일 때 값을 바로 x와 y에 할당하도록 하여 코드를 더 간결하게 할 수 있다. 또한 min_num은 초기화를 할 필요가 없으므로 제거해도 된다.
개선된 코드
T = int(input()) # 테스트 케이스 수
for test_case in range(1, T + 1):
N = int(input())
x, y = 1, N # 초기 값을 1과 N으로 설정
for i in range(1, int(N**0.5) + 1):
if N % i == 0:
# 현재 i에 대해 (N // i) - i가 최소일 때 x, y 업데이트
if (N // i) - i < y - x:
x, y = i, N // i
result = (x - 1) + (y - 1)
print(f"#{test_case} {result}")