NIRVANA

[level 1] 나머지가 1이 되는 수 찾기 본문

Coding test(Python3)/Programmers

[level 1] 나머지가 1이 되는 수 찾기

녜잉 2023. 7. 4. 15:47

 

문제

자연수 n이 매개변수로 주어집니다. n x로 나눈 나머지가 1이 되도록 하는 가장 작은 자연수 x를 return 하도록 solution 함수를 완성해주세요. 답이 항상 존재함은 증명될 수 있습니다.

 

문제 풀이 접근법 1

처음에는 다음과 같은 알고리즘으로 접근했었다. 

 

1) n 입력 받음

2) for문에서 i를 1씩 증가 → n을 i로 나누었을 때, 나머지가 1인지 확인

3) 만약 나머지가 1이면 해당 i값을 return

*i를 1부터 1씩 증가하므로 처음으로 나머지가 1이 나오는 수가 가장 작은 x일 것

 

 

하지만 결과 값이 예상대로 나오지 않았다. 원래라면 3*3 = 9이므로 n이 10일 때, 나머지가 1이되게 하는 가장 작은 자연수 x는 3이지만 위의 알고리즘에서는 3*1=3이므로 10을 3으로 나눈 나머지는 7이 된다.

 

그래서 다시 고민해다가 생각난 방법이 소수를 사용하는 것이었다. 

 

문제 풀이 접근법2

 

10 - 1 = 9

12 - 1 = 11

7 - 1 = 6

다음과 같이 몇 가지 예제를 적어 보았을 때, n값을 1로 나누었을 때 나오는 몫을 소인수 분해 하면 원하는 대로 가장작은 x값을 찾을 수 있음을 알 수 있었다. 따라서 

 

1) n을 입력 받음 

2) n-1값이 소수인지 확인 

3) 만약 n-1값이 소수라면 그대로 값을 return 

4) n-1값이 소수가 아니라면, n-1의 약수를 구하여 리스트에 저장한 뒤, 가장 작은 약수를 return 

 

def solution(n):
    answer = 0
    N = n-1
    divisor = []
    
    for i in range(2, N):
        if N % i == 0:
            divisor.append(i)
            answer = divisor[0]
            break
            
        else:
            answer = N
    
    return answer

 

처음에는 약수가 잘 생각이 안나서 소인수분해로 접근했었다. 

사실 쉬울 줄 알았는데 은근 고민을 하는 문제였다. 

더 깔끔하게 풀 수 있을 것 같다

나중에 다시 풀어봐야지

'Coding test(Python3) > Programmers' 카테고리의 다른 글

[level 1] x만큼 간격이 있는 n개의 숫자  (0) 2023.07.06
[level 1] 평균 구하기  (0) 2023.07.06
[level 1] 짝수와 홀수  (0) 2023.07.05
[level 1] 자릿수 더하기  (0) 2023.07.05
[level 1] 약수의 합  (0) 2023.07.04