본문 바로가기

Univ/Python Programming

[문제 14] 배열에서 짝수와 홀수 구분하기 - Python 풀이

주어진 정수 배열에서 짝수와 홀수를 구분하여 짝수를 먼저, 홀수를 나중에 출력하는 프로그램을 작성한다. N의 크기는 0부터 50까지이다.

입력 예시

첫째 줄에 배열의 크기 N이 주어진다. 둘째 줄에 N개의 정수가 공백으로 구분되어 주어진다.

출력 예시

짝수를 먼저, 홀수를 나중에 원래 등장 순서를 유지하여 공백으로 구분해 출력한다.

예제 테스트케이스

예제 1

입력 예시
출력 예시
6
1 2 3 4 5 6
2 4 6 1 3 5

예제 2

입력 예시
출력 예시
5
10 9 8 7 6
10 8 6 9 7

정답 코드

N = int(input())

even = []
odd = []

if N > 0:
    arr = list(map(int, input().split()))

    for i in arr:
        if i % 2 == 0:
            even.append(i)
        else:
            odd.append(i)

print(*(even + odd))

1. 코드 설명

이 코드는 입력된 배열을 앞에서부터 순서대로 확인하면서, 짝수는 even 리스트에 넣고 홀수는 odd 리스트에 넣은 뒤, 마지막에 두 리스트를 이어서 출력하는 방식이다.
따라서 짝수가 먼저 출력되고, 그 뒤에 홀수가 출력되며, 각각의 등장 순서도 그대로 유지된다.

먼저 배열의 크기 N을 입력받는다.

N = int(input())

그다음 짝수와 홀수를 따로 저장할 빈 리스트를 미리 만든다.

even = []
odd = []

이렇게 먼저 빈 리스트를 만들어 두면, N = 0인 경우에도 뒤에서 그대로 출력할 수 있다.
즉, 배열 원소가 하나도 없더라도 even과 odd는 비어 있는 상태로 남고, 마지막 출력문도 문제 없이 동작한다.

이후 N > 0일 때만 실제 배열 입력을 받는다.

if N > 0:
    arr = list(map(int, input().split()))

이 부분은 배열 크기가 0인 경우를 처리하기 위한 조건이다.
원소가 하나라도 있으면 둘째 줄을 입력받아 arr에 저장하고, 원소가 없으면 if문 안이 실행되지 않는다.

즉, 이 코드는 다음과 같이 읽으면 된다.

  1. 먼저 짝수용 리스트와 홀수용 리스트를 준비한다.
  2. 배열 크기가 0보다 크면 실제 배열을 입력받는다.
  3. 입력받은 배열을 앞에서부터 하나씩 검사한다.

배열을 순회하는 부분은 다음과 같다.

for i in arr:
    if i % 2 == 0:
        even.append(i)
    else:
        odd.append(i)

여기서 for i in arr:는 배열의 값을 앞에서부터 하나씩 꺼내는 반복문이다.
현재 값이 i에 들어가고, 그 값을 2로 나눈 나머지를 이용해 짝수와 홀수를 구분한다.

if i % 2 == 0:

이 조건이 참이면 짝수이므로 even에 넣고,

even.append(i)

거짓이면 홀수이므로 odd에 넣는다.

odd.append(i)

중요한 점은 배열을 앞에서부터 순서대로 보면서 각 리스트의 뒤에 계속 추가한다는 것이다.
그래서 짝수끼리의 순서와 홀수끼리의 순서가 모두 원래 입력 순서를 유지한다.

예를 들어 입력이 다음과 같다면

6
1 2 3 4 5 6

반복 과정은 다음과 같이 진행된다.

  • 1은 홀수이므로 odd = [1]
  • 2는 짝수이므로 even = [2]
  • 3은 홀수이므로 odd = [1, 3]
  • 4는 짝수이므로 even = [2, 4]
  • 5는 홀수이므로 odd = [1, 3, 5]
  • 6는 짝수이므로 even = [2, 4, 6]

마지막에는 두 리스트를 이어 붙여 출력한다.

print(*(even + odd))

even + odd는 짝수 리스트 뒤에 홀수 리스트를 붙인 새 리스트를 만든다.
따라서 결과는 [2, 4, 6, 1, 3, 5]가 된다.

그리고 print(*...)는 그 리스트의 원소를 하나씩 꺼내 공백으로 구분해 출력한다.
그래서 최종 출력은 다음과 같이 된다.

2 4 6 1 3 5

2. 사용된 문법과 표현

int()

N = int(input())
  • 입력받은 문자열을 정수로 변환한다.
  • 사용 형태:
int(값)

input()

input()
  • 한 줄을 문자열로 입력받는다.
  • 사용 형태:
input()

빈 리스트

even = []
odd = []
  • 값을 나중에 저장하기 위해 비어 있는 리스트를 만든다.
  • 사용 형태:
변수 = []

if문

if N > 0:
    arr = list(map(int, input().split()))
  • 조건이 참일 때만 실행한다.
  • 이 코드에서는 배열 원소가 있을 때만 입력을 받기 위해 사용한다.
  • 사용 형태:
if 조건:
    실행할 코드

split()

input().split()
  • 입력된 문자열을 공백 기준으로 나눈다.
  • 사용 형태:
문자열.split()

map()

map(int, input().split())
  • 나누어진 문자열 각각에 int를 적용하여 정수로 변환한다.
  • 사용 형태:
map(함수, 반복가능한값)

list()

arr = list(map(int, input().split()))
  • map 결과를 리스트로 변환한다.
  • 사용 형태:
list(반복가능한값)

for문

for i in arr:
  • 리스트의 원소를 앞에서부터 하나씩 꺼내 반복한다.
  • 사용 형태:
for 변수 in 반복가능한값:
    실행할 코드

나머지 연산자 %

i % 2 == 0
  • 어떤 수를 2로 나눈 나머지를 구한다.
  • 나머지가 0이면 짝수이다.
  • 사용 형태:
값 % 나누는수

append()

even.append(i)
odd.append(i)
  • 리스트의 맨 뒤에 값을 추가한다.
  • 사용 형태:
리스트.append(값)

리스트 덧셈

even + odd
  • 두 리스트를 이어 붙여 하나의 리스트로 만든다.
  • 사용 형태:
리스트1 + 리스트2

print(*리스트)

print(*(even + odd))
  • 리스트의 원소를 하나씩 꺼내 공백으로 구분하여 출력한다.
  • 사용 형태:
print(*리스트)

3. 실수하기 쉬운 부분

N = 0일 때도 arr를 바로 사용하는 경우

for i in arr:
    if i % 2 == 0:
        even.append(i)
  • N = 0이면 arr가 만들어지지 않으므로, 반복문은 if N > 0: 안에 있어야 한다.

짝수와 홀수를 반대로 넣는 경우

if i % 2 == 0:
    odd.append(i)
else:
    even.append(i)
  • 짝수와 홀수를 반대로 저장하면 출력 순서가 문제 조건과 다르게 된다.

리스트를 그대로 출력하는 경우

print(even + odd)
  • 이렇게 하면 리스트 형태 그대로 출력되어 공백으로 구분된 정답 형식이 아니다.

append() 대신 대입을 사용하는 경우

even = i
  • 리스트에 값을 추가해야 하는데 변수 자체가 정수로 바뀌어 이후 코드가 깨진다.

4. 핵심 정리

이 문제는 배열을 앞에서부터 보면서 짝수는 even, 홀수는 odd에 차례대로 넣은 뒤 even + odd를 출력하면 해결된다.
핵심은 두 리스트에 순서대로 추가하는 방식으로, 짝수와 홀수의 원래 등장 순서를 그대로 유지하는 데 있다.