Simple is IT, 누구나 보고 누구나 깨닫는 IT

[Coding Test] Goorm Level_어느 개발자 이야기 본문

Simple is IT/Programming

[Coding Test] Goorm Level_어느 개발자 이야기

currenjin 2020. 8. 1. 13:27
이런 부분은 이렇게 사용했으면 좋겠다! 싶거나 추가했으면 하는 내용은 과감히 댓글 부탁드립니다.

 

[어느 개발자 이야기 ★ * 5]

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

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

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

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

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

 

입력: 변경된 데이터 입력

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

 

입출력 예시 1)

input:
15

output:
11

 

입출력 예시 2)

input:
61

output:
8

 


문제를 보고서 좀 아리송했습니다. 정확히 어떤걸 구하라는걸까? 역시 한국어가 제일 어렵군요

 

입출력 예시를 보니 감이 오더군요.

입력이 61이었을 때, 해당 숫자는 N진법으로 변환되어있는 숫자입니다.
그리고 이 숫자는 (10진수인 어떤 수)의 제곱인 형태에요.
여기서 61을 10진법으로 변환했을 때 49, 7^2 = 49이므로 7이 어떤 수입니다.

여러 진법으로 표현될 수 있는 수에서 자연수 제곱근이 나올 수 있는 가장 작은 진법을 구하라는 것이군요.

 

더보기를 클릭하면 제가 삽 푼 내용을 볼 수 있답니다 :)
더보기

제가 생각한 프로세스는 이렇습니다.

  1. N진법에서의 N은 결과와 일치할 때까지 반복되어 증가합니다.
  2. (10진수인 어떤 수)또한 결과와 일치할 때까지 반복되어 증가합니다.
  3. (10진수인 어떤 수)를 제곱하여 N진법으로 변환했을 때, (변경된 데이터)와 값이 일치하면 N을 출력합니다. 

 

바로 코딩에 돌입했습니다. 처음엔 코드를 이렇게 작성했어요,

def solution(num):
   for i in range(2, 16):
       for j in range(2, 99):
           if num == int(str(j ** 2), i):
               return i

int('x', base)는 숫자 x를 i진법으로 변환하는 문법입니다.

 

실행해보니 오류가 나더군요.

if num == int(str(j ** 2), i):
ValueError: invalid literal for int() with base 2: '4'

그래도 일단 결과를 보고싶어 예외처리를 해보고 조금 다듬었죠.

def solution(num):
    for i in range(2,99):
        for j in range(2,99):
            tmp = str(j ** 2)
            try:
                if num == int(tmp, i):
                    return i
            except ValueError as err:
                pass

 

이랬더니 결과는 예상했던 것과 정반대였습니다! 위 입출력 예시와 같이 15를 입력했더니 출력은 9, 61을 입력했더니 13이 나왔어요.

입력된 수 자체를 다른 진법으로 변환해버렸기 때문입니다. 원래 입력된 수는 이미 N진법으로 변환되어있는 상태 그대로인데 말이죠.

문제를 잘 못 이해했습니다.

 

다시 와서, 중요한 포인트를 집어보자면 입력된 값은 이미 N진법으로 변환되어있는 수 입니다.

그렇기 때문에 N진법으로 변환되어있는 수를 다시 10진수로 돌리는 작업을 진행하고, result라는 변수에 기입한 뒤 제곱근의 성질을 이용해서 int(result ** 0.5)와 result ** 0.5를 비교할 것입니다. 만약 어떤 자연수의 제곱이라면 소수점이 없어 둘의 비교 결과는 진실이겠죠.

 

작성한 코드는 이렇습니다!

def solution(num):
    for i in range(2, 100):
        result = 0

        for j in range(len(num)):
            result += (int(num[-(j+1)]) * (i ** j))

        if result ** 0.5 == int(result ** 0.5):
            return i

print(solution(input()))

이렇게 작성하고 문제 예시의 61을 입력하니 4라는 결과가 나왔어요.

맞다.. 4진수는 6이 없지.. 다시 끄적끄적

 

최최최종 코드입니다.

변환된 데이터를 10진수로 계산하려면 자리마다의 수는 무조건 진법 N보다 작아야 계산을 하게 만들었어요. 이때, 진법보다 자리의 수가 커 break하게 된 수가 if문에 통과하는게 문제였어요. 그래서 값을 추가할 때마다 증가하는 cnt변수와 그 값의 총 자리수를 비교하는 구문을 추가했습니다.

def solution(num):
    num = num[::-1]
    
    for i in range(2, 100):
        result = 0
        cnt = 0

        for j in range(len(num)):
            if int(num[j]) < i:
                result += int(num[j]) * (i ** j)
                cnt += 1
            else:
                break

        if len(num) == cnt and result ** 0.5 == int(result ** 0.5):
            return i
					
print(solution(input()))

 

 

 

HyunJin-Jeong/Practice_CodingTest-Python

코딩능력 향상을 위해 다양한 문제를 접해봅니다! with Python. Contribute to HyunJin-Jeong/Practice_CodingTest-Python development by creating an account on GitHub.

github.com

Comments