양의 정수를 나눌 수 있는 최소의 양의 정수

jinatra·2021년 8월 8일
0

Python

목록 보기
8/15
post-thumbnail

양의 정수를 나눌 수 있는 최소의 양의 정수


Q.

find_smallest_integer_divisor 라는 이름의 함수를 구현해 주세요.

find_smallest_integer_divisor 함수는 하나의 parameter를 받습니다.

Parameter 값은 integer만 주어집니다.

find_smallest_integer_divisor 주어진 parameter 값을 나눌 수 있는 1을 제외한 최소의 양의 정수를 return하여야 합니다.

예제:

find_smallest_integer_divisor(15) == 3


1번 풀이

처음 문제를 봤을 땐 상대적으로 제한을 걸어둔게 많아 보여서 쉽다고 생각했다.
'오 ㅋㅋ 쉽네' 라고 생각하며 아래와 같이 코드를 짰다.

example = 19

def find_smallest_integer_divisor(num):
    i = 2
    while num % i == 0:
        return i
    else:
        return i += 1

print(find_smallest_integer_divisor(example))


# Output
return i += 1
             ^
SyntaxError: invalid syntax

SyntaxError가 발생했다.
지금 다시 와서 회고하자니 내가 저때 무슨 생각으로 저걸 짰는지도 잘 기억이 안난다.

아마..
i는 1보다 큰 정수여야 하므로 2부터 시작을 하고, 나머지가 0이면 일단 약수는 맞으니 return을 하려고 했던 것 같다.
그리고 False일 시 1을 더해서 해당 while문을 다시 실행하고자 했던것 같다.


2번 풀이

생각해보니 모든 약수를 구해야하는 것이 아닌, 1을 제외한 최소 약수 하나만 구하면 되는 것이니 굳이 == 0 이라는 logi을 쓸 필요가 없다고 생각했다.

그래서 아래와 같이 다시 짜보았다.

example = 19

def find_smallest_integer_divisor(num):
    i = 2
    while num % i != 0:
        return i
    i += 1

print(find_smallest_integer_divisor(example))


# Output
2

엥?
2가 나왔다..
그러고나서 다시 보니 return문과 다음 정수로 넘어가는 i += 1 을 반대로 두어서 while문을 충족하는 2를 바로 출력을 한 듯 했다.

저 두 코드의 순서를 바꿔서 다시 짜보았다.


3번 풀이

example = 19

def find_smallest_integer_divisor(num):
    i = 2
    while num % i != 0:
        i += 1
        return i

print(find_smallest_integer_divisor(example))


# Output
3

3이 떴다.
분명히 오류는 없어보이는 듯 했으나 다시 보니 return문의 indent를 잘못 설정했다.

위와 같이 돌아갔을 때는 아래와 같이 logic이 돌아간다.

  1. 19와 2를 나눈 나머지가 0이 되냐?
  2. False
  3. 그럼 2+1을 해서 3이 나온다
  4. 그래도 3을 return해라
  5. 3

그래서 return문의 indent를 제대로 해서 아래와 같이 해보았다.


4번 풀이

example = 19

def find_smallest_integer_divisor(num):
    i = 2
    while num % i != 0:            #while 안의 조건문이 True일동안 반복
        i += 1                     #while 안의 조건문이 false면 탈출해서 리턴
    return i

print(find_smallest_integer_divisor(example))


# Output
19

이번엔 내가 원해는 대로 나왔고, example값을 바꾸어도 정상적으로 출력이 되는 것을 볼 수 있었다.
위와 다른 점은..
return이 while문에 indent 되어있지 않으므로, 5번 코드와 6번코드를 끊임없이 반복하는 것이다.

정리하면 아래와 같다.

  1. 19와 2를 나눈 나머지가 0이 되냐?
  2. False
  3. i += 1을 수행하여 3이 나오고 다시 19를 나눈 나머지가 0이 되냐?
  4. False
    .
    .
    .
  5. i += 1을 수행하여 19가 나오고 다시 19를 나눈 나머지가 0이 되냐?
  6. True
  7. i값 출력
  8. 19





Take Away

Inden의 중요성

파이썬에서 들여쓰기를 통해 존속성을 나타내는 것이 중요하다고 배웠는데, 막상 겪어보니 이거 은근히 어려운 것 같다.
지금이야 10줄 안쪽에서 끝나는 코드라 별 탈 없겠지만, 나중에 가게되면 미친 분량의 코드를 만나게 될텐데 벌써부터 눈물이 난다.

이런 사소한 실수는 기본기가 중요하다고 생각하는데.. 파이썬도 역시나 기본기를 충실히 다지는데 주력을 해야할 것 같다.

어렵다 파이썬!

profile
으악

0개의 댓글