🔒 문제
https://programmers.co.kr/learn/courses/30/lessons/87389
문제 설명
자연수 n이 매개변수로 주어집니다. n을 x로 나눈 나머지가 1이 되도록 하는 가장 작은 자연수 x를 return 하도록 solution 함수를 완성해주세요. 답이 항상 존재함은 증명될 수 있습니다.
제한사항
- 3 ≤ n ≤ 1,000,000
입출력 예
n | result |
10 | 3 |
12 | 11 |
입출력 예 설명
입출력 예 #1
- 10을 3으로 나눈 나머지가 1이고, 3보다 작은 자연수 중에서 문제의 조건을 만족하는 수가 없으므로, 3을 return 해야 합니다.
입출력 예 #2
- 12를 11로 나눈 나머지가 1이고, 11보다 작은 자연수 중에서 문제의 조건을 만족하는 수가 없으므로, 11을 return 해야 합니다.
🔓 풀이
🔑 요구사항 파악
1. 요구사항 : 자연수 N을 X로 나눈 나머지가 1이 되는 가장 작은 자연수 찾기
2. Type
- Input | n: int (3<=n<=1,000,000)
- Output | answer: int
🔑 문제 해결 방법 고민하기
1 자연수 N을 X로 나눈 나머지가 1이 되는 가장 작은 자연수 찾기
- 답이 될 수 있는 가장 작은 수인 2부터 1씩 더한 수 x로 차례대로 나누어 나머지가 1인 x 찾기
<고민의 흔적>
🔑 문제 해결 / 코드
def solution(n):
answer = 2
while n % answer != 1:
answer += 1
return answer
print(solution(10))
print(solution(12))
💉 피드백
1. 접근 방법
정답이 될 수 있는 가장 작은 자연수인 2부터 시작해서 정답이 나올 때까지 1씩 더한 수 나누기를 반복하는 while 반복문을 사용해서 문제 해결. n의 범위가 3 <= n <= 1,000,000 이어서 차례대로 계산해도 성능에 문제가 없을 거라 생각했다(시간 복잡도)
2. 다른 사람 풀이
답안을 제출하고 다른 사람의 풀이를 보다 보니 코드 몇 줄 추가로 효율(성능)을 증가시킬 수 있을 거 같아서 시도해보았다.
n의 범위에 제한이 없을 경우 좀 더 효율적인 코드가 좋은 답안 같아서 시도.
- 접근 방법
기본 전제는 전과 동일하지만 사실 x가 n의 1/2을 넘어가면 아무리 나누어도 n-1이 되기 전까지는 나머지가 1이 되지 않는다.
ex) 10의 1/2인 5보다 큰 수로 나누게 되면 ( 10 % 6 = 4, 10 % 7 = 3, 10 % 8 = 2, 10 % 9 = 1 ) n - 1인 9로 나눌 때만 나머지가 1이 된다.
따라서 while 반복문에 x 가 n의 1/2 보다 크면 정답을 바로 n-1로 해주는 조건문을 추가하면 끝!
# 업그레이드
def solution(n):
answer = 2
while n % answer != 1:
if answer > n/2:
answer = n - 1
else:
answer += 1
return answer
print(solution(10))
print(solution(12))
'알고리즘' 카테고리의 다른 글
[프로그래머스] [1차] 비밀지도_Python level1 (0) | 2022.05.26 |
---|---|
[프로그래머스] 부족한 금액 계산하기_Python level1 (0) | 2022.05.24 |
[프로그래머스] 최소직사각형_Python level1 (0) | 2022.05.23 |
[프로그래머스] 2016년_Python level1 (0) | 2022.05.23 |
[프로그래머스] 두 개 뽑아서 더하기_Python level1 (0) | 2022.05.20 |