본문 바로가기
파이썬/연습하기

[파이썬]짝수와 홀수 정리하기

by 코키드 Cokid 2022. 10. 22.
반응형

이번 포스팅에서는 일련의 숫자들을 받아 홀수와 짝수를 받아 정렬하여 출력하는 코드를 작성해보자.

 

홀수와 짝수 정렬하기

다만 홀수와 짝수의 개수가 다를 경우 숫자를 같게 맞추며 홀수는 오름차순, 짝수는 내림차순으로 번갈아가면서 출력을 해야 한다. 아래 예시를 보자

 1 6 3 5 2 7 4
→  1 6 3 4 5 2 

홀수는 1 3 5 7, 짝수는 6 2 4가 들어왔는데, 짝수와 홀수의 개수가 맞지 않아 짝수처럼 3개로 맞춘 후 홀수는 오름차순 짝수는 내림차순으로 번갈아가면서 출력이 돼야 한다.

 

입력값 받기

user_input = input("숫자들을 공백없이 입력하세요> ")
nums_list = set([int(x) for x in '_'.join(user_input).split('_')])
print(nums_list)

우선 유저로부터 입력을 받을 건데, 각 숫자를 개별적으로 나누기 위해 문자열로 입력을 받을 것이다.

그 후 join 함수로 각 문자 사이에 언더바(_)를 삽입하여 리스트로 만든 후 다시 split 함수로 리스트로 만들었다.

이렇게 하는 이유는 공백 없이 인풋을 받을 때 split으로 쪼개기 어렵기 때문이다.

그리고 set의 집합 성질을 이용하여 중복된 입력을 처리해준다.

결과를 실행해보자.

#결과 출력
숫자들을 공백없이 입력하세요> 1635274
{1, 2, 3, 4, 5, 6, 7}

 

홀수와 짝수 그룹 나누기

컴프리헨션으로 num_list에 있는 짝수와 홀수를 나눠보자.

odd_nums = [x for x in nums_list if x%2!=0]
even_nums = [x for x in nums_list if x%2==0]
odd_nums.sort()
even_nums.sort(reverse=True)
print(odd_nums, even_nums)
#결과 출력
[1, 3, 5, 7] [6, 4, 2]

2로 나눠서 0이 아니면 odd_nums에 0이면 even_nums로 넣는다.

홀수 리스트는 sort함수로 오름차순으로 정렬하고 짝수 리스트는 sort함수의 reverse 파라미터를 사용하여 역으로 정렬한다.

 

홀수와 짝수 개수 맞추기

while True:
    if len(odd_nums) != len(even_nums):
        if len(odd_nums) > len(even_nums):
            del(odd_nums[-1])
        elif len(odd_nums) < len(even_nums):
            del(even_nums[-1])
    else: break

while문을 통해 홀수의 개수와 짝수의 개수가 같지 않을 경우 if문을 실행한다. 홀수는 큰 수부터 지우고 짝수는 작은 수부터 지울 것이기 때문에 길이가 더 긴 리스트는 끝 자리의 수 하나가 del함수로 삭제되고, 길이가 같아지면 break를 통해 while문을 탈출한다.

 

결과 출력하기

result = []
for i in range(len(odd_nums)):
    result.append(odd_nums[i])
    result.append(even_nums[i])
print(result)

for문과 append 함수로 결과를 출력해보자. 이전에 while문을 통해 홀수 리스트와 짝수 리스트의 길이가 같아졌다. 반복문을 통해 빈 리스트 result에 홀수와 짝수를 한 번씩 append 해주면 된다.

 

전체 코드

user_input = input("숫자들을 공백없이 입력하세요> ")
nums_list = set([int(x) for x in '_'.join(user_input).split('_')])

odd_nums = [x for x in nums_list if x%2!=0]
even_nums = [x for x in nums_list if x%2==0]
odd_nums.sort()
even_nums.sort(reverse=True)

while True:
    if len(odd_nums) != len(even_nums):
        if len(odd_nums) > len(even_nums):
            del(odd_nums[-1])
        elif len(odd_nums) < len(even_nums):
            del(even_nums[-1])
    else: break
    
result = []
for i in range(len(odd_nums)):
    result.append(odd_nums[i])
    result.append(even_nums[i])
print(result)
#결과 출력
숫자들을 공백없이 입력하세요> 19385221543638
[1, 8, 3, 6, 5, 4, 9, 2]
반응형

댓글