라떼는말이야

[구름LEVEL - 별 5개] 어느 개발자 이야기 (파이썬) 본문

알고리즘/코딩 테스트

[구름LEVEL - 별 5개] 어느 개발자 이야기 (파이썬)

MangBaam 2021. 8. 1. 21:32
반응형

문제 설명

누구보다도 열심히 회사를 다니던 개발자가 갑자기 회사에서 해고 통보를 받았습니다. 그는 화가나서 회사에 대한 복수를 계획했는데요.

회사 데이터베이스 관리자로 일하던 그는 회사의 데이터베이스를 망가뜨려 놓습니다. 회사에서는 난리가 났는데요.

백업 데이터베이스 자료까지 지운 개발자의 치밀함에 혀를 내둘렀습니다. 다행스러운 것은 그 개발자는 복구는 할 수 있게 힌트를 남겼다고 합니다.

 

힌트: 변경한 데이터를 N진법으로 표현했을 때 어떤 수의 제곱이 되는 최소값 N가 원래 데이터입니다.

회사의 위기 탈출을 위해 이 문제를 해결하는 프로그램을 작성하십시오.

 

입력

변경된 데이터 입력

출력

데이터를 N진법으로  표현햇을 때 어떤 수의 제곱이 되는 최소값 N

 

입출력 예시

예시 1

입력

15

출력

11

 

예시 2

입력

61

출력

8

 


나의 풀이

 

# -*- coding: utf-8 -*-
# UTF-8 encoding when using korean
def isRoot(n):
	n = n ** (1/2)
	return True if n%1 == 0 else False

def changeExp(exp, n):
	expo = 0
	result = 0
	for i in n[::-1]:
		result += int(i) * (exp**expo)
		expo += 1
	return result

def solution(n):
	expo = int(max(n)) + 1
	while not isRoot(changeExp(expo, n)):
		expo += 1
	return expo

n = input()
print(solution(n))

왜 별 5짜리인지 이해가 안가는 쉬운 문제이다.

 

함수를 이용해서 풀었는데 함수 설명은 다음과 같다.

 

 

 

isRoot() 함수는 입력 받은 숫자가 제곱수인지 판별한다.

방법은 n을 제곱근을 씌운 결과가 정수이면 제곱근, 그렇지 않고 소수점 밑의 숫자가 있으면 제곱수가 아니다.

1로 나누어 나머지가 0인지 확인하며 제곱수인지 판별했다.

 

changeExp() 함수는 진법과 숫자를 입력 받으면 해당 진법으로 숫자를 바꿔서 리턴해준다.

학교에서 배운 방법과 동일하다.

진법 계산

오른쪽 수부터 진법의 0제곱, 1제곱 ... 이렇게 곱하여 더하면 된다.

 

solution() 함수는 위 2개의 함수를 가지고 실제 계산을 진행한다.

우선 어떤 수가 N 진법일 때 한 자리에 올 수 있는 숫자는 0 ~ (N-1) 까지이다.

예를 들어 10진법이라면 한 자리 수에 0 ~ 9가 올 수 있고, 8진법이라면 한 자리 수에 0~7이 올 수 있다.

 

즉, 어떤 수가 주어지면 그 수를 이루는 숫자 중 가장 큰 숫자보다 더 큰 진법의 수임을 알 수 있다.

예를 들어 257이 주어지면 최소한 8진법 이상의 수이다. 2~7진법은 될 수 없다.

 

그렇기에 soultion() 함수에서 시작 진법을 숫자 중 가장 큰 수보다 1 큰 수로 시작했다.

그리고 진법 수를 하나씩 늘리며 제곱 수가 될 때까지 반복을 해서 결과를 반환한다.

 

그 결과가 답이 된다.

반응형
Comments