Study/Baekjoon Online Judge
[백준/파이썬] 4619. 루트
growingtree
2022. 10. 24. 19:06
728x90
문제
양의 정수 B와 N이 주어졌을 때, B에 가장 가까운 AN의 정수 A를 찾는 프로그램을 작성하시오. AN은 B보다 작거나, 크거나, 같다.
입력
입력은 여러 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, B와 N이 주어진다.
(1 ≤ B ≤ 1,000,000, 1 ≤ N ≤ 9) 입력의 마지막 줄에는 0이 2개 주어진다.
출력
각 테스트 케이스에 해당하는 A를 출력한다.
아이디어
- 1부터 B까지 N제곱값을 구하자 (A는 B보다 작거나 같은 수 중 하나.)
ex) B가 4일 경우, 1부터 4까지의 N제곱을 구한다. 1의 N제곱,, 2의 N제곱,, 3의 N제곱,,
- B가 최대 1000000까지 가능한데 제곱의 경우 값이 쉽게 커지므로 1부터 B까지 다 돌 필요는 없음.-> B의 절반까지만 반복한다.
- 제곱값과 B값을 뺐을 때의 절대값들을 리스트에 저장한다.
- 가장 작은 경우의 인덱스가 A가 된다.
추가로 생각해야하는 점 : B가 1인 경우, N이 1인 경우
1) B가 1인 경우
N이 무엇이 오던지 상관없이 1 리턴.
2) N이 1인 경우
B의 값 그대로 리턴해줌.
import sys
while True:
B, N = map(int,sys.stdin.readline().split())
if B == N == 0:
break
A = 1
answer = []
if B == 1:
print(1)
continue
if N == 1:
print(B)
continue
for i in range(1, B//2+1):
value = abs(B - i**N)
answer.append(value)
print(answer.index(min(answer))+1)
설명
import sys
while True:
B, N = map(int,sys.stdin.readline().split())
# while True 문의 종료 조건
if B == N == 0:
break
# 제곱값과 B의 차이를 저장하는 리스트
# for 반복문이 1부터 시작하므로 0번째가 1이라고 생각
answer = []
# B가 1인 경우는 : N에 상관없이 1
if B == 1:
print(1)
continue
# N이 1인 경우 : B를 출력
if N == 1:
print(B)
continue
# B도 N도 1이 아닌 경우 : 1부터 B의 절반값까지 반복하며 계산
for i in range(1, B//2+1):
# 제곱값과 B사이의 차이 계산 후 리스트에 저장
value = abs(B - i**N)
answer.append(value)
# 가장 차이가 적은 값(리스트 최소값)의 인덱스 +1 이 A에 해당
print(answer.index(min(answer))+1)
반응형