오류 및 알고리즘정리본

#13 프로그래머스 나머지가 1이 되는 수 찾기 & 없는 숫자 더하기

츄98 2023. 5. 1. 22:56

오늘은 월간 코드 챌린지 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에서 두 문제를 풀어보았다.

다양한 방식으로 풀 수 있다는 것이 참 인상깊다~

 

코딩테스트는 관점의 전환.. 사고방식을 어떻게 하느냐에 따라 코드가 복잡해지기도 쉬워지기도 하는 것 같다.

코테에 적합한.. 두뇌를 갖도록 앞으로 더 연습하고 노력해보자 ^^