Study/Baekjoon Online Judge

[백준/파이썬] 4619. 루트

growingtree 2022. 10. 24. 19:06

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

 

문제 

양의 정수 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)
반응형