2023 한국정보올림피아드(KOI) 2차 대회 초등부

아두위키 : Arduwiki


한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.

link=https://arduwiki.com/wiki/%ED%95%9C%EA%B5%AD%EC%A0%95%EB%B3%B4%EC%98%AC%EB%A6%BC%ED%94%BC%EC%95%84%EB%93%9C(KOI)|한국정보올림피아드(KOI) 기출 문제 풀이 모음|center|class=coders100


1. 불안정한 수열 (초1)

제목 링크를 통해 문제를 확인해주세요.

📄 문제 개요

N개의 자연수가 일렬로 주어집니다. 이 중에서 원하는 만큼 숫자를 골라 새로운 수열을 만들려고 합니다.

새로 만든 수열은 이웃한 두 숫자의 합이 무조건 홀수여야 합니다. 이를 불안정한 수열이라고 정의합니다.

이 조건을 만족하도록 숫자를 골랐을 때, 수열의 최대 길이를 구해야 합니다.


💡 문제 풀이 시뮬레이션

불안정한 수열은 이웃한 두 숫자의 합이 홀수여야 합니다.

숫자1 숫자2 두 수의 합 불안정 여부
짝수 짝수 짝수 X
홀수 홀수 짝수 X
짝수 홀수 홀수 O
홀수 짝수 홀수 O

위 표와 같이 두 수의 합이 홀수가 되려면 반드시 짝수와 홀수가 번갈아 가며 나와야 합니다.

우리가 해야할 일은 간단합니다. 주어진 배열을 돌면서 홀짝이 바뀌는 순간을 계속 카운트하면 불안정한 수열을 얻을 수 있습니다.

  1. 불안정한 수열의 최대 길이를 구해야 하기 때문에 무조건 첫 번째 숫자는 고르고 시작합니다.
  2. 다음 숫자들을 하나씩 확인하며, 이전 숫자와 홀짝이 다를 때만 그 숫자를 고릅니다.


💻 코드 구현

n = int(input())
L = list(map(int, input().split()))

ans = 1  # 최대 길이를 구하기 위해 첫 번째 숫자는 고르고 시작

for i in range(n - 1):
    # 내 숫자(L[i])와 나 다음 숫자(L[i+1])의 홀짝성이 다르다면
    if L[i] % 2 != L[i+1] % 2:
        ans += 1  # 수열 길이 1 증가

print(ans)

수열을 한 바퀴 돌아보면서 나와 내 다음 숫자의 홀짝성이 다른 경우를 찾아보았습니다.

시간복잡도는 O(N)으로 주어진 N의 범위(1 <= N <= 300,000)를 계산하는데 충분합니다.


📊 정답률

2차에 진출한 초등부 학생들 중 80% 이상이 100점을 받은 문제였습니다.

일단 홀짝성을 비교해야겠다는 생각을 해내었다면 다양한 방법으로 풀이할 수 있는 난이도가 높지 않은 문제였습니다.





2. 스케이트 연습 (초2/중1/고1)

제목 링크를 통해 문제를 확인해주세요.




3. 호숫가의 개미굴 (초3/중2)

추가 예정


4. 고기 파티 (초4/중3)

추가 예정