#13 프로그래머스 나머지가 1이 되는 수 찾기 & 없는 숫자 더하기
오늘은 월간 코드 챌린지 3에서 두 문제를 가지고 페어프로그래밍을 해보았다.
1. 나머지가 1이 되는 수 찾기
자연수 n이 매개변수로 주어집니다.
n을 x로 나눈 나머지가 1이 되도록 하는 가장 작은 자연수 x를 return 하도록 solution 함수를 완성해주세요.
답이 항상 존재함은 증명될 수 있습니다.
def solution(n):
for i in range(2, n):
if n%i == 1:
return i
어차피 0과 1은 결과값이 되지 못하므로 2부터 시작해서 나머지가 1이 되는 수가 나오면 return을 하도록 했다.
그런데, 이렇게 끝내기 좀 아쉬워서 다른 방식으로도 풀어보았다.
def solution(n):
result = 2
while n%result != 1:
if result > n/2:
result = n-1
else:
result += 1
return result
원리는 똑같지만 방식이 조금 다르다.
사실 x가 n의 1/2을 넘어가면 아무리 나누어도 n-1이 되기 전까지는 나머지가 1이 되지 않는다.
예로 들어 14의 절반 7보다 큰 수로 나누면, 14%8 = 6, ... 14%13 = 1 로.. n-1인 13이 되기 전까지는 나머지 1이 되지 않는다. 이를 이용하면 조금 더 빨리 수를 구할 수 있을 것 같다. 그래서
if result > n/2:
result = n-1
이 부분을 추가해주었다.
2. 없는 숫자 더하기
0부터 9까지의 숫자 중 일부가 들어있는 정수 배열 numbers가 매개변수로 주어집니다. numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요.
내 풀이는 이렇다!
def solution(numbers):
sum = 0
for i in range(10):
if i not in numbers:
sum+=i
return sum
없는 숫자를 찾아서 다 더해주었다 :)
이걸 한 줄로 이렇게 줄일 수도 있다.
def solution(numbers):
return sum([i for i in range(10) if i not in numbers])
팀원들의 풀이 중 인상깊었던 풀이는 집합을 사용하는 방법!!
def solution(numbers):
return sum(set(range(10)) - set(numbers))
# 혹은
def solution(numbers):
nums = set([0,1,2,3,4,5,6,7,8,9])
a = nums.difference(numbers)
answer = sum(a)
return answer
# 혹은
def solution(numbers):
return sum(set(range(10)) - set(numbers))
집합의 성질(같은 값이 중복되지 않는다는 것!)을 이용하여 푼 것이 인상깊었다.
이 외에도 다른 풀이를 보니
def solution(numbers):
return 45 - sum(numbers)
이런 소오름 돋는 풀이도 있었다 :) 아주 재밌다!!!
이 풀이를 조금 바꾸면 1부터 10이 아니라 n까지의 숫자 중 없는 숫자를 다 더할 수도 있을 것 같다.
solution = lambda x: sum(range(n)) - sum(x)
이렇게 일반화할 수 있을 것 같다!
오늘은 월간코드챌린지 3에서 두 문제를 풀어보았다.
다양한 방식으로 풀 수 있다는 것이 참 인상깊다~
코딩테스트는 관점의 전환.. 사고방식을 어떻게 하느냐에 따라 코드가 복잡해지기도 쉬워지기도 하는 것 같다.
코테에 적합한.. 두뇌를 갖도록 앞으로 더 연습하고 노력해보자 ^^