본문 바로가기
파이썬 기초

[파이썬 기초] 4.5. 조건문과 반복문 활용하기

by 빈이름 2024. 6. 20.

반복문과 조건문은 코딩에 필수적인 요소이면서 본격적으로 코딩 머리를 써야 되는 요소이기 때문에 간단한 코딩 문제를 풀면서 연습을 많이 해보는 걸 추천드린다고 했었죠. 그런데 처음 하는 입장에서 무대포로 문제를 풀어보는 것도 힘들 수 있죠. 간단한 문제를 몇가지 같이 풀어보면서 좀 더 감을 잡아 보도록 합시다.

 

우선 문제를 보고, 혼자서 직접 코딩을 먼저 어느정도 해보고 해설을 보는 것을 추천드립니다.

 

Q1. 정수로 이뤄진 리스트를 입력 받았을 때, 리스트의 값들 중 홀수 값들만 리스트에 담아 반환하는 함수를 작성해 보세요.

def solution(list_A):
    odds = [] # 여기에 홀수 값들을 담으면 됩니다.
    return odds
    
# 아래 코드를 실행했을 때 우측의 주석처리된 결과가 나오면 됩니다.
solution([1, 2, 3, 4, 5]) # [1, 3, 5]
solution([12, 14, 17, 19, 21]) # [17, 19, 21]

 

 

 

 

 

 

 

 

어땠나요? 처음 코딩 해보는 입장에서 충분히 짤 수 있는 난이도였다고 생각은 들지만 혹시 못했더라도 너무 낙담하지 말고 같이 봐보도록 합시다.

 

우선 제가 작성한 정답 코드를 먼저 봐보겠습니다. 코딩에 정답은 없기 때문에 만약 여러분이 짠 코드와 다르다고 해서 여러분이 짠 코드를 꼭 수정할 필요는 없습니다. 다만 저는 어떻게 접근했고 어떤 식으로 코딩을 했는지를 설명해 보도록 하겠습니다.

 

우선 문제를 봤을 때 리스트에 접근한다는 말이 있기 때문에 for문을 활용해야겠다는 생각이 먼저 들었습니다. 그래서 우선 for문을 이용해 리스트의 변수값들에 접근합니다.

def solution(list_A):
    odds = []
    for a in list_A:
        print(a)
        
    return odds

그리고 리스트의 각 요소값들이 홀수인지를 판별해야 합니다. 그러면 조건문이 필요하겠죠?

홀수는 2로 나눠 떨어지지 않는 수를 뜻합니다. 그러니 홀수인지를 판별하기 위해선 정수를 2로 나눈 나머지가 1인지를 조건으로 걸면 확인할 수 있을 겁니다.

def solution(list_A):
    odds = []
    for a in list_A:
        if a%2 == 1:
            odds.append(a)
        
    return odds

그리고 해당 조건을 만족했을 때, 출력하고 싶은 결과 리스트에 그 값을 추가하면 되겠죠? 최종적으로 위와 같이 코드를 작성할 수 있을 것 같습니다.

 

별로 어렵지 않죠? 다음 문제로 넘어가 보겠습니다.

 

 

Q2. 정수를 입력 받았을 때, 해당 정수의 약수들을 리스트에 담아 출력하는 함수를 작성해 보세요.

def solution(A):
    alis = []
    # 이 부분에 코드를 작성하시면 됩니다.
    return alis
    
solution(10) # [1, 2, 5, 10]
solution(15) # [1, 3, 5, 15]

 

 

 

 

 

 

 

 

이번 문제는 조금 더 어려웠을 것 같습니다. 우선 약수란 A라는 정수를 어떤 수들로 나눴을 때 나머지 없이 나눠 떨어지는 수를 말합니다. 예를 들어 10의 약수는 [1, 2, 5, 10]이 되는 거죠.

 

그러면 약수를 찾으려면 어떻게 할까요? 만약 여러분이 직접 찾고자 한다면 1부터 숫자를 1씩 증가 시키면서 나눠보는 방법을 사용할 수 있을 겁니다.

 

숫자를 1씩 증가시키기 좋은 코딩 문법이라 하면 for문이 생각나야 합니다.

for i in range(10):
    print(i)

그리고 약수는 입력 받은 수보다 크지는 않겠죠? 그리고 0도 약수에 포함되지는 않습니다. 그러니 약수인지 확인해야 할 수의 범위는 1부터 입력 받은 수까지가 될겁니다.

def solution(A):
    alis = []
    for i in range(1, A+1):
        print(i)
    return alis

약수인지 확인하는 방법은 뭘까요? 우선 '약수일 때 어떤 일'을 수행해야 하기 때문에 조건문을 써야겠죠. 그리고 조건은 약수의 정의에 따라 입력 받은 수 A를 현재 숫자로 나눴을 때 나머지가 0인지를 확인해 봐야 할 겁니다.

그리고 해당 조건을 만족했을 때, 정답 약수들을 담을 리스트 alis에 해당 수를 담으면 됩니다.

def solution(A):
    alis = []
    for i in range(1, A+1):
        if A%i == 0:
            alis.append(i)
    return alis

그러면 위와 같이 코드를 쓸 수 있겠네요. 할만하죠?

 

 

Q3. 두 정수를 입력 받았을 때, 두 정수의 최대공약수를 출력하는 함수를 작성해 보세요. (최대공약수란, 두 정수의 공통되는 약수들 중에서 가장 큰 수를 말합니다.)

def solution(A, B):
    # 이 부분에 코드를 작성하시면 됩니다.
    # 2번 문제의 함수를 활용하면 더 쉽겠죠?
    return
    
solution(10, 15) # 5
solution(27, 81) # 27

 

 

 

 

 

 

 

 

 

3번 문제는 좀 어려울 겁니다. 일단 최대공약수를 찾기 위해선 각 수의 약수들을 찾아야 할겁니다. 그러니 일단 2번 문제에서 사용했던 약수를 찾는 함수를 먼저 가져오겠습니다.

def get_alis(A):
    alis = []
    for i in range(1, A+1):
        if A%i == 0:
            alis.append(i)
    return alis

함수 이름은 약수를 가져온다는 의미를 나타내기 위해 'get_alis'로 수정했습니다.

최대 그럼 일단 이 함수를 이용해 입력 받은 2개의 수의 약수 리스트들을 먼저 계산하겠습니다.

def get_alis(A):
    alis = []
    for i in range(1, A+1):
        if A%i == 0:
            alis.append(i)
    return alis

def solution(A, B):
    A_alis = get_alis(A)
    B_alis = get_alis(B)
    
    return

그럼 A_alis와 B_alis 리스트에는 각각 정수 A와 B의 약수들이 담겨 있을 겁니다. 이제 두 리스트 사이에 공통된 값을 찾으면 되겠네요.

 

어떤 값이 리스트에 속하는지를 확인하기 위해 사용하는 명령어는 'if a in A:' 와 같은 조건문을 사용할 수 있습니다.

그러니 A_alis의 요소 값들을 순회하면서 각 요소 값들이 B_alis에도 있는지 확인을 하면 될 것 같습니다.

리스트 값들을 순회할거기 때문에 for문을 쓰고 그 안에 조건문을 넣는 식으로 코드를 짜면 될 것 같네요.

def get_alis(A):
    alis = []
    for i in range(1, A+1):
        if A%i == 0:
            alis.append(i)
    return alis

def solution(A, B):
    A_alis = get_alis(A)
    B_alis = get_alis(B)
    
    for a in A_alis:
        if a in B_alis:
            print(a)
    
    return

이제 위 코드를 실행하면 A와 B의 공통 약수들이 출력까진 될것 같네요. 이제 그 중에서 가장 큰 약수를 찾아야 합니다.

가장 먼저 생각나는 방법은 새로운 리스트에 공통 약수들을 추가한 뒤에 max() 명령어를 사용해 찾는 방법이 있을 것 같습니다.

def get_alis(A):
    alis = []
    for i in range(1, A+1):
        if A%i == 0:
            alis.append(i)
    return alis

def solution(A, B):
    A_alis = get_alis(A)
    B_alis = get_alis(B)
    
    common_alis = []
    
    for a in A_alis:
        if a in B_alis:
            common_alis.append(a)
            
    max_common_ali = max(common_alis)
    
    return max_common_ali

 

 

 

 

혹은 A_alis와 B_alis의 약수들이 크기 순으로 정렬되어 있다는 사실을 생각한다면 굳이 리스트를 새로 만들지 않고도 최대 공약수를 찾을 수 있습니다.

def get_alis(A):
    alis = []
    for i in range(1, A+1):
        if A%i == 0:
            alis.append(i)
    return alis

def solution(A, B):
    A_alis = get_alis(A)
    B_alis = get_alis(B)
    
    max_common_ali = 0
    for a in A_alis:
        if a in B_alis:
            max_common_ali = a
    
    return max_common_ali

A_alis와 B_alis가 크기 순으로 정렬되어 있기 때문에 마지막으로 찾는 공약수가 최대 공약수일 수밖에 없습니다. 따라서 for문을 돌면서 공약수를 찾을 때마다 max_common_ali의 값을 갱신하면 최종적으로 max_common_ali에 최대 공약수가 담길 수 밖에 없습니다.

 

조건문과 반복문을 활용하는 방법에 대해 좀 더 감이 잡히길 바라면서 간단하게 문제와 풀이를 보여드렸습니다. 코딩을 많이 하다보면 이정도 문제는 크게 생각하지 않아도 자동적으로 for문과 if문을 사용하는 자신을 볼 수 있을 겁니다.

 

조건문과 반복문은 여기서 마치겠습니다. 감사합니다.