<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://arduwiki.com/html/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=ArduWiki</id>
	<title>아두위키 : Arduwiki - 사용자 기여 [ko]</title>
	<link rel="self" type="application/atom+xml" href="https://arduwiki.com/html/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=ArduWiki"/>
	<link rel="alternate" type="text/html" href="https://arduwiki.com/wiki/%ED%8A%B9%EC%88%98:%EA%B8%B0%EC%97%AC/ArduWiki"/>
	<updated>2026-04-30T12:50:31Z</updated>
	<subtitle>사용자 기여</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2022_%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)_1%EC%B0%A8_%EB%8C%80%ED%9A%8C_2%EA%B5%90%EC%8B%9C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2908</id>
		<title>2022 한국정보올림피아드(KOI) 1차 대회 2교시 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2022_%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)_1%EC%B0%A8_%EB%8C%80%ED%9A%8C_2%EA%B5%90%EC%8B%9C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2908"/>
		<updated>2026-04-29T10:04:39Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2022 KOI, 2022 초등부 1차 대회 2교시, 빵, 조약돌, 정올 빵, 정올 조약돌|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1369 1. 빵 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
﻿﻿&lt;br /&gt;
&lt;br /&gt;
=== 📄 문제 개요 ===&lt;br /&gt;
KOI 마을에 N개의 빵집이 있습니다. 각 빵집에서 KOI 빵을 사려고 합니다.&lt;br /&gt;
&lt;br /&gt;
* 현재 위치에서 i번째 빵집까지 가는 데 걸리는 시간은 a입니다.&lt;br /&gt;
* i번째 빵집에 빵이 들어오는 시간은 b입니다.&lt;br /&gt;
* 빵집에 도착하는 시간이 빵이 들어오는 시간보다 늦으면(a &amp;gt; b), 빵이 다 팔려 살 수 없습니다.&lt;br /&gt;
* &#039;&#039;&#039;목표 :&#039;&#039;&#039; 빵을 살 수 있는 빵집 중, 가장 일찍 빵을 구할 수 있는 시간(최소 b)을 구해야 합니다. 모든 빵집에서 빵을 살 수 없다면 -1을 출력합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
이 문제는 시간이 흘러가는 것을 복잡하게 시뮬레이션할 필요 없이, 주어진 두 변수(a, b)의 대소 관계만 비교하면 되는 문제입니다.&lt;br /&gt;
&lt;br /&gt;
빵을 사기 위해 체크해야할 필수 조건은 &#039;&#039;&#039;내가 빵집에 도착하는 시간(a)이 빵이 나오는 시간(b)보다 작거나 같아야 한다&#039;&#039;&#039;는 것입니다.&lt;br /&gt;
&lt;br /&gt;
따라서 우리가 할 일은 다음과 같습니다.&lt;br /&gt;
&lt;br /&gt;
# 모든 빵집을 순서대로 확인하며, a &amp;lt;= b 조건을 만족하는지(빵을 살 수 있는지) 검사합니다.&lt;br /&gt;
# 조건을 만족하는 빵집들 중에서, 빵이 나오는 시간(b)이 가장 작은 값을 찾습니다.&lt;br /&gt;
# 만약 조건을 만족하는 빵집이 단 하나도 없다면 -1을 출력하도록 예외 처리를 해줍니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현&#039;&#039;&#039;﻿&#039;&#039;&#039; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n = int(input())&lt;br /&gt;
&lt;br /&gt;
# 시간(b)의 최댓값이 1000이므로, 절대 정답이 될 수 없는 1001을 초기값으로 설정&lt;br /&gt;
ans = 1001&lt;br /&gt;
&lt;br /&gt;
# N개의 빵집을 하나씩 확인&lt;br /&gt;
for i in range(n):&lt;br /&gt;
    a, b = map(int, input().split())&lt;br /&gt;
&lt;br /&gt;
    if a &amp;lt;= b: # 빵집에 도착하는 시간(a)이 빵이 나오는 시간(b)보다 작거나 같을 때만 구매 가능&lt;br /&gt;
        if b &amp;lt; ans: # 기존에 찾은 시간보다 더 빨리 나오는 곳을 발견했다면 갱신&lt;br /&gt;
            ans = b&lt;br /&gt;
&lt;br /&gt;
if ans == 1001: # ans가 여전히 1001이라면(살 수 있는 빵이 없었다) -1 출력&lt;br /&gt;
    print(-1)&lt;br /&gt;
else:&lt;br /&gt;
    print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿최소값을 구하는 상황에서 ans의 초기값을 무한대(&#039;&#039;&#039;float(&#039;inf&#039;)&#039;&#039;&#039;)로 잡아도 무방합니다.&lt;br /&gt;
&lt;br /&gt;
하지만 평소 연습할 때 문제 데이터 제한 크기를 확인하여 논리적인 상/하한선을 설정해주면 좋은 공부가 됩니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1464 2. 조약돌 (초2)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%A4%91%EB%93%B1%EB%B6%80&amp;diff=2907</id>
		<title>2023 한국정보올림피아드(KOI) 2차 대회 중등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%A4%91%EB%93%B1%EB%B6%80&amp;diff=2907"/>
		<updated>2026-04-29T10:04:06Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2023 KOI, 2023 중등부 2차 대회, 스케이트 연습, 호숫가의 개미굴, 고기 파티, 지그재그, 정올 스케이트 연습, 정올 호숫가의 개미굴, 정올 고기 파티, 정올 지그재그|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1629 1. 스케이트 연습 (초2/중1/고1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== ﻿📄 문제 개요 ===&lt;br /&gt;
N개의 체크포인트(중간 지점)가 있는 스케이트 코스가 있습니다.&lt;br /&gt;
&lt;br /&gt;
* 출발점과 도착점에서의 속력은 반드시 0이어야 합니다.&lt;br /&gt;
* 각 체크포인트에는 넘어서는 안 되는 &#039;&#039;&#039;속력 제한(V)&#039;&#039;&#039;이 있습니다.&lt;br /&gt;
* 속력을 높일 때는 제한 없이 확 높일 수 있지만, &#039;&#039;&#039;속력을 낮출 때는 직전 지점의 속력에서 딱 1만큼만&#039;&#039;&#039; 낮출 수 있습니다.&lt;br /&gt;
* &#039;&#039;&#039;목표 :&#039;&#039;&#039; 조건을 지키며 코스를 완주할 때, 각 체크포인트에서 낼 수 있는 속력들의 &#039;&#039;&#039;총합의 최댓값&#039;&#039;&#039;을 구해야 합니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
보통 문제를 풀 때 배열의 처음부터 끝으로 순서대로 탐색하는 것이 일반적입니다.&lt;br /&gt;
&lt;br /&gt;
하지만 이 문제를 앞에서부터 탐색하게 되면 로직이 매우 복잡해집니다.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;속력을 낮출 때는 1씩만 낮출 수 있다&#039;&#039;&#039;는 조건 때문에, 현재 위치에서 속력을 마음 편히 올리려면 앞으로 남은 모든 코스의 속력 제한을 &#039;&#039;&#039;미리 내다보고 계산&#039;&#039;&#039;해야 하기 때문입니다. 이런 상황에서는 탐색의 방향을 완전히 뒤집어 &#039;&#039;&#039;도착점부터 역방향으로 탐색&#039;&#039;&#039;해보는 것이 아주 좋은 해결책이 됩니다.&lt;br /&gt;
&lt;br /&gt;
도착점부터 거꾸로  생각하면, &#039;&#039;&#039;원래의 속력을 최대 1만 낮출 수 있다&#039;&#039;&#039;는 조건은 반대로 &#039;&#039;&#039;속력을 최대 1만 높일 수 있다&#039;&#039;&#039;는 단순한 조건으로 바뀝니다.&lt;br /&gt;
&lt;br /&gt;
[[파일:2023KOI스케이트연습1.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
도착점의 속력은 무조건 0이기 때문에 도착 지점의 속력 0에서 시작합니다.&lt;br /&gt;
&lt;br /&gt;
각 지점에서의 최대 속력은 ① &#039;&#039;&#039;현재 지점의 속력 제한(V)&#039;&#039;&#039;과 &#039;&#039;&#039;② 다음 지점의 속력 + 1&#039;&#039;&#039; 중 더 작은 값으로 단순하게 결정됩니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
input = sys.stdin.readline&lt;br /&gt;
&lt;br /&gt;
n = int(input())&lt;br /&gt;
arr = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
speed = 0    # 현재 위치에서의 최대 속력 (도착점은 0이므로 0부터 시작)&lt;br /&gt;
ans = 0  # 낼 수 있는 속력들의 총합&lt;br /&gt;
&lt;br /&gt;
# 배열의 맨 끝(도착점 직전)부터 첫 번째 지점까지 거꾸로 탐색&lt;br /&gt;
for i in range(n - 1, -1, -1):&lt;br /&gt;
    if speed &amp;lt; arr[i]: # 1. 내 속력을 1 높여도 속력 제한(arr[i])보다 작다면? &lt;br /&gt;
        speed += 1  # 마음 편히 속력을 1 올림&lt;br /&gt;
        &lt;br /&gt;
    else: # 2. 내 속력을 1 높이면 속력 제한을 넘어가 버린다면?&lt;br /&gt;
        speed = arr[i]  # 해당 지점의 제한 속력에 맞춤&lt;br /&gt;
        &lt;br /&gt;
    ans += speed  # 결정된 속력을 정답에 누적&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿데이터의 개수 N이 최대 50만 개로 꽤 크지만, 이중 반복문 없이 배열을 거꾸로 한 번만 스캔&#039;&#039;&#039;(시간 복잡도 : O(N))&#039;&#039;&#039;하므로 2초의 시간 제한을 아주 여유롭게 통과합니다. &lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== 📊 정답률 ===&lt;br /&gt;
﻿100점을 받은 학생 비율이 초등부 50% 정도, 중등부 80% 이상, 고등부 90% 이상이었습니다.&lt;br /&gt;
&lt;br /&gt;
초등부 학생들도 2번 문제치고는 난이도가 평이한 수준, 중/고등부에서는 반드시 맞춰야할 쉬운 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
참고로 풀어볼 만한 문제 링크를 하나 추가했으니, 시간이 나면 풀어보세요.&lt;br /&gt;
&lt;br /&gt;
[https://codersit.co.kr/oj/problems/2087 &#039;&#039;&#039;COCI 6회 &amp;quot;미래를 보는 투자자&amp;quot; 문제 풀이하러가기&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1670 2. 호숫가의 개미굴 (초3/중2)]&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;3. 고기 파티 (초4/중3)&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;4. 지그재그 (중4/고2)&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2906</id>
		<title>2023 한국정보올림피아드(KOI) 2차 대회 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2906"/>
		<updated>2026-04-29T10:03:20Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2023 KOI, 2023 초등부 2차 대회, 불안정한 수열, 스케이트 연습, 호숫가의 개미굴, 고기 파티, 정올 불안정한 수열, 정올 스케이트 연습, 정올 호숫가의 개미굴, 정올 고기 파티|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1589 1. 불안정한 수열 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== ﻿📄 문제 개요 ===&lt;br /&gt;
N개의 자연수가 일렬로 주어집니다. 이 중에서 원하는 만큼 숫자를 골라 새로운 수열을 만들려고 합니다.&lt;br /&gt;
&lt;br /&gt;
새로 만든 수열은 &#039;&#039;&#039;이웃한 두 숫자의 합&#039;&#039;&#039;이 무조건 &#039;&#039;&#039;홀수&#039;&#039;&#039;여야 합니다. 이를 불안정한 수열이라고 정의합니다.&lt;br /&gt;
&lt;br /&gt;
이 조건을 만족하도록 숫자를 골랐을 때, 수열의 최대 길이를 구해야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
불안정한 수열은 이웃한 두 숫자의 합이 홀수여야 합니다.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; width:60%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:25%;&amp;quot; | 숫자1 !! style=&amp;quot;width:25%;&amp;quot; | 숫자2 !! style=&amp;quot;width:25%;&amp;quot; | 두 수의 합 !! style=&amp;quot;width:25%;&amp;quot; | 불안정 여부&lt;br /&gt;
|-&lt;br /&gt;
| 짝수 || 짝수 || 짝수 || X&lt;br /&gt;
|-&lt;br /&gt;
| 홀수 || 홀수 || 짝수 || X&lt;br /&gt;
|-&lt;br /&gt;
| 짝수 || 홀수 || 홀수 || O&lt;br /&gt;
|-&lt;br /&gt;
| 홀수 || 짝수 || 홀수 || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
﻿﻿위 표와 같이 두 수의 합이 홀수가 되려면 &#039;&#039;&#039;반드시 짝수와 홀수가 번갈아 가며 나와야 합니다.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
우리가 해야할 일은 간단합니다. 주어진 배열을 돌면서 홀짝이 바뀌는 순간을 계속 카운트하면 불안정한 수열을 얻을 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
# 불안정한 수열의 최대 길이를 구해야 하기 때문에 무조건 첫 번째 숫자는 고르고 시작합니다.&lt;br /&gt;
# 다음 숫자들을 하나씩 확인하며, 이전 숫자와 홀짝이 다를 때만 그 숫자를 고릅니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n = int(input())&lt;br /&gt;
L = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
ans = 1  # 최대 길이를 구하기 위해 첫 번째 숫자는 고르고 시작&lt;br /&gt;
&lt;br /&gt;
for i in range(n - 1):&lt;br /&gt;
    # 내 숫자(L[i])와 나 다음 숫자(L[i+1])의 홀짝성이 다르다면&lt;br /&gt;
    if L[i] % 2 != L[i+1] % 2:&lt;br /&gt;
        ans += 1  # 수열 길이 1 증가&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿수열을 한 바퀴 돌아보면서 나와 내 다음 숫자의 홀짝성이 다른 경우를 찾아보았습니다.&lt;br /&gt;
&lt;br /&gt;
시간복잡도는 O(N)으로 주어진 N의 범위(1 &amp;lt;= N &amp;lt;= 300,000)를 계산하는데 충분합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📊 정답률 ===&lt;br /&gt;
2차에 진출한 초등부 학생들 중 80% 이상이 100점을 받은 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
일단 홀짝성을 비교해야겠다는 생각을 해내었다면 다양한 방법으로 풀이할 수 있는 난이도가 높지 않은 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1629 2. 스케이트 연습 (초2/중1/고1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== ﻿📄 문제 개요 ===&lt;br /&gt;
N개의 체크포인트(중간 지점)가 있는 스케이트 코스가 있습니다.&lt;br /&gt;
&lt;br /&gt;
* 출발점과 도착점에서의 속력은 반드시 0이어야 합니다.&lt;br /&gt;
* 각 체크포인트에는 넘어서는 안 되는 &#039;&#039;&#039;속력 제한(V)&#039;&#039;&#039;이 있습니다.&lt;br /&gt;
* 속력을 높일 때는 제한 없이 확 높일 수 있지만, &#039;&#039;&#039;속력을 낮출 때는 직전 지점의 속력에서 딱 1만큼만&#039;&#039;&#039; 낮출 수 있습니다.&lt;br /&gt;
* &#039;&#039;&#039;목표 :&#039;&#039;&#039; 조건을 지키며 코스를 완주할 때, 각 체크포인트에서 낼 수 있는 속력들의 &#039;&#039;&#039;총합의 최댓값&#039;&#039;&#039;을 구해야 합니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
보통 문제를 풀 때 배열의 처음부터 끝으로 순서대로 탐색하는 것이 일반적입니다.&lt;br /&gt;
&lt;br /&gt;
하지만 이 문제를 앞에서부터 탐색하게 되면 로직이 매우 복잡해집니다.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;속력을 낮출 때는 1씩만 낮출 수 있다&#039;&#039;&#039;는 조건 때문에, 현재 위치에서 속력을 마음 편히 올리려면 앞으로 남은 모든 코스의 속력 제한을 &#039;&#039;&#039;미리 내다보고 계산&#039;&#039;&#039;해야 하기 때문입니다. 이런 상황에서는 탐색의 방향을 완전히 뒤집어 &#039;&#039;&#039;도착점부터 역방향으로 탐색&#039;&#039;&#039;해보는 것이 아주 좋은 해결책이 됩니다.&lt;br /&gt;
&lt;br /&gt;
도착점부터 거꾸로  생각하면, &#039;&#039;&#039;원래의 속력을 최대 1만 낮출 수 있다&#039;&#039;&#039;는 조건은 반대로 &#039;&#039;&#039;속력을 최대 1만 높일 수 있다&#039;&#039;&#039;는 단순한 조건으로 바뀝니다.&lt;br /&gt;
&lt;br /&gt;
[[파일:2023KOI스케이트연습1.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
도착점의 속력은 무조건 0이기 때문에 도착 지점의 속력 0에서 시작합니다.&lt;br /&gt;
&lt;br /&gt;
각 지점에서의 최대 속력은 ① &#039;&#039;&#039;현재 지점의 속력 제한(V)&#039;&#039;&#039;과 &#039;&#039;&#039;② 다음 지점의 속력 + 1&#039;&#039;&#039; 중 더 작은 값으로 단순하게 결정됩니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
input = sys.stdin.readline&lt;br /&gt;
&lt;br /&gt;
n = int(input())&lt;br /&gt;
arr = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
speed = 0    # 현재 위치에서의 최대 속력 (도착점은 0이므로 0부터 시작)&lt;br /&gt;
ans = 0  # 낼 수 있는 속력들의 총합&lt;br /&gt;
&lt;br /&gt;
# 배열의 맨 끝(도착점 직전)부터 첫 번째 지점까지 거꾸로 탐색&lt;br /&gt;
for i in range(n - 1, -1, -1):&lt;br /&gt;
    if speed &amp;lt; arr[i]: # 1. 내 속력을 1 높여도 속력 제한(arr[i])보다 작다면? &lt;br /&gt;
        speed += 1  # 마음 편히 속력을 1 올림&lt;br /&gt;
        &lt;br /&gt;
    else: # 2. 내 속력을 1 높이면 속력 제한을 넘어가 버린다면?&lt;br /&gt;
        speed = arr[i]  # 해당 지점의 제한 속력에 맞춤&lt;br /&gt;
        &lt;br /&gt;
    ans += speed  # 결정된 속력을 정답에 누적&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿데이터의 개수 N이 최대 50만 개로 꽤 크지만, 이중 반복문 없이 배열을 거꾸로 한 번만 스캔&#039;&#039;&#039;(시간 복잡도 : O(N))&#039;&#039;&#039;하므로 2초의 시간 제한을 아주 여유롭게 통과합니다. &lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== 📊 정답률 ===&lt;br /&gt;
﻿100점을 받은 학생 비율이 초등부 50% 정도, 중등부 80% 이상, 고등부 90% 이상이었습니다.&lt;br /&gt;
&lt;br /&gt;
초등부 학생들도 2번 문제치고는 난이도가 평이한 수준, 중/고등부에서는 반드시 맞춰야할 쉬운 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
참고로 풀어볼 만한 문제 링크를 하나 추가했으니, 시간이 나면 풀어보세요.&lt;br /&gt;
&lt;br /&gt;
[https://codersit.co.kr/oj/problems/2087 &#039;&#039;&#039;COCI 6회 &amp;quot;미래를 보는 투자자&amp;quot; 문제 풀이하러가기&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1670 3. 호숫가의 개미굴 (초3/중2)]&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;4. 고기 파티 (초4/중3)&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2023_%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)_1%EC%B0%A8_%EB%8C%80%ED%9A%8C_2%EA%B5%90%EC%8B%9C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2905</id>
		<title>2023 한국정보올림피아드(KOI) 1차 대회 2교시 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2023_%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)_1%EC%B0%A8_%EB%8C%80%ED%9A%8C_2%EA%B5%90%EC%8B%9C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2905"/>
		<updated>2026-04-29T10:02:36Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2023 KOI, 2023 초등부 1차 대회 2교시, 크림빵, 대피소, 아이템 획득, 정올 크림빵, 정올 대피소, 정올 아이템 획득|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1501 1. 크림빵 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== 📄 문제 개요 ===&lt;br /&gt;
KOI 빵집에서 총 N * K개의 빵을 만들었습니다. 이 빵들을 일렬로 늘어놓고 앞에서부터 K개씩 묶어서 판매하려고 합니다.&lt;br /&gt;
&lt;br /&gt;
* 크림이 있는 빵은 1, 크림이 없는 빵은 0으로 표시됩니다.&lt;br /&gt;
* 단, 한 묶음 안에 크림이 없는 빵(0)이 P개 이상 있다면 그 묶음은 불량품으로 간주되어 팔 수 없습니다.&lt;br /&gt;
&lt;br /&gt;
우리는 &#039;&#039;&#039;판매 가능한 빵 묶음의 총 개수&#039;&#039;&#039;를 구해야 합니다.﻿&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
이 문제를 해결하기 위한 핵심은 일렬로 늘어선 데이터를 일정한 간격(K)으로 정확하게 나누어 검사하는 것입니다.&lt;br /&gt;
&lt;br /&gt;
예를 들어 빵이 3개씩 한 묶음(K=3), 크림 없는 빵이 1개 미만이어야 판매 가능하다고 상상해 봅시다.&lt;br /&gt;
&lt;br /&gt;
주어진 빵의 데이터를 &#039;&#039;&#039;K개씩 끊어서&#039;&#039;&#039; &#039;&#039;&#039;크림 없는 빵의 개수&#039;&#039;&#039;를 세어보면 판매가능한 빵 묶음 개수를 확인할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
﻿[[파일:2023KOI크림빵1.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
=== ﻿﻿💻 코드 구현 - K개씩 끊어서 확인하기﻿ ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# N: 묶음 수, K: 묶음당 빵의 수, P: 불량품 기준 개수&lt;br /&gt;
n, k, p = map(int, input().split())&lt;br /&gt;
breads = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
ans = 0&lt;br /&gt;
&lt;br /&gt;
# 0부터 전체 빵 개수(N*K)까지 K칸씩 건너뛰며 묶음의 시작점(i) 설정&lt;br /&gt;
for i in range(0, n * k, k):&lt;br /&gt;
    nocream = 0  # 현재 묶음의 크림 없는 빵(0) 개수를 셀 변수&lt;br /&gt;
    &lt;br /&gt;
    # 시작점(i)부터 i+k 직전까지 빵을 하나씩 검사&lt;br /&gt;
    for j in range(i, i + k):&lt;br /&gt;
        if breads[j] == 0:&lt;br /&gt;
            nocream += 1  # 크림이 없으면 개수 증가&lt;br /&gt;
            &lt;br /&gt;
    # 해당 묶음 안의 불량품이 P개 미만이라면 판매 가능&lt;br /&gt;
    if nocream &amp;lt; p:&lt;br /&gt;
        ans += 1&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
﻿전체 빵을 K개씩 끊어 순회하면서 크림없는 빵의 개수를 세고, 불량 여부를 판단하는 것을 중첩 반복의 형태로 표현했습니다.&lt;br /&gt;
&lt;br /&gt;
이번 문제는 &#039;&#039;&#039;빵의 최대 개수(1 &amp;lt;= N &amp;lt;= 50)&#039;&#039;&#039;가 크지 않기 때문에 이 방법으로 충분히 해결 가능합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿📊 정답률﻿ ===&lt;br /&gt;
[[파일:2023KOI크림빵2.png|center|class=coders70]]&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1500 2. 대피소 (초2/고1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== 📄 문제 개요 ===&lt;br /&gt;
KOI 마을에 N개의 집이 있습니다. 이 중 K개의 집에 대피소를 설치하려고 합니다.&lt;br /&gt;
&lt;br /&gt;
모든 주민의 안전을 위해, 어떤 집에서든 &#039;&#039;&#039;&amp;lt;nowiki/&amp;gt;&#039;가장 가까운 대피소까지의 거리&#039; 중 가장 먼 거리가 최소가 되도록&#039;&#039;&#039; 대피소를 설치해야 합니다.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;두 집 사이의 거리&#039;&#039;&#039;는 가로 차이와 세로 차이를 합한 값으로 계산합니다.&lt;br /&gt;
* 조건을 만족하는 K개의 집을 선택했을 때, &#039;&#039;&#039;대피소와 가장 멀리 떨어진 집과의 최소 거리&#039;&#039;&#039;를 출력해야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
이 문제에서 최적의 위치를 단번에 도출해 내는 수학적 공식이나 모델링을 찾으려 한다면, 오히려 출제 의도에서 벗어날 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
집의 개수(N)는 최대 50개이고, 설치할 대피소(r)는 최대 3개입니다.&lt;br /&gt;
&lt;br /&gt;
50개의 집 중에서 3개의 대피소를 고르는 모든 경우의 수는 &#039;&#039;&#039;50C3&#039;&#039;&#039;으로 고작 &#039;&#039;&#039;19,600가지&#039;&#039;&#039;에 불과합니다.&lt;br /&gt;
&lt;br /&gt;
따라서 복잡한 최적화 알고리즘을 구상할 필요 없이, 19,600가지의 대피소 설치 경우의 수를&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;모두 확인하는 완전 탐색(Brute-Force)&#039;&#039;&#039; 방식으로 접근하는 것이 가장 정확하고 확실한 해결책입니다.&lt;br /&gt;
&lt;br /&gt;
﻿[[파일:2023KOI대피소1.png|center|class=coders100]]&lt;br /&gt;
위와 같이 (1, 5), (3, 0), (3, 3), (6, 12), (8, 9) 위치에 총 5개의 집이 있습니다.&lt;br /&gt;
이 중 &#039;&#039;&#039;(1, 5), (3, 0)&#039;&#039;&#039; 두 집을 대피소로 선정한 상황입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;(1, 5) 위치의 집&#039;&#039;&#039; : 대피소로 선정되었기 때문에 가장 가까운 대피소까지의 거리는 0입니다.&lt;br /&gt;
* &#039;&#039;&#039;(3, 0) 위치의 집&#039;&#039;&#039; : 대피소로 선정되었기 때문에 가장 가까운 대피소까지의 거리는 0입니다.&lt;br /&gt;
* &#039;&#039;&#039;(3, 3) 위치의 집&#039;&#039;&#039; : (1, 5) 대피소까지 거리는 &#039;&#039;&#039;4&#039;&#039;&#039;, (3, 0) 대피소까지 거리는 &#039;&#039;&#039;3&#039;&#039;&#039;이므로 &#039;&#039;&#039;가장 가까운 대피소까지의 거리는 3&#039;&#039;&#039;입니다.&lt;br /&gt;
* &#039;&#039;&#039;(6, 12) 위치의 집&#039;&#039;&#039; : (1, 5) 대피소까지 거리는 &#039;&#039;&#039;12&#039;&#039;&#039;, (3, 0) 대피소까지 거리는 &#039;&#039;&#039;15&#039;&#039;&#039;이므로 &#039;&#039;&#039;가장 가까운 대피소까지의 거리는 12&#039;&#039;&#039;입니다.&lt;br /&gt;
* &#039;&#039;&#039;(8, 9) 위치의 집&#039;&#039;&#039; : (1, 5) 대피소까지 거리는 &#039;&#039;&#039;11&#039;&#039;&#039;, (3, 0) 대피소까지 거리는 &#039;&#039;&#039;14&#039;&#039;&#039;이므로 &#039;&#039;&#039;가장 가까운 대피소까지의 거리는 11&#039;&#039;&#039;입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
따라서 &#039;&#039;&#039;가장 가까운 대피소까지의 거리가 가장 먼 경우&#039;&#039;&#039;는 (6, 12) 위치의 집의 &#039;&#039;&#039;12&#039;&#039;&#039;가 됩니다.&lt;br /&gt;
&lt;br /&gt;
지금 구한 이 값은 경우의 수 하나의 값이고, 모든 경우의 수에서 계산한 후 가장 작은 값을 구해야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
풀이과정을 정리해보면 다음과 같습니다.&lt;br /&gt;
&lt;br /&gt;
① 주어진 N개의 집 중 r개를 대피소로 정합니다.&lt;br /&gt;
&lt;br /&gt;
② 각 집과 대피소 사이 가장 가까운 거리(p)를 구한 후, 그 중 가장 큰 값(k)을 선정합니다.&lt;br /&gt;
&lt;br /&gt;
③ 모든 경우에 대해 위 과정을 반복하여 k 중 가장 작은 값(m)을 구합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현﻿ ===&lt;br /&gt;
﻿&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n, r = map(int, input().split())&lt;br /&gt;
arr = []&lt;br /&gt;
for i in range(n):&lt;br /&gt;
    arr.append(tuple(map(int, input().split())))&lt;br /&gt;
&lt;br /&gt;
n = len(arr)&lt;br /&gt;
data = []         # 현재 선택된 대피소들을 담을 리스트&lt;br /&gt;
m = float(&#039;inf&#039;)  # 최종 정답 (가장 작은 값을 찾기 위해 무한대로 초기화)&lt;br /&gt;
&lt;br /&gt;
# 조합을 직접 만들어내는 재귀함수 (start: 탐색 시작 인덱스, depth: 선택한 대피소 개수)&lt;br /&gt;
def comb(start, depth):&lt;br /&gt;
    global m&lt;br /&gt;
    &lt;br /&gt;
    # r개의 대피소를 모두 골랐다면&lt;br /&gt;
    if depth == r:&lt;br /&gt;
        k = 0  # 현재 대피소 조합에서 가장 멀리 떨어진 집의 거리&lt;br /&gt;
        &lt;br /&gt;
        # 마을의 모든 집(i)에 대해 검사&lt;br /&gt;
        for i in arr:&lt;br /&gt;
            p = float(&#039;inf&#039;)  # 현재 집(i)에서 가장 가까운 대피소까지의 거리&lt;br /&gt;
            &lt;br /&gt;
            # 선택된 대피소(j)들을 하나씩 확인하며 최단 거리 계산&lt;br /&gt;
            for j in data:&lt;br /&gt;
                p = min(p, abs(i[0]-j[0]) + abs(i[1]-j[1]))&lt;br /&gt;
            &lt;br /&gt;
            # 모든 집들 중 가장 대피소와 멀리 떨어진 거리(최댓값) 갱신&lt;br /&gt;
            k = max(k, p)&lt;br /&gt;
            &lt;br /&gt;
        # 이번 조합의 최댓값(k)이 기존의 최소 거리(m)보다 작다면 정답 갱신&lt;br /&gt;
        m = min(m, k)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # 대피소 고르기&lt;br /&gt;
    for i in range(start, n):&lt;br /&gt;
        data.append(arr[i])      # 1. 대피소 선택&lt;br /&gt;
        comb(i + 1, depth + 1)   # 2. 다음 대피소 고르러 재귀 호출&lt;br /&gt;
        data.pop()               # 3. 탐색 완료 후 빼내고 다른 집 선택&lt;br /&gt;
&lt;br /&gt;
comb(0, 0)&lt;br /&gt;
print(m)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;1. 알고리즘 문제 풀이 요령&#039;&#039;&#039; ====&lt;br /&gt;
이번 문제 뿐만 아니라 알고리즘을 설계할 때 가장 먼저 확인할 것이 입력 데이터의 크기와 제한시간입니다.&lt;br /&gt;
&lt;br /&gt;
집의 개수(N)의 최대값이 50으로 굉장히 작은데도 불구하고, 문제의 시간제한이 4초로 아주 크게 주어졌습니다.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;입력 데이터의 크기와 시간 제한&#039;&#039;&#039;은 이렇게 &#039;&#039;&#039;완전 탐색을 암시하는 힌트&#039;&#039;&#039;가 될 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
알고리즘 설계 방향에 이를 반영하되, 문제에 따라 예외 상황이 있을 수 있기 때문에 올바른 판단을 위해 많은 문제 풀이 경험이 필요하겠습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;2. 재귀함수를 활용한 조합 구현&#039;&#039;&#039; ====&lt;br /&gt;
combinations  라이브러리를 활용할 수도 있지만, 재귀함수를 활용해 직접 조합을 구현했습니다.&lt;br /&gt;
&lt;br /&gt;
조합 라이브러리가 구현되어있지 않는 프로그래밍 언어를 사용하거나 라이브러리 사용이 제한적인 상황에서 문제를 잘 풀어내려면&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;순열/조합&#039;&#039;&#039;과 같은 중요한 개념은 이렇게 직접 구현하는 연습도 해보면 좋겠습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿📊 정답률﻿ ===&lt;br /&gt;
[[파일:2023KOI대피소2.png|center|class=coders70]]&lt;br /&gt;
&lt;br /&gt;
[[파일:2023KOI대피소3.png|center|class=coders70]]&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;3. 아이템 획득 (초3)&#039;&#039;&#039; ==&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2024_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%A4%91%EB%93%B1%EB%B6%80&amp;diff=2904</id>
		<title>2024 한국정보올림피아드(KOI) 2차 대회 중등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2024_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%A4%91%EB%93%B1%EB%B6%80&amp;diff=2904"/>
		<updated>2026-04-29T09:59:47Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2024 KOI, 2024 중등부 2차 대회, 가로등, 색깔 모으기, XOR 최대, 트리 뽑아내기, 정올 가로등, 정올 색깔 모으기, 정올 XOR 최대, 정올 트리 뽑아내기|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1689 1. 가로등 (초2/중1/고1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== 📄 문제 개요 ===&lt;br /&gt;
수직선 도로 위에 N개의 가로등이 켜져 있습니다. 도로의 끝은 L로 아주 깁니다.&lt;br /&gt;
&lt;br /&gt;
어떤 위치의 &#039;&#039;&#039;어두운 정도&#039;&#039;&#039;는 그 위치에서 &#039;&#039;&#039;가장 가까운 가로등까지의 거리&#039;&#039;&#039;를 뜻합니다.&lt;br /&gt;
&lt;br /&gt;
[[파일:2024KOI가로등1.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
예를 들어 3, 6번 위치에 가로등이 있다면 그림과 같이 가로등이 있는 위치(p=0)을 시작으로 어두운 정도를 표시하게 됩니다.&lt;br /&gt;
&lt;br /&gt;
0부터 L까지 모든 위치의 어두운 정도를 구했을 때, &#039;&#039;&#039;가장 작은 값부터 K번째로 작은 값&#039;&#039;&#039;까지 차례대로 출력해야 합니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== 💡 첫 번째 접근 - 모든 위치 직접 탐색하기 ===&lt;br /&gt;
가장 먼저 떠올릴 수 있는 직관적인 방법은 0부터 L까지 도로 위를 직접 걸어가며, 각 위치마다 모든 가로등과의 거리를 계산해 보는 것입니다.&lt;br /&gt;
&lt;br /&gt;
예를 들어 각 위치(pos)에서 가로등까지의 거리들을 모두 구한 뒤, 그중 가장 짧은 거리가 그 위치의 어두운 정도가 됩니다.&lt;br /&gt;
&lt;br /&gt;
[[파일:2024KOI가로등2.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
﻿﻿이 값들을 리스트에 모아 오름차순으로 정렬한 뒤 앞에서부터 K개를 출력하는 방식입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현 - 모든 위치 직접 탐색하기﻿ ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
input = sys.stdin.readline&lt;br /&gt;
&lt;br /&gt;
l, n, k = map(int, input().split())&lt;br /&gt;
a = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
ans = []&lt;br /&gt;
&lt;br /&gt;
# 0부터 L까지 모든 위치 확인&lt;br /&gt;
for pos in range(l + 1):&lt;br /&gt;
    # 현재 위치에서 모든 가로등과의 거리 중 최솟값(어두운 정도) 찾기&lt;br /&gt;
    m = 1000000000000000000 # 이론상 가능한 최대 거리&lt;br /&gt;
    for i in a:&lt;br /&gt;
        m = min(m, abs(pos - i))&lt;br /&gt;
    ans.append(m)&lt;br /&gt;
&lt;br /&gt;
ans.sort() # 오름차순 정렬&lt;br /&gt;
&lt;br /&gt;
# 가장 어두운 정도가 작은 K개 출력&lt;br /&gt;
for i in range(k):&lt;br /&gt;
    print(ans[i])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿﻿위 코드는 L칸을 일일이 확인하며 N개의 가로등을 매번 비교하므로,&lt;br /&gt;
&lt;br /&gt;
가로등 개수(N)와 도로 길이(L)가 모두 작은 부분문제 2번(N &amp;lt;= 2500, L &amp;lt;= 2500)까지만 무사히 통과하여 &#039;&#039;&#039;20점&#039;&#039;&#039;을 받게 됩니다.&lt;br /&gt;
&lt;br /&gt;
만약 도로 길이가 부분문제 4번(L &amp;lt;= 5,000,000)이나, 사실상 무한하게 커질 수 있는 부분문제 5번의 데이터가 들어오면&lt;br /&gt;
&lt;br /&gt;
이런 방식은 &#039;&#039;&#039;&amp;lt;nowiki/&amp;gt;&#039;시간 초과&#039;&#039;&#039;&#039;가 발생할 수밖에 없습니다. 따라서 100점을 받기 위해서는 탐색 방식을 바꾸어야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 두 번째 접근 - 너비 우선 탐색(BFS)﻿ ===&lt;br /&gt;
﻿우리가 출력해야할 것은 가장 밝은(어두운 정도가 가장 낮은) K개의 값입니다.&lt;br /&gt;
&lt;br /&gt;
따라서 가장 밝은 곳&#039;&#039;&#039;(가로등이 있는 위치)&#039;&#039;&#039;부터 영역을 점점 넓혀나가면서 탐색하는 방법을 생각해봅시다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
잔잔한 호수에 돌멩이를 던졌을 때 퍼져나가는 물결을 상상해봅시다.&lt;br /&gt;
&lt;br /&gt;
가로등이 서 있는 위치를 물결의 중심(거리 0)이라고 생각하고, 양옆으로 동시에 1칸씩 영역을 넓혀가는 겁니다.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;거리 0인 곳:&#039;&#039;&#039; 가로등이 있는 중심 위치들&lt;br /&gt;
# &#039;&#039;&#039;거리 1인 곳:&#039;&#039;&#039; 중심에서 양옆으로 1칸 퍼져나간 위치들&lt;br /&gt;
# &#039;&#039;&#039;거리 2인 곳:&#039;&#039;&#039; 거기서 다시 양옆으로 1칸 더 퍼져나간 위치들&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
도로의 길이와 무관하게 가장 밝은 곳부터 점점 범위를 넓혀나가다가 가장 밝은 K개 값을 찾는 순간 탐색을 종료합니다.&lt;br /&gt;
&lt;br /&gt;
이처럼 가까운 곳부터 동심원처럼 영역을 넓혀가는 방식을 컴퓨터 공학에서는 &#039;&#039;&#039;너비 우선 탐색(BFS)&#039;&#039;&#039;이라고 부릅니다.&lt;br /&gt;
&lt;br /&gt;
[[파일:2024KOI가로등3.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
=== ﻿﻿💻 코드 구현 - 너비 우선 탐색(BFS) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
l, n, k = map(int, input().split())&lt;br /&gt;
# 가로등 위치는 탐색 중 변하지 않으므로, 리스트보다 가볍고 빠른 튜플(tuple) 사용&lt;br /&gt;
a = tuple(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
# 100경 크기의 방문 배열 대신, 밟은 좌표만 세트(set) 활용 (메모리 초과 방지)&lt;br /&gt;
visit = set()&lt;br /&gt;
q = deque()&lt;br /&gt;
&lt;br /&gt;
# 1단계: 초기 가로등 위치들을 어두운 정도(거리) 0으로 큐에 모두 삽입, 방문 처리&lt;br /&gt;
for i in a:&lt;br /&gt;
    q.append((i, 0))&lt;br /&gt;
    visit.add(i)&lt;br /&gt;
&lt;br /&gt;
# 2단계: 딱 K번만 정답을 출력하도록 while 조건 설정&lt;br /&gt;
while k &amp;gt; 0:&lt;br /&gt;
    x, p = q.popleft()  # x: 현재 위치, p: 어두운 정도(거리)&lt;br /&gt;
    &lt;br /&gt;
    # 거리가 짧은 곳부터 순서대로 출력됨&lt;br /&gt;
    print(p)&lt;br /&gt;
    k -= 1  # 정답을 출력할 때마다 목표 개수(K)를 1씩 감소&lt;br /&gt;
    &lt;br /&gt;
    # 3단계: 현재 위치 기준 양옆(왼쪽 1칸, 오른쪽 1칸) 탐색&lt;br /&gt;
    for cx in [(x - 1), (x + 1)]:&lt;br /&gt;
        if 0 &amp;lt;= cx &amp;lt;= l: # 도로 범위(0 ~ L) 안에 포함되고&lt;br /&gt;
            if cx not in visit: # 아직 방문하지 않은 위치라면&lt;br /&gt;
                visit.add(cx) # 방문 처리한 후&lt;br /&gt;
                q.append((cx, b + 1))  # 거리를 1 늘려서 큐에 삽입&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿일반적으로 BFS 코드를 작성할 때, 방문 배열(visit = [False] * (L + 1) 형태)를 활용합니다.&lt;br /&gt;
&lt;br /&gt;
하지만 지금의 경우 &#039;&#039;&#039;L 최대 크기(100경)&#039;&#039;&#039;이 너무 크기 때문에 리스트를 활용하면 &#039;&#039;&#039;메모리 초과&#039;&#039;&#039;가 발생합니다.&lt;br /&gt;
&lt;br /&gt;
그래서 이번에는 set 자료구조를 사용해 우리가 &#039;&#039;&#039;실제로 방문한 좌표만 기록&#039;&#039;&#039;함으로써 메모리 낭비를 최소한으로 처리했습니다.&lt;br /&gt;
&lt;br /&gt;
이렇게 아주 &#039;&#039;&#039;큰 데이터 범위로 인한 몇 가지 함정&#039;&#039;&#039;을 피해서 완성하면, &#039;&#039;&#039;100점&#039;&#039;&#039;을 획득할 수 있습니다.&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;2. 색깔 모으기 (초3/중2)&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;3. XOR 최대 (중3/고2)&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;4. 트리 뽑아내기 (중4/고3)&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2024_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2903</id>
		<title>2024 한국정보올림피아드(KOI) 2차 대회 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2024_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2903"/>
		<updated>2026-04-29T09:58:29Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2024 KOI, 2024 초등부 2차 대회, 보물 찾기, 가로등, 색깔 모으기, 양손에 V, 정올 보물 찾기, 정올 가로등, 정올 색깔 모으기, 정올 양손에 V|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1688 1. 보물찾기 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
﻿﻿📄 문제 개요﻿&lt;br /&gt;
&lt;br /&gt;
﻿다빈이가 무한히 긴 수직선 위에서 보물을 찾는 놀이를 합니다.&lt;br /&gt;
보물은 왼쪽(L)과 오른쪽(R) 두 곳에 숨겨져 있고, 다빈이는 그 사이인 시작 위치(S)에서 출발합니다.&lt;br /&gt;
&lt;br /&gt;
다빈이는 다음과 같은 규칙으로 이동합니다.&lt;br /&gt;
&lt;br /&gt;
[[파일:2024KOI보물찾기1.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
* 1단계: 제자리(S) 조사&lt;br /&gt;
* 2단계: 오른쪽으로 1칸 떨어진 곳(S+1) 조사&lt;br /&gt;
* 3단계: 왼쪽으로 1칸 떨어진 곳(S-1) 조사&lt;br /&gt;
* 4단계: 오른쪽으로 2칸 떨어진 곳(S+2) 조사&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 규칙대로 번갈아 가며 범위를 넓혀갈 때, 왼쪽(L)이나 오른쪽(R) 보물 중 &#039;&#039;&#039;가장 먼저 보물을 찾게 되는 단계&#039;&#039;&#039;를 구하는 문제입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿﻿💡 첫 번째 접근 - 직접 이동해보기 ===&lt;br /&gt;
가장 직관적인 방법은 시작 위치(S)부터 한 단계씩 직접 움직여보면서 L 또는 R에 도착하는 상황을 확인하는 것입니다.&lt;br /&gt;
&lt;br /&gt;
예를 들어 &#039;&#039;&#039;왼쪽 보물이 2(L=2), 오른쪽 보물이 9(R=9)&#039;&#039;&#039;에 있고 &#039;&#039;&#039;다빈이가 5(S=5)에서 출발&#039;&#039;&#039;한다고 가정해 보겠습니다.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!단계&lt;br /&gt;
!이동 방향&lt;br /&gt;
!다빈이의 위치&lt;br /&gt;
!확인 결과&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|제자리&lt;br /&gt;
|5&lt;br /&gt;
|꽝&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|오른쪽&lt;br /&gt;
|6 (5+1)&lt;br /&gt;
|꽝&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|왼쪽&lt;br /&gt;
|4 (5-1)&lt;br /&gt;
|꽝&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|오른쪽&lt;br /&gt;
|7 (5+2)&lt;br /&gt;
|꽝&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|왼쪽&lt;br /&gt;
|3 (5-2)&lt;br /&gt;
|꽝&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|오른쪽&lt;br /&gt;
|8 (5+3)&lt;br /&gt;
|꽝&lt;br /&gt;
|-&lt;br /&gt;
|7&lt;br /&gt;
|왼쪽&lt;br /&gt;
|2 (5-3)&lt;br /&gt;
|왼쪽 보물 찾음&lt;br /&gt;
|}&lt;br /&gt;
이렇게 단계(step)를 1씩 늘려가며 짝수일 때는 오른쪽, 홀수일 때는 왼쪽을 확인하다가,&lt;br /&gt;
&lt;br /&gt;
다빈이의 현재 위치가 L이나 R과 같아지면 반복을 멈추고 단계를 출력합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현 - 하나씩 모두 비교하기 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
input = sys.stdin.readline&lt;br /&gt;
&lt;br /&gt;
t = int(input())&lt;br /&gt;
for _ in range(t):&lt;br /&gt;
    l, r, s = map(int, input().split())&lt;br /&gt;
    &lt;br /&gt;
    step = 1&lt;br /&gt;
    k = 0&lt;br /&gt;
    while True:&lt;br /&gt;
        # step이 짝수면 오른쪽(+k), 홀수면 왼쪽(-k)&lt;br /&gt;
        if step % 2 == 0:&lt;br /&gt;
            pos = s + k&lt;br /&gt;
        else:&lt;br /&gt;
            pos = s - k&lt;br /&gt;
            &lt;br /&gt;
        # 보물을 찾으면 종료&lt;br /&gt;
        if pos == l or pos == r:&lt;br /&gt;
            print(step)&lt;br /&gt;
            break&lt;br /&gt;
            &lt;br /&gt;
        # 다음 단계를 위한 설정&lt;br /&gt;
        step += 1&lt;br /&gt;
        if step % 2 == 0:&lt;br /&gt;
            k += 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿이 방식은 구현이 쉽다는 장점이 있지만, 제약 조건에 따라 보물이 시작점으로부터 1억 칸(100,000,000) 떨어져 있다면&lt;br /&gt;
&lt;br /&gt;
반복문도 수억 번을 돌아야 합니다. 따라서 제한 시간 내에 모든 테스트 케이스를 통과하지 못하고 &#039;&#039;&#039;부분 점수(48점)&#039;&#039;&#039;를 받게 됩니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 두 번째 접근 - 수학적 규칙 찾기 ===&lt;br /&gt;
반복문으로 인한 시간 초과를 피하려면 종이 위에서 다빈이의 이동 패턴을 차분하게 수식으로 전개해 보아야 합니다.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!단계&lt;br /&gt;
!이동 방향&lt;br /&gt;
!다빈이의 위치&lt;br /&gt;
!목표 지점&lt;br /&gt;
|-&lt;br /&gt;
|1(홀수)&lt;br /&gt;
|제자리&lt;br /&gt;
|S&lt;br /&gt;
|d&lt;br /&gt;
|-&lt;br /&gt;
|2(짝수)&lt;br /&gt;
|오른쪽&lt;br /&gt;
|S + 1&lt;br /&gt;
|R(오른쪽 보물)&lt;br /&gt;
|-&lt;br /&gt;
|3(홀수)&lt;br /&gt;
|왼쪽&lt;br /&gt;
|S - 1&lt;br /&gt;
|L(왼쪽 보물)&lt;br /&gt;
|-&lt;br /&gt;
|4(짝수)&lt;br /&gt;
|오른쪽&lt;br /&gt;
|S + 2&lt;br /&gt;
|R(오른쪽 보물)&lt;br /&gt;
|-&lt;br /&gt;
|5(홀수)&lt;br /&gt;
|왼쪽&lt;br /&gt;
|S - 2&lt;br /&gt;
|L(왼쪽 보물)&lt;br /&gt;
|}&lt;br /&gt;
﻿가장 중요한 핵심은 오른쪽, 왼쪽을 번갈아 가며 확인하기 때문에 &#039;&#039;&#039;두 단계를 거쳐야&#039;&#039;&#039; 어느 한 방향으로 한 칸씩 전진이 가능하다는 점입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;오른쪽 보물(R)을 찾는 규칙&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
오른쪽으로 1칸 전진하려면 (오른쪽) 👉 &#039;&#039;&#039;2단계&#039;&#039;&#039; 소요&lt;br /&gt;
&lt;br /&gt;
오른쪽으로 2칸 전진하려면 (오른쪽, 왼쪽, 오른쪽) 👉 &#039;&#039;&#039;4단계&#039;&#039;&#039; 소요&lt;br /&gt;
&lt;br /&gt;
오른쪽으로 떨어진 거리(R - S)를 가기 위해서는 &#039;&#039;&#039;두 단계씩&#039;&#039;&#039; 거쳐야 하므로 거리에 &#039;&#039;&#039;2를 곱하면&#039;&#039;&#039; 됩니다. 👉 &#039;&#039;&#039;수식: 2 * (R - S)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;왼쪽 보물(L)을 찾는 규칙&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
왼쪽으로 1칸 전진하려면 (오른쪽, 왼쪽) 👉 &#039;&#039;&#039;3단계&#039;&#039;&#039; 소요&lt;br /&gt;
&lt;br /&gt;
왼쪽으로 2칸 전진하려면 (오른쪽, 왼쪽, 오른쪽, 왼쪽) 👉 &#039;&#039;&#039;5단계&#039;&#039;&#039; 소요&lt;br /&gt;
&lt;br /&gt;
항상 오른쪽을 먼저 확인한 뒤 왼쪽을 확인하기 때문에 왼쪽으로 떨어진 거리(S - L)에 &#039;&#039;&#039;2를 곱한 뒤, 처음에 썼던 1단계를 더해주면&#039;&#039;&#039; 됩니다.&lt;br /&gt;
&lt;br /&gt;
👉 &#039;&#039;&#039;수식: 2 * (S - L) + 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현 - 카드 번호 처음 등장 위치 메모해두기﻿ ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
t = int(input())&lt;br /&gt;
for i in range(t):&lt;br /&gt;
    l, r, s = map(int, input().split())&lt;br /&gt;
    &lt;br /&gt;
    r_step = 2 * (r - s)  # 오른쪽 보물(R)을 찾는 단계&lt;br /&gt;
    l_step = 2 * (s - l) + 1 # 왼쪽 보물(L)을 찾는 단계&lt;br /&gt;
    &lt;br /&gt;
    # 둘 중 더 빨리 찾는(작은) 단계 출력&lt;br /&gt;
    print(min(r_step, l_step))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿﻿이렇게 수학적인 규칙을 찾아 수식을 잘 생각해내었다면 보물이 아주 멀리있더라도 단 한 번의 사칙연산으로 정답을 구할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
따라서 제한 시간 내에 모든 테스트 케이스를 통과하고 &#039;&#039;&#039;100점&#039;&#039;&#039;을 받을 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📊 정답률 ===&lt;br /&gt;
2차에 진출한 80% 이상의 초등부 학생들이 100점을 받아낸 비교적 난이도가 쉬운 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
100점을 받지 못했더라도 거의 모든 학생들이 48점을 받을 수 있는 풀이는 해낸 모습입니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1689 2. 가로등 (초2/중1/고1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== 📄 문제 개요 ===&lt;br /&gt;
수직선 도로 위에 N개의 가로등이 켜져 있습니다. 도로의 끝은 L로 아주 깁니다.&lt;br /&gt;
&lt;br /&gt;
어떤 위치의 &#039;&#039;&#039;어두운 정도&#039;&#039;&#039;는 그 위치에서 &#039;&#039;&#039;가장 가까운 가로등까지의 거리&#039;&#039;&#039;를 뜻합니다.&lt;br /&gt;
&lt;br /&gt;
[[파일:2024KOI가로등1.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
예를 들어 3, 6번 위치에 가로등이 있다면 그림과 같이 가로등이 있는 위치(p=0)을 시작으로 어두운 정도를 표시하게 됩니다.&lt;br /&gt;
&lt;br /&gt;
0부터 L까지 모든 위치의 어두운 정도를 구했을 때, &#039;&#039;&#039;가장 작은 값부터 K번째로 작은 값&#039;&#039;&#039;까지 차례대로 출력해야 합니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== 💡 첫 번째 접근 - 모든 위치 직접 탐색하기 ===&lt;br /&gt;
가장 먼저 떠올릴 수 있는 직관적인 방법은 0부터 L까지 도로 위를 직접 걸어가며, 각 위치마다 모든 가로등과의 거리를 계산해 보는 것입니다.&lt;br /&gt;
&lt;br /&gt;
예를 들어 각 위치(pos)에서 가로등까지의 거리들을 모두 구한 뒤, 그중 가장 짧은 거리가 그 위치의 어두운 정도가 됩니다.&lt;br /&gt;
&lt;br /&gt;
[[파일:2024KOI가로등2.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
﻿﻿이 값들을 리스트에 모아 오름차순으로 정렬한 뒤 앞에서부터 K개를 출력하는 방식입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현 - 모든 위치 직접 탐색하기﻿ ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
input = sys.stdin.readline&lt;br /&gt;
&lt;br /&gt;
l, n, k = map(int, input().split())&lt;br /&gt;
a = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
ans = []&lt;br /&gt;
&lt;br /&gt;
# 0부터 L까지 모든 위치 확인&lt;br /&gt;
for pos in range(l + 1):&lt;br /&gt;
    # 현재 위치에서 모든 가로등과의 거리 중 최솟값(어두운 정도) 찾기&lt;br /&gt;
    m = 1000000000000000000 # 이론상 가능한 최대 거리&lt;br /&gt;
    for i in a:&lt;br /&gt;
        m = min(m, abs(pos - i))&lt;br /&gt;
    ans.append(m)&lt;br /&gt;
&lt;br /&gt;
ans.sort() # 오름차순 정렬&lt;br /&gt;
&lt;br /&gt;
# 가장 어두운 정도가 작은 K개 출력&lt;br /&gt;
for i in range(k):&lt;br /&gt;
    print(ans[i])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿﻿위 코드는 L칸을 일일이 확인하며 N개의 가로등을 매번 비교하므로,&lt;br /&gt;
&lt;br /&gt;
가로등 개수(N)와 도로 길이(L)가 모두 작은 부분문제 2번(N &amp;lt;= 2500, L &amp;lt;= 2500)까지만 무사히 통과하여 &#039;&#039;&#039;20점&#039;&#039;&#039;을 받게 됩니다.&lt;br /&gt;
&lt;br /&gt;
만약 도로 길이가 부분문제 4번(L &amp;lt;= 5,000,000)이나, 사실상 무한하게 커질 수 있는 부분문제 5번의 데이터가 들어오면&lt;br /&gt;
&lt;br /&gt;
이런 방식은 &#039;&#039;&#039;&amp;lt;nowiki/&amp;gt;&#039;시간 초과&#039;&#039;&#039;&#039;가 발생할 수밖에 없습니다. 따라서 100점을 받기 위해서는 탐색 방식을 바꾸어야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 두 번째 접근 - 너비 우선 탐색(BFS)﻿ ===&lt;br /&gt;
﻿우리가 출력해야할 것은 가장 밝은(어두운 정도가 가장 낮은) K개의 값입니다.&lt;br /&gt;
&lt;br /&gt;
따라서 가장 밝은 곳&#039;&#039;&#039;(가로등이 있는 위치)&#039;&#039;&#039;부터 영역을 점점 넓혀나가면서 탐색하는 방법을 생각해봅시다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
잔잔한 호수에 돌멩이를 던졌을 때 퍼져나가는 물결을 상상해봅시다.&lt;br /&gt;
&lt;br /&gt;
가로등이 서 있는 위치를 물결의 중심(거리 0)이라고 생각하고, 양옆으로 동시에 1칸씩 영역을 넓혀가는 겁니다.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;거리 0인 곳:&#039;&#039;&#039; 가로등이 있는 중심 위치들&lt;br /&gt;
# &#039;&#039;&#039;거리 1인 곳:&#039;&#039;&#039; 중심에서 양옆으로 1칸 퍼져나간 위치들&lt;br /&gt;
# &#039;&#039;&#039;거리 2인 곳:&#039;&#039;&#039; 거기서 다시 양옆으로 1칸 더 퍼져나간 위치들&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
도로의 길이와 무관하게 가장 밝은 곳부터 점점 범위를 넓혀나가다가 가장 밝은 K개 값을 찾는 순간 탐색을 종료합니다.&lt;br /&gt;
&lt;br /&gt;
이처럼 가까운 곳부터 동심원처럼 영역을 넓혀가는 방식을 컴퓨터 공학에서는 &#039;&#039;&#039;너비 우선 탐색(BFS)&#039;&#039;&#039;이라고 부릅니다.&lt;br /&gt;
&lt;br /&gt;
[[파일:2024KOI가로등3.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
=== ﻿﻿💻 코드 구현 - 너비 우선 탐색(BFS) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
l, n, k = map(int, input().split())&lt;br /&gt;
# 가로등 위치는 탐색 중 변하지 않으므로, 리스트보다 가볍고 빠른 튜플(tuple) 사용&lt;br /&gt;
a = tuple(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
# 100경 크기의 방문 배열 대신, 밟은 좌표만 세트(set) 활용 (메모리 초과 방지)&lt;br /&gt;
visit = set()&lt;br /&gt;
q = deque()&lt;br /&gt;
&lt;br /&gt;
# 1단계: 초기 가로등 위치들을 어두운 정도(거리) 0으로 큐에 모두 삽입, 방문 처리&lt;br /&gt;
for i in a:&lt;br /&gt;
    q.append((i, 0))&lt;br /&gt;
    visit.add(i)&lt;br /&gt;
&lt;br /&gt;
# 2단계: 딱 K번만 정답을 출력하도록 while 조건 설정&lt;br /&gt;
while k &amp;gt; 0:&lt;br /&gt;
    x, p = q.popleft()  # x: 현재 위치, p: 어두운 정도(거리)&lt;br /&gt;
    &lt;br /&gt;
    # 거리가 짧은 곳부터 순서대로 출력됨&lt;br /&gt;
    print(p)&lt;br /&gt;
    k -= 1  # 정답을 출력할 때마다 목표 개수(K)를 1씩 감소&lt;br /&gt;
    &lt;br /&gt;
    # 3단계: 현재 위치 기준 양옆(왼쪽 1칸, 오른쪽 1칸) 탐색&lt;br /&gt;
    for cx in [(x - 1), (x + 1)]:&lt;br /&gt;
        if 0 &amp;lt;= cx &amp;lt;= l: # 도로 범위(0 ~ L) 안에 포함되고&lt;br /&gt;
            if cx not in visit: # 아직 방문하지 않은 위치라면&lt;br /&gt;
                visit.add(cx) # 방문 처리한 후&lt;br /&gt;
                q.append((cx, b + 1))  # 거리를 1 늘려서 큐에 삽입&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿일반적으로 BFS 코드를 작성할 때, 방문 배열(visit = [False] * (L + 1) 형태)를 활용합니다.&lt;br /&gt;
&lt;br /&gt;
하지만 지금의 경우 &#039;&#039;&#039;L 최대 크기(100경)&#039;&#039;&#039;이 너무 크기 때문에 리스트를 활용하면 &#039;&#039;&#039;메모리 초과&#039;&#039;&#039;가 발생합니다.&lt;br /&gt;
&lt;br /&gt;
그래서 이번에는 set 자료구조를 사용해 우리가 &#039;&#039;&#039;실제로 방문한 좌표만 기록&#039;&#039;&#039;함으로써 메모리 낭비를 최소한으로 처리했습니다.&lt;br /&gt;
&lt;br /&gt;
이렇게 아주 &#039;&#039;&#039;큰 데이터 범위로 인한 몇 가지 함정&#039;&#039;&#039;을 피해서 완성하면, &#039;&#039;&#039;100점&#039;&#039;&#039;을 획득할 수 있습니다.&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;3. 색깔 모으기 (초3/중2)&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;4. 양손에 V (초4)&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2024_%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)_1%EC%B0%A8_%EB%8C%80%ED%9A%8C_2%EA%B5%90%EC%8B%9C_%EC%A4%91%EB%93%B1%EB%B6%80&amp;diff=2902</id>
		<title>2024 한국정보올림피아드(KOI) 1차 대회 2교시 중등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2024_%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)_1%EC%B0%A8_%EB%8C%80%ED%9A%8C_2%EA%B5%90%EC%8B%9C_%EC%A4%91%EB%93%B1%EB%B6%80&amp;diff=2902"/>
		<updated>2026-04-29T09:57:37Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2024 KOI, 2024 중등부 1차 대회 2교시, 두 배, 회의 장소, 이진 트리, 정올 두 배, 정올 회의 장소, 정올 이진 트리|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1881 1. 두 배 (초2/중1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== 📄 문제 개요 ===&lt;br /&gt;
수열을 오름차순(점점 커지거나 같은 상태)으로 만들기 위해, 숫자에 &#039;&#039;&#039;2를 곱하는 연산&#039;&#039;&#039;을 최소 몇 번 해야 하는지 구하는 문제입니다.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;상황:&#039;&#039;&#039; 앞의 숫자보다 뒤의 숫자가 작다면, 뒤의 숫자에 2를 계속 곱해서 앞의 숫자보다 크거나 같게 만들어야 합니다.&lt;br /&gt;
* &#039;&#039;&#039;목표:&#039;&#039;&#039; 배열 전체를 오름차순으로 만드는 데 필요한 전체 곱셈 연산의 최소 횟수를 구해야 합니다.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;※ 이번 문제는 log 개념을 알고 있다면 더 수월하지만, 초/중등 부문 문제인 만큼 log 사용은 배제합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== 💡 첫 번째 접근 - 직접 2를 곱해보기 ===&lt;br /&gt;
가장 먼저 떠오르는 방법은 문제의 조건 그대로 앞의 숫자보다 뒤의 숫자가 작을 때마다 직접 2를 곱해보며 횟수를 세는 것입니다.&lt;br /&gt;
&lt;br /&gt;
[[파일:2024KOI두배1.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
* 두 번째 숫자 1은 앞의 3보다 작기 때문에 더 커지기 위해 2를 &#039;&#039;&#039;2번&#039;&#039;&#039; 곱합니다. &#039;&#039;&#039;(현재 누적 연산 2회)&#039;&#039;&#039;&lt;br /&gt;
* 세 번째 숫자 5는 앞의 4보다 크기 때문에 연산을 하지 않습니다. &#039;&#039;&#039;(현재 누적 연산 2회)&#039;&#039;&#039;&lt;br /&gt;
* 네 번째 숫자 1은 앞의 5보다 작기 때문에 더 커지기 위해 2를 &#039;&#039;&#039;3번&#039;&#039;&#039; 곱합니다. &#039;&#039;&#039;(현재 누적 연산 5회)&#039;&#039;&#039;&lt;br /&gt;
* 다섯 번째 숫자 5는 앞의 8보다 작기 때문에 더 커지기 위해 2를 &#039;&#039;&#039;1번&#039;&#039;&#039; 곱합니다. &#039;&#039;&#039;(현재 누적 연산 6회)&#039;&#039;&#039;&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현 - 직접 2를 곱해보기﻿ ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n = int(input())&lt;br /&gt;
arr = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
ans = 0&lt;br /&gt;
&lt;br /&gt;
for i in range(1, n):&lt;br /&gt;
    while arr[i-1] &amp;gt; arr[i]: # 내 앞 숫자보다 커질 때까지 2를 곱하기&lt;br /&gt;
        arr[i] *= 2&lt;br /&gt;
        ans += 1&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿이 코드로도 주어진 예제들에 대한 정답은 잘 출력되는 것을 볼 수 있습니다.&lt;br /&gt;
하지만 수열의 길이(N)가 최대 250,000개일 때, &#039;&#039;&#039;숫자가 계속 작아지는 최악의 경우&#039;&#039;&#039;를 상상해 봅시다.&lt;br /&gt;
&lt;br /&gt;
마지막 숫자는 2를 수십만 번 곱해야 하고, 숫자의 길이는 수만 자리를 넘어가게 됩니다.&lt;br /&gt;
&lt;br /&gt;
이처럼 거대한 숫자를 매번 비교하고 곱하는 과정에서 엄청난 연산 시간이 소모되어 결국 &#039;&#039;&#039;시간 초과&#039;&#039;&#039;가 발생합니다.&lt;br /&gt;
&lt;br /&gt;
그래서 위 코드로는 &#039;&#039;&#039;33점&#039;&#039;&#039; 획득이 가능합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿💡 두 번째 접근 - 곱한 횟수 기록하기 ===&lt;br /&gt;
이번에는 숫자를 직접 부풀리는 대신, 이 숫자는 2를 몇 번 곱한 상태인지 &#039;&#039;&#039;횟수&#039;&#039;&#039;를 따로 기록해 두는 방법입니다.&lt;br /&gt;
&lt;br /&gt;
현재 숫자와 이전 숫자의 &#039;&#039;&#039;원래 크기&#039;&#039;&#039;를 비교하여 다음과 같이 횟수(cnt)를 정합니다.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;이전 숫자가 더 클 때 (따라잡아야 할 때)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt; 현재 숫자에 2를 몇 번 곱해야 이전 숫자 이상이 되는지 계산하여, 그 횟수만큼 이전 숫자의 누적 횟수에 더해줍니다.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;현재 숫자가 더 클 때 (여유가 있을 때)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt; 현재 숫자가 이미 크기 때문에, 이전 숫자의 누적 횟수에서 2를 나눌 수 있는 만큼(여유분) 횟수를 차감해 줍니다.&lt;br /&gt;
&lt;br /&gt;
[[파일:2024KOI두배2.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현 - 곱한 횟수 기록하기﻿ ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
input = sys.stdin.readline&lt;br /&gt;
&lt;br /&gt;
n = int(input())&lt;br /&gt;
a = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
ans = 0&lt;br /&gt;
cnt = 0&lt;br /&gt;
&lt;br /&gt;
for i in range(1, n):&lt;br /&gt;
    prev, curr = a[i-1], a[i]&lt;br /&gt;
    &lt;br /&gt;
    if prev &amp;gt; curr: # 이전 숫자가 더 크다면&lt;br /&gt;
        k = 0&lt;br /&gt;
        tmp = curr&lt;br /&gt;
        while tmp &amp;lt; prev: # 2를 곱하는 횟수 누적&lt;br /&gt;
            tmp *= 2&lt;br /&gt;
            k += 1&lt;br /&gt;
        cnt += k&lt;br /&gt;
        &lt;br /&gt;
    else: # 현재 숫자가 더 크다면&lt;br /&gt;
        k = 0&lt;br /&gt;
        tmp = prev&lt;br /&gt;
        while tmp * 2 &amp;lt;= curr: # 여유 횟수만큼 누적&lt;br /&gt;
            tmp *= 2&lt;br /&gt;
            k += 1&lt;br /&gt;
        cnt = max(0, cnt - k) # 이전 누적 횟수에서 여유분 차감(cnt - k), 0보다 작아질 수는 없음&lt;br /&gt;
        &lt;br /&gt;
    ans += cnt&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿﻿숫자를 직접 곱하지 않고 원래 숫자들 간의 &#039;&#039;&#039;스케일 차이만 비교&#039;&#039;&#039;하기 때문에 20만 개의 숫자가 주어져도 무리없이 &#039;&#039;&#039;100점을&#039;&#039;&#039; 받을 수 있습니다.﻿&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿📊 정답률 ===&lt;br /&gt;
[[파일:2024KOI두배3.png|center|class=coders70]]&lt;br /&gt;
&lt;br /&gt;
[[파일:2024KOI두배4.png|center|class=coders70]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;2. 회의 장소 (중2)&#039;&#039;&#039; ==&lt;br /&gt;
추가 예정&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;3. 이진 트리 (중3/고2)&#039;&#039;&#039; ==&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2024_%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)_1%EC%B0%A8_%EB%8C%80%ED%9A%8C_2%EA%B5%90%EC%8B%9C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2901</id>
		<title>2024 한국정보올림피아드(KOI) 1차 대회 2교시 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2024_%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)_1%EC%B0%A8_%EB%8C%80%ED%9A%8C_2%EA%B5%90%EC%8B%9C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2901"/>
		<updated>2026-04-29T09:57:15Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2024 KOI, 2024 초등부 1차 대회 2교시, 등교, 두배, 반품 회수, 정올 등교, 정올 두 배, 정올 반품 회수|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1880 1. 등교 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== 📄 문제 개요 ===&lt;br /&gt;
매일 아침 학교에 가는 상황을 컴퓨터 프로그램으로 해결해 보는 문제입니다.&lt;br /&gt;
&lt;br /&gt;
정올이에게는 여러 대의 &#039;&#039;&#039;버스 시간표&#039;&#039;&#039;와 학교에 늦지 않게 도착해야 하는 &#039;&#039;&#039;기준 시간(X)&#039;&#039;&#039;이 주어집니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
목표는 다음 두 가지입니다.&lt;br /&gt;
&lt;br /&gt;
1. 버스를 타고 학교에 도착하는 시간이 &#039;&#039;&#039;기준 시간&#039;&#039;&#039;을 넘기지 않아야 합니다.&lt;br /&gt;
&lt;br /&gt;
2. 조건을 만족하는 버스 중 &#039;&#039;&#039;가장 늦게 출발하는 버스&#039;&#039;&#039;를 선택해야 합니다.&lt;br /&gt;
&lt;br /&gt;
만약 어떤 버스를 타도 지각한다면 &#039;&#039;&#039;-1을 출력&#039;&#039;&#039;합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
코드를 작성하기 전에, 먼저 주어진 상황을 분석해 봅니다.&lt;br /&gt;
&lt;br /&gt;
예를 들어 &#039;&#039;&#039;30분&#039;&#039;&#039; 안에는 학교에 도착해야 한다고 가정해 보겠습니다.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;1&amp;quot; rowspan=&amp;quot;1&amp;quot; |&#039;&#039;&#039;버스 번호&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;1&amp;quot; rowspan=&amp;quot;1&amp;quot; |출발 시간&lt;br /&gt;
| colspan=&amp;quot;1&amp;quot; rowspan=&amp;quot;1&amp;quot; |&#039;&#039;&#039;이동 시간&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;1&amp;quot; rowspan=&amp;quot;1&amp;quot; |&#039;&#039;&#039;🏫 학교 도착 시간&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;1&amp;quot; rowspan=&amp;quot;1&amp;quot; |1번&lt;br /&gt;
| colspan=&amp;quot;1&amp;quot; rowspan=&amp;quot;1&amp;quot; |10분&lt;br /&gt;
| colspan=&amp;quot;1&amp;quot; rowspan=&amp;quot;1&amp;quot; |15분&lt;br /&gt;
| colspan=&amp;quot;1&amp;quot; rowspan=&amp;quot;1&amp;quot; |10 + 15 = 25분&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;1&amp;quot; rowspan=&amp;quot;1&amp;quot; |2번&lt;br /&gt;
| colspan=&amp;quot;1&amp;quot; rowspan=&amp;quot;1&amp;quot; |15분&lt;br /&gt;
| colspan=&amp;quot;1&amp;quot; rowspan=&amp;quot;1&amp;quot; |20분&lt;br /&gt;
| colspan=&amp;quot;1&amp;quot; rowspan=&amp;quot;1&amp;quot; |15 + 20 = 35분&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;1&amp;quot; rowspan=&amp;quot;1&amp;quot; |3번&lt;br /&gt;
| colspan=&amp;quot;1&amp;quot; rowspan=&amp;quot;1&amp;quot; |20분&lt;br /&gt;
| colspan=&amp;quot;1&amp;quot; rowspan=&amp;quot;1&amp;quot; |10분&lt;br /&gt;
| colspan=&amp;quot;1&amp;quot; rowspan=&amp;quot;1&amp;quot; |20 + 10 = 30분&lt;br /&gt;
|}&lt;br /&gt;
과정을 차례대로 살펴보면 다음과 같습니다.&lt;br /&gt;
&lt;br /&gt;
1. 각 버스의 도착 시간(출발 시간 + 이동 시간)을 계산합니다.&lt;br /&gt;
&lt;br /&gt;
2. 도착 시간이 30분을 초과하는 2번 버스는 선택지에서 제외합니다.&lt;br /&gt;
&lt;br /&gt;
3. 남은 1번, 3번 버스 중 &#039;&#039;&#039;가장 늦게 출발&#039;&#039;&#039;하는 3번 버스(20분 출발)가 최적의 선택이 됩니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
복잡한 수학 공식 없이, 도착 시간을 계산하여 지각 여부를 판별하고 통과한 것 중 가장 큰 값을 고르면 됩니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💻 코드 구현 - 하나씩 모두 비교하기 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n, x = map(int, input().split())&lt;br /&gt;
&lt;br /&gt;
ans = -1 # 초기값을 -1로 설정하여 무조건 지각하는 경우를 고려&lt;br /&gt;
for i in range(n):&lt;br /&gt;
    s, t = map(int, input().split())&lt;br /&gt;
    if s + t &amp;lt;= x: # 지각하지 않을 수 있다면&lt;br /&gt;
        if ans &amp;lt; s: # 가장 늦게 오는 버스 시간 업데이트&lt;br /&gt;
            ans = s&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📊 정답률 ===&lt;br /&gt;
[[파일:2024KOI등교1.png|center|class=coders70]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1881 2. 두 배 (초2/중1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== 📄 문제 개요 ===&lt;br /&gt;
수열을 오름차순(점점 커지거나 같은 상태)으로 만들기 위해, 숫자에 &#039;&#039;&#039;2를 곱하는 연산&#039;&#039;&#039;을 최소 몇 번 해야 하는지 구하는 문제입니다.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;상황:&#039;&#039;&#039; 앞의 숫자보다 뒤의 숫자가 작다면, 뒤의 숫자에 2를 계속 곱해서 앞의 숫자보다 크거나 같게 만들어야 합니다.&lt;br /&gt;
* &#039;&#039;&#039;목표:&#039;&#039;&#039; 배열 전체를 오름차순으로 만드는 데 필요한 전체 곱셈 연산의 최소 횟수를 구해야 합니다.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;※ 이번 문제는 log 개념을 알고 있다면 더 수월하지만, 초/중등 부문 문제인 만큼 log 사용은 배제합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== 💡 첫 번째 접근 - 직접 2를 곱해보기 ===&lt;br /&gt;
가장 먼저 떠오르는 방법은 문제의 조건 그대로 앞의 숫자보다 뒤의 숫자가 작을 때마다 직접 2를 곱해보며 횟수를 세는 것입니다.&lt;br /&gt;
&lt;br /&gt;
[[파일:2024KOI두배1.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
* 두 번째 숫자 1은 앞의 3보다 작기 때문에 더 커지기 위해 2를 &#039;&#039;&#039;2번&#039;&#039;&#039; 곱합니다. &#039;&#039;&#039;(현재 누적 연산 2회)&#039;&#039;&#039;&lt;br /&gt;
* 세 번째 숫자 5는 앞의 4보다 크기 때문에 연산을 하지 않습니다. &#039;&#039;&#039;(현재 누적 연산 2회)&#039;&#039;&#039;&lt;br /&gt;
* 네 번째 숫자 1은 앞의 5보다 작기 때문에 더 커지기 위해 2를 &#039;&#039;&#039;3번&#039;&#039;&#039; 곱합니다. &#039;&#039;&#039;(현재 누적 연산 5회)&#039;&#039;&#039;&lt;br /&gt;
* 다섯 번째 숫자 5는 앞의 8보다 작기 때문에 더 커지기 위해 2를 &#039;&#039;&#039;1번&#039;&#039;&#039; 곱합니다. &#039;&#039;&#039;(현재 누적 연산 6회)&#039;&#039;&#039;&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현 - 직접 2를 곱해보기﻿ ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n = int(input())&lt;br /&gt;
arr = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
ans = 0&lt;br /&gt;
&lt;br /&gt;
for i in range(1, n):&lt;br /&gt;
    while arr[i-1] &amp;gt; arr[i]: # 내 앞 숫자보다 커질 때까지 2를 곱하기&lt;br /&gt;
        arr[i] *= 2&lt;br /&gt;
        ans += 1&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿이 코드로도 주어진 예제들에 대한 정답은 잘 출력되는 것을 볼 수 있습니다.&lt;br /&gt;
하지만 수열의 길이(N)가 최대 250,000개일 때, &#039;&#039;&#039;숫자가 계속 작아지는 최악의 경우&#039;&#039;&#039;를 상상해 봅시다.&lt;br /&gt;
&lt;br /&gt;
마지막 숫자는 2를 수십만 번 곱해야 하고, 숫자의 길이는 수만 자리를 넘어가게 됩니다.&lt;br /&gt;
&lt;br /&gt;
이처럼 거대한 숫자를 매번 비교하고 곱하는 과정에서 엄청난 연산 시간이 소모되어 결국 &#039;&#039;&#039;시간 초과&#039;&#039;&#039;가 발생합니다.&lt;br /&gt;
&lt;br /&gt;
그래서 위 코드로는 &#039;&#039;&#039;33점&#039;&#039;&#039; 획득이 가능합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿💡 두 번째 접근 - 곱한 횟수 기록하기 ===&lt;br /&gt;
이번에는 숫자를 직접 부풀리는 대신, 이 숫자는 2를 몇 번 곱한 상태인지 &#039;&#039;&#039;횟수&#039;&#039;&#039;를 따로 기록해 두는 방법입니다.&lt;br /&gt;
&lt;br /&gt;
현재 숫자와 이전 숫자의 &#039;&#039;&#039;원래 크기&#039;&#039;&#039;를 비교하여 다음과 같이 횟수(cnt)를 정합니다.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;이전 숫자가 더 클 때 (따라잡아야 할 때)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt; 현재 숫자에 2를 몇 번 곱해야 이전 숫자 이상이 되는지 계산하여, 그 횟수만큼 이전 숫자의 누적 횟수에 더해줍니다.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;현재 숫자가 더 클 때 (여유가 있을 때)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt; 현재 숫자가 이미 크기 때문에, 이전 숫자의 누적 횟수에서 2를 나눌 수 있는 만큼(여유분) 횟수를 차감해 줍니다.&lt;br /&gt;
&lt;br /&gt;
[[파일:2024KOI두배2.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현 - 곱한 횟수 기록하기﻿ ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
input = sys.stdin.readline&lt;br /&gt;
&lt;br /&gt;
n = int(input())&lt;br /&gt;
a = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
ans = 0&lt;br /&gt;
cnt = 0&lt;br /&gt;
&lt;br /&gt;
for i in range(1, n):&lt;br /&gt;
    prev, curr = a[i-1], a[i]&lt;br /&gt;
    &lt;br /&gt;
    if prev &amp;gt; curr: # 이전 숫자가 더 크다면&lt;br /&gt;
        k = 0&lt;br /&gt;
        tmp = curr&lt;br /&gt;
        while tmp &amp;lt; prev: # 2를 곱하는 횟수 누적&lt;br /&gt;
            tmp *= 2&lt;br /&gt;
            k += 1&lt;br /&gt;
        cnt += k&lt;br /&gt;
        &lt;br /&gt;
    else: # 현재 숫자가 더 크다면&lt;br /&gt;
        k = 0&lt;br /&gt;
        tmp = prev&lt;br /&gt;
        while tmp * 2 &amp;lt;= curr: # 여유 횟수만큼 누적&lt;br /&gt;
            tmp *= 2&lt;br /&gt;
            k += 1&lt;br /&gt;
        cnt = max(0, cnt - k) # 이전 누적 횟수에서 여유분 차감(cnt - k), 0보다 작아질 수는 없음&lt;br /&gt;
        &lt;br /&gt;
    ans += cnt&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿﻿숫자를 직접 곱하지 않고 원래 숫자들 간의 &#039;&#039;&#039;스케일 차이만 비교&#039;&#039;&#039;하기 때문에 20만 개의 숫자가 주어져도 무리없이 &#039;&#039;&#039;100점을&#039;&#039;&#039; 받을 수 있습니다.﻿&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿📊 정답률 ===&lt;br /&gt;
[[파일:2024KOI두배3.png|center|class=coders70]]&lt;br /&gt;
&lt;br /&gt;
[[파일:2024KOI두배4.png|center|class=coders70]]&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;﻿&#039;&#039;&#039; ===&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1882 3. 반품 회수 (초3/고1)]&#039;&#039;&#039; ==&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2025_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2900</id>
		<title>2025 한국정보올림피아드(KOI) 2차 대회 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2025_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2900"/>
		<updated>2026-04-29T09:55:09Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2025 KOI, 2025 초등부 2차 대회, 장애물, 거울, 통행료, 상자 보관, 정올 장애물, 정올 거울, 정올 통행료, 정올 상자 보관|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/2138 1. 장애물 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;📄 문제 개요&#039;&#039;&#039; ===&lt;br /&gt;
수직선 위 위치 0에서 출발하여 N개의 장애물을 모두 뛰어넘어야 합니다.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;행동 1:&#039;&#039;&#039; 오른쪽으로 1만큼 걸어간다.&lt;br /&gt;
* &#039;&#039;&#039;행동 2:&#039;&#039;&#039; 오른쪽으로 2만큼 점프한다.&lt;br /&gt;
* &#039;&#039;&#039;장애물 넘기 규칙:&#039;&#039;&#039; 위치 X에 있는 장애물을 넘으려면, &#039;&#039;&#039;반드시 위치 X-1에서 점프하여 위치 X+1에 도착&#039;&#039;&#039;해야 합니다.&lt;br /&gt;
&lt;br /&gt;
주어진 규칙을 활용해 &#039;&#039;&#039;모든 장애물을 넘기 위한 최소 이동 횟수&#039;&#039;&#039;를 구하고, 만약 넘는 것이 불가능하다면 &#039;&#039;&#039;-1&#039;&#039;&#039;을 출력하는 문제입니다.[[파일:2025KOI장애물1.png|center|class=coders100]]위 그림과 같이 한 칸, 혹은 두 칸을 움직여 최종적으로는 최소한의 움직임으로 모든 장애물을 넘어야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;💡 첫 번째 접근 - 문제 조건대로 하나씩 이동해보기 (Greedy)&#039;&#039;&#039; ===&lt;br /&gt;
가장 확실하고 직관적인 방법은 캐릭터가 직접 이동하는 과정을 코드로 시뮬레이션해 보는 것입니다.&lt;br /&gt;
&lt;br /&gt;
목적지(다음 장애물 앞 칸)까지 가장 적게 이동하려면  자연스럽게 1칸 걷기보다는 &#039;&#039;&#039;2칸 점프를 최대한 많이 활용&#039;&#039;&#039;해야 합니다.&lt;br /&gt;
&lt;br /&gt;
일단 이후는 생각하지 않고, &#039;&#039;&#039;현재 주어진 위치에서 최대한 앞으로 나가려고 하면&#039;&#039;&#039; 자연스럽게 정답에 도달할 수 있는 문제입니다.&lt;br /&gt;
&lt;br /&gt;
이처럼 지금 당장 눈앞에 보이는 가장 효율적인 선택을 먼저 취하는 방식을 컴퓨터 공학에서는 &#039;&#039;&#039;&amp;lt;nowiki/&amp;gt;&#039;그리디(Greedy, 탐욕) 알고리즘&#039;&#039;&#039;&#039;이라고 부릅니다.&lt;br /&gt;
&lt;br /&gt;
[[파일:2025KOI장애물1.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;0 위치:&#039;&#039;&#039; 2칸 앞에 장애물이 있어 2칸을 가지 못하기 때문에 &#039;&#039;&#039;1칸 이동(0 → 1)&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;1 위치:&#039;&#039;&#039; 2칸 앞에 장애물이 없기 때문에 &#039;&#039;&#039;2칸 이동(1 → 3)&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;3 위치:&#039;&#039;&#039; 2칸 앞에 장애물이 있어 2칸을 가지 못하기 때문에 &#039;&#039;&#039;1칸 이동(3 → 4)&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;4 위치:&#039;&#039;&#039; 2칸 앞에 장애물이 없기 때문에 &#039;&#039;&#039;2칸 이동(4 → 6)&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;6 위치:&#039;&#039;&#039; 2칸 앞에 장애물이 없기 때문에 &#039;&#039;&#039;2칸 이동(6 → 8)&#039;&#039;&#039;​&lt;br /&gt;
* &#039;&#039;&#039;8 위치:&#039;&#039;&#039; 2칸 앞에 장애물이 없기 때문에 &#039;&#039;&#039;2칸 이동(8 → 10)&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;10 위치:&#039;&#039;&#039; 2칸 앞에 장애물이 없기 때문에 &#039;&#039;&#039;2칸 이동(10 → 12), 모든 장애물 극복 완료&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
단, &#039;&#039;&#039;장애물 두 개가 붙어있는 경우&#039;&#039;&#039;(1칸 앞, 2칸 앞에 모두 장애물이 있는 경우)에는 장애물을 넘지 못한다는 사실을 기억해둡시다.&lt;br /&gt;
&lt;br /&gt;
=== 💻 &#039;&#039;&#039;코드 구현&#039;&#039;&#039; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n = int(input())&lt;br /&gt;
arr = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
last = arr[-1] # 마지막 장애물 위치&lt;br /&gt;
x = [0] * (last + 2) # 장애물 위치 기록 / 마지막 장애물을 넘는 것을 고려하여 한 칸 넉넉하게&lt;br /&gt;
for i in arr:&lt;br /&gt;
    x[i] = 1&lt;br /&gt;
&lt;br /&gt;
s = 0 # 현재 위치&lt;br /&gt;
ans = 0&lt;br /&gt;
while s &amp;lt; last: # 현 위치가 마지막 장애물보다 앞에 있는 동안&lt;br /&gt;
    if x[s+2] == 0: # 2칸 앞에 장애물이 없다면 2칸 전진&lt;br /&gt;
        s += 2&lt;br /&gt;
    elif x[s+1] == 0: # 1칸 앞에 장애물이 없다면 1칸 전진&lt;br /&gt;
        s += 1&lt;br /&gt;
    else: # 2칸 앞, 1칸 앞에 모두 장애물이 있으면 불가능&lt;br /&gt;
        ans = -1&lt;br /&gt;
        break&lt;br /&gt;
    ans += 1&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;이번 문제의 장애물 사이의 거리, 장애물의 개수가 최대 250,000이므로&lt;br /&gt;
&lt;br /&gt;
이렇게 반복문으로 하나하나 시뮬레이션해도 시간초과 없이 안정적으로 100점을 받을 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;💡 두 번째 접근 - 수학적 접근&#039;&#039;&#039; ===&lt;br /&gt;
두 번째 방법은 이동해야할 거리에 따른 횟수를 수학적으로 계산하는 것입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
i위치에서 j까지 이동할 때, 두 지점 거리(d)는 j - i 입니다.&lt;br /&gt;
&lt;br /&gt;
이동할 때 최대한 &#039;&#039;&#039;2칸 점프를 많이 활용&#039;&#039;&#039;해야하기 때문에 가능한 만큼 먼저 점프를 활용합니다. (d // 2)&lt;br /&gt;
&lt;br /&gt;
만약 도달하지 못하고 1칸이 남았다면 1칸 걷기를 더해 마무리합니다. (d % 2)&lt;br /&gt;
&lt;br /&gt;
d % 2 값은 0 또는 1이기 때문에 2칸 점프로만 원하는 지점에 도착했더라도 &#039;&#039;&#039;최소 이동 횟수는 d // 2 + d % 2&#039;&#039;&#039;로 계산할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
[[파일:2025KOI장애물2.png|center|class=coders100]]위에서 계산한 방식에 따라&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[0 → 1(+1)] + 장애물 뛰어넘기(+1) + [3 → 4(+1)] + 장애물 뛰어넘기(+1) + [6 → 10(+2)] + 장애물 뛰어넘기(+1) = 7&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
이 정답이 되는 것을 확인할 수 있습니다. 장애물을 넘지 못하는 조건은 동일합니다.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;💻 코드 구현&#039;&#039;&#039; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n = int(input())&lt;br /&gt;
obs = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
s = 0 # 현재 위치&lt;br /&gt;
ans = 0&lt;br /&gt;
&lt;br /&gt;
for i in obs:&lt;br /&gt;
    # 장애물이 연속으로 붙은 경우 예외 처리&lt;br /&gt;
    if i - 1 &amp;lt; s: &lt;br /&gt;
        print(-1)&lt;br /&gt;
        exit()&lt;br /&gt;
    &lt;br /&gt;
    d = (i - 1) - s # 내 위치부터 다음 장애물 앞 칸까지 남은 거리&lt;br /&gt;
    ans += d / 2 + d % 2 # 최소 이동 횟수 누적&lt;br /&gt;
    &lt;br /&gt;
    # 장애물 뛰어넘기&lt;br /&gt;
    ans += 1 &lt;br /&gt;
    s = i + 1&lt;br /&gt;
    &lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;이번 문제의 경우 장애물 사이의 거리가 25만 칸으로 첫 번째 접근, 두 번째 접근의 시간 차이가 미미한 수준입니다.&lt;br /&gt;
&lt;br /&gt;
하지만 &#039;&#039;&#039;장애물 사이의 거리가 10억 칸&#039;&#039;&#039;으로 늘어난다면 반복문으로 최대 2칸씩 이동하는 방법은 시간이 아주 오래 걸리게 됩니다.&lt;br /&gt;
&lt;br /&gt;
이런 경우 지금처럼 &#039;&#039;&#039;수학적인 접근&#039;&#039;&#039;으로 계산 횟수를 줄여주는 것이 필요합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📊 &#039;&#039;&#039;정답률&#039;&#039;&#039; ===&lt;br /&gt;
2025년도 2차 대회에 진출한 &#039;&#039;&#039;150명 가량의 초등부 학생들 중 130명&#039;&#039;&#039; 가량이 100점,&lt;br /&gt;
&lt;br /&gt;
이외에도 대부분의 학생들이 최소 부분점수는 획득한 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
1차 대회에서 동상을 타고 올라온 학생들인만큼 &#039;&#039;&#039;정답률이 아주 높은 모습&#039;&#039;&#039;입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/2139 2. 거울 (초2/중1)]&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;📄 문제 개요&#039;&#039;&#039; ===&lt;br /&gt;
수직선 위의 위치 s에서 출발하는 캐릭터가 있습니다. 그리고 수직선 위에는 N개의 거울이 놓여 있습니다.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;이동 규칙:&#039;&#039;&#039; 위치 a에 있는 캐릭터가 위치 b에 있는 거울을 사용하면, 거울을 기준으로 점대칭인 지점인 &#039;&#039;&#039;2b - a&#039;&#039;&#039; 위치로 이동하게 됩니다.&lt;br /&gt;
* &#039;&#039;&#039;조건:&#039;&#039;&#039; N개의 거울을 &#039;&#039;&#039;원하는 순서대로 정확히 한 번씩 모두 사용&#039;&#039;&#039;해야 합니다.&lt;br /&gt;
&lt;br /&gt;
이 조건하에서 캐릭터가 최종적으로 도착할 수 있는 위치의 &#039;&#039;&#039;최댓값&#039;&#039;&#039;을 구하는 문제입니다.&lt;br /&gt;
&lt;br /&gt;
[[파일:2025KOI거울1.png|center|class=coders100]]&#039;&#039;&#039;문제에 적힌 내용을 조금 더 정확하게 이해해봅시다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
거울 사용시 위치를 문제에서 2b- a로 제시해주었고, 그림을 통해 확인해보면 다음과 같습니다.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;시작 위치 0에서 1번 거울 사용: -2&#039;&#039;&#039; 위치로 이동 (2b-a  = 2 x (-1) - 0 = -2)​&lt;br /&gt;
* &#039;&#039;&#039;-1 위치에서 2번 거울 사용: 6 위치&#039;&#039;&#039;로 이동 (2b-a = 2 x 2 - (-2) = 6)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위와 동일한 방식으로 2번 거울을 먼저 사용하고 1번 거울을 사용하면 캐릭터 최종 위치는 -6이 됩니다.&lt;br /&gt;
&lt;br /&gt;
따라서 캐릭터 위치의 최대값은 1번 거울을 먼저 사용했을 때의 6이 됩니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;💡 첫 번째 접근 - 모든 순서를 다 해보기?&#039;&#039;&#039; ===&lt;br /&gt;
가장 쉽게 떠오르는 방법은 어떤 거울을 먼저 쓸지 &#039;&#039;&#039;모든 순서를 다 바꿔가며 계산&#039;&#039;&#039;해 보는 것입니다.&lt;br /&gt;
&lt;br /&gt;
이렇게 가능한 모든 경우의 수를 빠짐없이 전부 탐색하는 방식을 컴퓨터 공학 용어로 &#039;&#039;&#039;브루트포스(Brute-force, 완전 탐색)&#039;&#039;&#039;라고 부릅니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
첫 번째 예제처럼 거울이 2개일 때는 &#039;&#039;&#039;(1번 거울 → 2번 거울), (2번 거울 → 1번 거울)&#039;&#039;&#039; 두 가지 경우만 계산해서 더 큰 값을 고르면 됩니다.&lt;br /&gt;
&lt;br /&gt;
하지만 이 문제의 제약 조건을 살펴보면 거울의 수 N은 최대 &#039;&#039;&#039;200,000개&#039;&#039;&#039;입니다.&lt;br /&gt;
&lt;br /&gt;
20만 개의 거울을 나열하는 경우의 수는 200,000!으로 슈퍼컴퓨터로도 제한 시간(1초) 내에 절대 계산할 수 없는 엄청난 숫자입니다.&lt;br /&gt;
&lt;br /&gt;
따라서 이러한 접근 방식으로 코드를 작성했다면 &#039;&#039;&#039;시간초과&#039;&#039;&#039;로 인해 &#039;&#039;&#039;부분문제 1.  N은 2 이하&#039;&#039;&#039; 에 해당하는 7점만 획득할 수 있습니다.&lt;br /&gt;
=== 💻 &#039;&#039;&#039;코드 구현&#039;&#039;&#039; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n, s = map(int, input().split())&lt;br /&gt;
arr = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
if n == 1:&lt;br /&gt;
    print(2 * arr[0] - s)&lt;br /&gt;
elif n == 2:&lt;br /&gt;
    # 경우 1: 1번 거울 -&amp;gt; 2번 거울 순서&lt;br /&gt;
    pos1 = 2 * arr[1] - (2 * arr[0] - s)&lt;br /&gt;
    &lt;br /&gt;
    # 경우 2: 2번 거울 -&amp;gt; 1번 거울 순서&lt;br /&gt;
    pos2 = 2 * arr[0] - (2 * arr[1] - s)&lt;br /&gt;
    &lt;br /&gt;
    # 둘 중 더 큰 값을 출력&lt;br /&gt;
    print(max(pos1, pos2))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;실전에서는 긴장감과 시간 압박 때문에, 평소에는 금방 찾아내던 수학적 규칙도 머릿속이 하얗게 변해 안 떠오를 때가 많습니다.&lt;br /&gt;
&lt;br /&gt;
1년에 한 번 뿐인 대회, 그냥 포기하는 것보다는 내가 풀 수 있는 부분문제를 끈기있게 찾아내어 7점을 더 얻어내는 집념을 가져보세요.&lt;br /&gt;
&lt;br /&gt;
[[파일:2025KOI거울3.png|center|class=coders100|3점 차이로 내가 받을 상이 달라질 수 있다]]&lt;br /&gt;
&lt;br /&gt;
이렇게 단 몇 점 차이로 내가 받는 상이 달라질 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
정보올림피아드는 100점을 맞아야만 상을 받는 대회가 아닙니다.&lt;br /&gt;
&lt;br /&gt;
이런 집념을 가지고 임하는 학생에게 다음 대회에서 더 좋은 아이디어가 피어날 것이라 믿습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;💡 두 번째 접근 - 수학적 규칙 찾기&#039;&#039;&#039; ===&lt;br /&gt;
컴퓨터가 모든 경우를 계산할 수 없다면, 우리가 직접 종이 위에서 수식의 패턴을 찾아내야 합니다.&lt;br /&gt;
&lt;br /&gt;
거울을 차례대로 사용했을 때 위치가 어떻게 변하는지 수식으로 써보면 다음과 같습니다.&lt;br /&gt;
&lt;br /&gt;
[[파일:2025KOI거울2.png|center|class=coders100]]수식을 유심히 살펴보면 아주 중요한 규칙들을 발견할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
# 초기 위치 s는 거울의 개수가 짝수면 더해지고&#039;&#039;&#039;(+s)&#039;&#039;&#039;, 홀수면 빼집니다&#039;&#039;&#039;(-s)&#039;&#039;&#039;.&lt;br /&gt;
# 선택한 거울의 위치(m)에는 항상 &#039;&#039;&#039;+2&#039;&#039;&#039; 또는 &#039;&#039;&#039;-2&#039;&#039;&#039;가 곱해집니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
우리의 목표는 &#039;&#039;&#039;최종 위치의 값을 최대&#039;&#039;&#039;로 만드는 것입니다.&lt;br /&gt;
&lt;br /&gt;
그렇다면 어떤 거울에 &#039;&#039;&#039;+2&#039;&#039;&#039;를 곱하고, 어떤 거울에 &#039;&#039;&#039;-2&#039;&#039;&#039;를 곱해야 결과가 가장 커질까요?&lt;br /&gt;
&lt;br /&gt;
당연히 &#039;&#039;&#039;위치가 큰 거울들을 골라 더해주고, 위치가 작은 거울들을 골라 빼주면&#039;&#039;&#039; 됩니다.&lt;br /&gt;
&lt;br /&gt;
문제에서 거울의 위치는 이미 오름차순으로 정렬되어 주어지기 때문에 &#039;&#039;&#039;중간을 기준&#039;&#039;&#039;으로 &#039;&#039;&#039;왼쪽, 오른쪽의 합&#039;&#039;&#039;을 계산하면 됩니다.&lt;br /&gt;
&lt;br /&gt;
단, 홀수 위치일 때 보면 더해지는 쪽이 하나 더 많기 때문에 &#039;&#039;&#039;중간 위치는 오른쪽 합에 포함&#039;&#039;&#039;됩니다.&lt;br /&gt;
=== 💻 &#039;&#039;&#039;코드 구현&#039;&#039;&#039; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n, s = map(int, input().split())&lt;br /&gt;
m = list(map(int, input().split())) # 거울&lt;br /&gt;
half = n // 2 # 거울 개수의 반&lt;br /&gt;
&lt;br /&gt;
# 중간 위치는 큰 쪽에 포함&lt;br /&gt;
small = sum(m[:half]) # 작은 값들의 합&lt;br /&gt;
large = sum(m[half:]) # 큰 값들의 합&lt;br /&gt;
&lt;br /&gt;
if n % 2 == 0: # 거울 개수가 짝수일 때는 +s&lt;br /&gt;
    print(2 * large - 2 * small + s)&lt;br /&gt;
else: # 거울 개수가 홀수일 때는 -s&lt;br /&gt;
    print(2 * large - 2 * small - s)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
반복이 아니라 단순 연산으로 계산하기 때문에 거울의 개수가 20만 개라도 시간 내에 처리가 가능(100점)합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📊 &#039;&#039;&#039;정답률&#039;&#039;&#039; ===&lt;br /&gt;
초등부에서는 약 30% 가량의 학생들이 100점을 받았고, 대부분의 학생들이 7점 풀이는 해낸 모습입니다.&lt;br /&gt;
&lt;br /&gt;
중등부에서는 절반 이상이 100점, 90% 넘는 학생이 7점 이상을 획득했습니다. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;3. 통행료 (초3)&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;4. 상자 보관 (초4)&#039;&#039;&#039; ==&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2025_%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)_1%EC%B0%A8_%EB%8C%80%ED%9A%8C_2%EA%B5%90%EC%8B%9C_%EC%A4%91%EB%93%B1%EB%B6%80&amp;diff=2899</id>
		<title>2025 한국정보올림피아드(KOI) 1차 대회 2교시 중등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2025_%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)_1%EC%B0%A8_%EB%8C%80%ED%9A%8C_2%EA%B5%90%EC%8B%9C_%EC%A4%91%EB%93%B1%EB%B6%80&amp;diff=2899"/>
		<updated>2026-04-29T09:54:30Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2025 KOI, 2025 중등부 1차 대회 2교시, 직각이등변삼각형,  부산 관광, 건초 더미, 정올 직각이등변삼각형, 정올 부산 관광, 정올 건초 더미|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://assets.koi.or.kr/koi/2025/1/problems/2/triangle.pdf 1. 직각이등변삼각형 (초2/중1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;📄 문제 개요&#039;&#039;&#039; ===&lt;br /&gt;
N개의 점이 주어졌을 때,&lt;br /&gt;
&lt;br /&gt;
① N개의 점 모두 직각이등변삼각형의 경계나 내부에 위치(꼭짓점 포함)&lt;br /&gt;
&lt;br /&gt;
② 빗변은 x축과 평행 (빗 변의 두 끝점 y좌표가 같다.)&lt;br /&gt;
&lt;br /&gt;
그 중 &#039;&#039;&#039;빗변의 길이가 가장 짧은 경우의 길이&#039;&#039;&#039;를 구하는 문제입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;💡 문제 풀이 개념과 시뮬레이션&#039;&#039;&#039; ===&lt;br /&gt;
[[파일:직각이등변삼각형.png|641x641픽셀]]&lt;br /&gt;
&lt;br /&gt;
직각이등변삼각형은 두 변의 길이가 같고, 그 두 변 사이 각이 직각입니다.&lt;br /&gt;
&lt;br /&gt;
또한 직각이기 때문에 높이(위 그림에서 빨간색)를 그어보면 밑변의 중심에 도착해 밑변의 절반과 길이가 같다는 것도 확인할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[파일:2025KOI직각이등변삼각형 1.png|570x570픽셀]]&lt;br /&gt;
&lt;br /&gt;
문제에 주어진 것처럼 N개의 점이 좌표평면에 있을 때, 우리가 고려해봐야할 경우는&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;① 아래쪽이 빗변&#039;&#039;&#039;, &#039;&#039;&#039;② 위쪽이 빗변&#039;&#039;&#039; (문제 조건에서 빗변은 x축과 평행) 2가지입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
그러면 먼저 &#039;&#039;&#039;아래쪽이 빗변인 경우&#039;&#039;&#039;를 보겠습니다.&lt;br /&gt;
&lt;br /&gt;
① 아래쪽이 빗변이기 때문에, &#039;&#039;&#039;y축이 가장 작은 점들&#039;&#039;&#039;을 찾아 그 점을 기준으로 가로선을 길게 그어주었습니다.&lt;br /&gt;
&lt;br /&gt;
② 남은 것은 위에 있는 점들인데, 그림에서 &#039;&#039;&#039;밑 변(빗변)과 얼마나 떨어져있는지 높이&#039;&#039;&#039;에 주목해주세요.&lt;br /&gt;
&lt;br /&gt;
[[파일:2025KOI직각이등변삼각형 2.png|735x735픽셀]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
직각이등변삼각형이기 때문에 밑 변의 양 끝 점에서 45도 각도를 이루면서 나머지 두 변을 그리게 되고&lt;br /&gt;
&lt;br /&gt;
가로로 왼쪽, 오른쪽이 정확히 한 칸씩 좁혀지게 됩니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
따라서 어떤 점이 밑 변과 거리 n만큼 떨어져있다면, 최소 그 점 x좌표의 +n, -n만큼의 여유 공간이&lt;br /&gt;
&lt;br /&gt;
밑변에 있어야 한 칸씩 좁혀들어와도 점이 경계나 내부에 존재할 수 있다는 사실을 알 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 &#039;&#039;&#039;남은 세 점&#039;&#039;&#039;을 모두 살펴보겠습니다.&lt;br /&gt;
&lt;br /&gt;
​&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;* 밑 변의 y좌표 : -1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
ⓐ (-1, 2)&lt;br /&gt;
&lt;br /&gt;
밑 변과 떨어진 거리가 3입니다.&lt;br /&gt;
&lt;br /&gt;
밑 변 왼쪽 끝 점 x좌표가 -1 - 3 = -4 또는 더 왼쪽,&lt;br /&gt;
&lt;br /&gt;
밑 변 오른쪽 끝 점 x좌표가  -1 + 3 = 2 또는 더 오른쪽이라면 이 점은 삼각형 경계 또는 내부에 존재합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ⓑ (2, 4)&lt;br /&gt;
&lt;br /&gt;
밑 변과 떨어진 거리가 5입니다.&lt;br /&gt;
&lt;br /&gt;
밑 변 왼쪽 끝 점 x좌표가 2 - 5 = -3 또는 더 왼쪽,&lt;br /&gt;
&lt;br /&gt;
밑 변 오른쪽 끝 점 x좌표가  2 + 5 = 7 또는 더 오른쪽이라면 이 점은 삼각형 경계 또는 내부에 존재합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ⓒ (3, 1)&lt;br /&gt;
&lt;br /&gt;
밑 변과 떨어진 거리가 2입니다.&lt;br /&gt;
&lt;br /&gt;
밑 변 왼쪽 끝 점 x좌표가 3 - 2 = 1 또는 더 왼쪽,&lt;br /&gt;
&lt;br /&gt;
밑 변 오른쪽 끝 점 x좌표가  3 + 2 = 5 또는 더 오른쪽이라면 이 점은 삼각형 경계 또는 내부에 존재합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
세 점을 모두 확인했을 때 빗변이 가장 짧으면서 삼각형이 모든 점을 포함하려면&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;왼쪽 끝 점 x좌표는 ⓐ 케이스의 -4&#039;&#039;&#039;, 가장 &#039;&#039;&#039;오른쪽 끝 점 x좌표는 ⓑ 케이스의 7&#039;&#039;&#039;이 되는 것을 확인했습니다. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
따라서 이 경우 &#039;&#039;&#039;빗변의 최소 길이는 7 - (-4) = 11&#039;&#039;&#039;이 됩니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
같은 방법으로 &#039;&#039;&#039;위쪽이 빗변인 경우&#039;&#039;&#039;를 보겠습니다.&lt;br /&gt;
&lt;br /&gt;
위쪽이 빗변이기 때문에 주어진 점들 중 &#039;&#039;&#039;가장 y좌표가 큰 점&#039;&#039;&#039;을 찾아 가로선을 길게 그어주었습니다.&lt;br /&gt;
&lt;br /&gt;
[[파일:2025KOI직각이등변삼각형 3.png|735x735픽셀]]​&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;* 윗 변의 y좌표 : 4&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
ⓐ (-1, 2)&lt;br /&gt;
&lt;br /&gt;
윗 변과 떨어진 거리가 2입니다.&lt;br /&gt;
&lt;br /&gt;
윗 변 왼쪽 끝 점 x좌표가 -1 - 2 = -3 또는 더 왼쪽,&lt;br /&gt;
&lt;br /&gt;
윗 변 오른쪽 끝 점 x좌표가  -1 + 2 = 1 또는 더 오른쪽이라면 이 점은 삼각형 경계 또는 내부에 존재합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ⓑ (3, 1)&lt;br /&gt;
&lt;br /&gt;
윗 변과 떨어진 거리가 3입니다.&lt;br /&gt;
&lt;br /&gt;
윗 변 왼쪽 끝 점 x좌표가 3 - 3 = 0 또는 더 왼쪽,&lt;br /&gt;
&lt;br /&gt;
윗 변 오른쪽 끝 점 x좌표가  3 + 3 = 6 또는 더 오른쪽이라면 이 점은 삼각형 경계 또는 내부에 존재합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ⓒ (0, -1)&lt;br /&gt;
&lt;br /&gt;
윗 변과 떨어진 거리가 5입니다.&lt;br /&gt;
&lt;br /&gt;
윗 변 왼쪽 끝 점 x좌표가 0 - 5 = -5 또는 더 왼쪽,&lt;br /&gt;
&lt;br /&gt;
윗 변 오른쪽 끝 점 x좌표가  0 + 5 = 5 또는 더 오른쪽이라면 이 점은 삼각형 경계 또는 내부에 존재합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ⓓ (4, -1)&lt;br /&gt;
&lt;br /&gt;
윗 변과 떨어진 거리가 5입니다.&lt;br /&gt;
&lt;br /&gt;
윗 변 왼쪽 끝 점 x좌표가 4 - 5 = -1 또는 더 왼쪽,&lt;br /&gt;
&lt;br /&gt;
윗 변 오른쪽 끝 점 x좌표가  4 + 5 = 9 또는 더 오른쪽이라면 이 점은 삼각형 경계 또는 내부에 존재합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
네 점을 모두 확인했을 때 빗변이 가장 짧으면서 삼각형이 모든 점을 포함하려면&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;왼쪽 끝 점 x좌표는&#039;&#039;&#039; &#039;&#039;&#039;ⓒ 케이스의 -5&#039;&#039;&#039;, 가장 &#039;&#039;&#039;오른쪽 끝 점 x좌표는&#039;&#039;&#039; &#039;&#039;&#039;ⓓ 케이스의 9&#039;&#039;&#039;가 되는 것을 확인했습니다. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
따라서 이 경우 &#039;&#039;&#039;빗변의 최소 길이는 9 - (-5) = 14&#039;&#039;&#039;가 됩니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
아래쪽이 빗변일 때 최소 길이는 11, 위쪽이 빗변일 때 최소 길이는 14이기 때문에 둘 중 더 짧은 &#039;&#039;&#039;&amp;lt;u&amp;gt;11&amp;lt;/u&amp;gt;&#039;&#039;&#039;이 정답이 됩니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💻 &#039;&#039;&#039;코드 구현&#039;&#039;&#039; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n = int(input())&lt;br /&gt;
arr = []&lt;br /&gt;
for i in range(n):&lt;br /&gt;
    arr.append(tuple(map(int, input().split())))&lt;br /&gt;
&lt;br /&gt;
max_y = float(&#039;-inf&#039;)&lt;br /&gt;
min_y = float(&#039;inf&#039;)&lt;br /&gt;
&lt;br /&gt;
for i in arr: # 밑 변, 윗 변 y좌표 찾기&lt;br /&gt;
    y = i[1]&lt;br /&gt;
    min_y = min(min_y, y)&lt;br /&gt;
    max_y = max(max_y, y)&lt;br /&gt;
&lt;br /&gt;
# 아래쪽이 빗변&lt;br /&gt;
left = float(&#039;inf&#039;)&lt;br /&gt;
right = float(&#039;-inf&#039;)&lt;br /&gt;
&lt;br /&gt;
for i in arr: # 모든 점을 돌면서 왼쪽 끝, 오른쪽 끝 찾기&lt;br /&gt;
    x = i[0]&lt;br /&gt;
    y = i[1]&lt;br /&gt;
    left = min(left, x - (y - min_y))&lt;br /&gt;
    right = max(right, x + (y - min_y))&lt;br /&gt;
&lt;br /&gt;
result = right - left # 빗변 길이(오른쪽 x좌표 - 왼쪽 x좌표)&lt;br /&gt;
&lt;br /&gt;
# 위쪽이 빗변&lt;br /&gt;
left = float(&#039;inf&#039;)&lt;br /&gt;
right = float(&#039;-inf&#039;)&lt;br /&gt;
&lt;br /&gt;
for i in arr: # 모든 점을 돌면서 왼쪽 끝, 오른쪽 끝 찾기&lt;br /&gt;
    x = i[0]&lt;br /&gt;
    y = i[1]&lt;br /&gt;
    left = min(left, x - (max_y - y))&lt;br /&gt;
    right = max(right, x + (max_y - y))&lt;br /&gt;
&lt;br /&gt;
# 두 경우 빗변 길이 중 짧은 쪽을 선택&lt;br /&gt;
result = min(result, right - left)&lt;br /&gt;
&lt;br /&gt;
print(result)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;🧾 코드 설명&#039;&#039;&#039; ===&lt;br /&gt;
&lt;br /&gt;
* min_y : 아래쪽 빗변의 y좌표(모든 점들 중 가장 작은 y좌표)&lt;br /&gt;
* max_y : 위쪽 빗변의 y좌표(모든 점들 중 가장 큰 y좌표)&lt;br /&gt;
* &#039;&#039;&#039;아래쪽 빗변 계산&#039;&#039;&#039; : x좌표에 (y - min_y)만큼 좌우를 확장했을 때 가장 왼쪽과 오른쪽 찾기&lt;br /&gt;
* &#039;&#039;&#039;위쪽 빗변 계산&#039;&#039;&#039; : x좌표에 (max_y - y)만큼 좌우를 확장했을 때 가장 왼쪽과 오른쪽 찾기&lt;br /&gt;
* 두 결과 중 더 짧은 값을 선택하여 출력&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📊 &#039;&#039;&#039;정답률&#039;&#039;&#039; ===&lt;br /&gt;
[[파일:2025KOI직각이등변삼각형 4.png|400x400픽셀]][[파일:2025KOI직각이등변삼각형 5.png|405x405픽셀]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/2136 2. 부산 관광 (중2/고1)]&#039;&#039;&#039; ==&lt;br /&gt;
추가 예정&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;3. 건초 더미 (중3)&#039;&#039;&#039; ==&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2025_%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)_1%EC%B0%A8_%EB%8C%80%ED%9A%8C_2%EA%B5%90%EC%8B%9C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2898</id>
		<title>2025 한국정보올림피아드(KOI) 1차 대회 2교시 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2025_%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)_1%EC%B0%A8_%EB%8C%80%ED%9A%8C_2%EA%B5%90%EC%8B%9C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2898"/>
		<updated>2026-04-29T09:53:50Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2025 KOI, 2025 초등부 1차 대회 2교시, 먼카드, 직각이등변삼각형, 허수아비, 정올 먼카드, 정올 직각이등변삼각형, 정올 허수아비|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/2133 1. 먼 카드 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;📄 문제 개요&#039;&#039;&#039; ===&lt;br /&gt;
1부터 N까지의 숫자가 각각 두 번씩 적힌 2N장의 카드가 일렬로 주어졌을 때,&lt;br /&gt;
&lt;br /&gt;
① 같은 숫자가 적힌 두 카드를 한 쌍으로 짝지어&lt;br /&gt;
&lt;br /&gt;
② 두 카드 사이에 놓인 다른 카드의 개수를 계산하고&lt;br /&gt;
&lt;br /&gt;
그 중 &#039;&#039;&#039;두 카드 사이에 있는 카드 개수의 최댓값&#039;&#039;&#039;을 구하는 문제입니다.&lt;br /&gt;
&lt;br /&gt;
[[파일:2025KOI먼카드1.png|center|class=coders70]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;문제에 적힌 내용을 조금 더 정확하게 이해해봅시다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* 1이 적힌 두 카드 사이에는 차례로 2, 2, 4, 3이 적힌 카드가 있으므로, &amp;quot;1 사이 카드 수&amp;quot;는 4이다. &lt;br /&gt;
* 2가 적힌 두 카드 사이에는 아무 카드도 없으므로, &amp;quot;2 사이 카드 수&amp;quot;는 0이다. &lt;br /&gt;
* 3이 적힌 두 카드 사이에는 1이 적힌 카드만 있으므로, &amp;quot;3 사이 카드 수&amp;quot;는 1이다. &lt;br /&gt;
* 4가 적힌 두 카드 사이에는 차례로 3, 1, 3이 적힌 카드가 있으므로, &amp;quot;4 사이 카드 수&amp;quot;는 3이다. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위 그림을 보면 1과 1 사이 카드가 4장있는 경우가 가장 카드가 많은 경우이므로 정답은 4가 됩니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;💡 첫 번째 접근 - 하나씩 모두 비교하기&#039;&#039;&#039; ===&lt;br /&gt;
가장 쉽게 먼저 떠오르는 방법은 카드를 하나 잡고 뒤에 있는 카드들을 일일이 뒤집어보며 똑같은 숫자를 찾는 것입니다.&lt;br /&gt;
&lt;br /&gt;
[[파일:2025KOI먼카드2.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
그림을 보면 처음 숫자 1의 &#039;&#039;&#039;위치(인덱스)는 0&#039;&#039;&#039;, 이후 뒤를 찾아보면 &#039;&#039;&#039;5번 위치(인덱스)&#039;&#039;&#039;에 1이 한 번 더 있는 것을 확인할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
뒤에 숫자 위치(5)에서 처음 숫자 위치(0)을 빼고, 양 끝 숫자가 모두 포함이 안 되기 때문에 1을 한 번 더 빼면 카드의 개수가 나옵니다.&lt;br /&gt;
&lt;br /&gt;
위와 같은 방법으로 코드를 짜보면 다음과 같습니다.&lt;br /&gt;
&lt;br /&gt;
=== 💻 &#039;&#039;&#039;코드 구현 - 하나씩 모두 비교하기&#039;&#039;&#039; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n = int(input())&lt;br /&gt;
arr = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
ans = 0&lt;br /&gt;
for i in range(2*n): # 카드 전체 돌아보기&lt;br /&gt;
    for j in range(i+1, 2*n): # 현재 위치보다 뒤를 확인&lt;br /&gt;
        if arr[i] == arr[j]: # 같은 숫자를 찾은 경우&lt;br /&gt;
            ans = max(ans, j-i-1) # 숫자 사이 카드 개수의 최대값 계산&lt;br /&gt;
            break&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;이번 문제는 1번 문제인 만큼 N의 최대 크기가 작기 때문에&#039;&#039;&#039;(1 &amp;lt;= N &amp;lt;= 2000)&#039;&#039;&#039; 이렇게 중첩반복의 형태로 풀어도 100점을 받을 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
하지만 여기에서 N의 범위가 조금만 넓어지게 되면 지금처럼 &#039;&#039;&#039;시간복잡도 O(N^2)&#039;&#039;&#039;의 방법으로는 &#039;&#039;&#039;시간초과&#039;&#039;&#039;가 나올 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
따라서 정보올림피아드에 도전하는 학생들이라면 조금 더 좋은 방법을 생각해볼 필요가 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;💡 두 번째 접근 - 카드 번호 처음 등장 위치 메모해두기&#039;&#039;&#039; ===&lt;br /&gt;
이번에는 카드를 왔다갔다 여러 번 뒤집지 않고, 카드 번호마다 처음 등장한 위치를 메모해두는 방법입니다.&lt;br /&gt;
&lt;br /&gt;
[[파일:2025KOI먼카드3.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
해당 카드 숫자를 처음 찾았을 때 &#039;&#039;&#039;위치를 메모&#039;&#039;&#039;해두고, 이후에 그 숫자를 다시 찾았을 때는&lt;br /&gt;
&lt;br /&gt;
메모를 보고 숫자 사이에 카드가 몇 개 있었는지 바로 확인할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;숫자 사이의 카드 개수 = 다시 찾았을 때 위치 - 메모에 기록된 처음 위치 - 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 💻 &#039;&#039;&#039;코드 구현 - 카드 번호 처음 등장 위치 메모해두기&#039;&#039;&#039; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n = int(input())&lt;br /&gt;
&lt;br /&gt;
arr = list(map(int, input().split()))&lt;br /&gt;
memo = [-1] * (n+1) # 카드 번호 처음 위치 메모&lt;br /&gt;
ans = 0&lt;br /&gt;
&lt;br /&gt;
for i in range(2*n):&lt;br /&gt;
    if memo[arr[i]] == -1: # -1: 처음 찾은 숫자&lt;br /&gt;
        memo[arr[i]] = i # 처음 찾은 숫자의 위치 메모&lt;br /&gt;
    else: # 이미 찾았던 숫자&lt;br /&gt;
        ans = max(ans, i - memo[arr[i]] - 1) # 두 위치 사이 카드 개수의 최대값 계산&lt;br /&gt;
        &lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;카드 개수는 N개이지만 메모 칸 수를 N+1로 설정했습니다.&lt;br /&gt;
&lt;br /&gt;
원래는 없는 가상의 0번 카드 자리를 만들어 실제 숫자와 인덱스를 똑같이 맞춰주었습니다.&lt;br /&gt;
&lt;br /&gt;
이 방법으로 문제를 풀게 되면 &#039;&#039;&#039;시간 복잡도는 O(N)&#039;&#039;&#039;으로 카드 리스트를 한 바퀴만 돌아도 답을 바로 구해낼 수 있게 됩니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
실제로 두 방법으로 코드를 제출해보면 어마어마한 시간 차이를 확인할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
[[파일:2025KOI먼카드4.png|center|class=coders70]]&lt;br /&gt;
&lt;br /&gt;
아래 : 첫 번째 접근 방식 / 위 : 두 번째 접근 방식&lt;br /&gt;
&lt;br /&gt;
=== 📊 &#039;&#039;&#039;정답률&#039;&#039;&#039; ===&lt;br /&gt;
[[파일:2025KOI먼카드5.png|center|class=coders70]]&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/2134 2. 직각이등변삼각형 (초2/중1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;📄 문제 개요&#039;&#039;&#039; ===&lt;br /&gt;
N개의 점이 주어졌을 때,&lt;br /&gt;
&lt;br /&gt;
① N개의 점 모두 직각이등변삼각형의 경계나 내부에 위치(꼭짓점 포함)&lt;br /&gt;
&lt;br /&gt;
② 빗변은 x축과 평행 (빗 변의 두 끝점 y좌표가 같다.)&lt;br /&gt;
&lt;br /&gt;
그 중 &#039;&#039;&#039;빗변의 길이가 가장 짧은 경우의 길이&#039;&#039;&#039;를 구하는 문제입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;💡 문제 풀이 개념과 시뮬레이션&#039;&#039;&#039; ===&lt;br /&gt;
[[파일:직각이등변삼각형.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
직각이등변삼각형은 두 변의 길이가 같고, 그 두 변 사이 각이 직각입니다.&lt;br /&gt;
&lt;br /&gt;
또한 직각이기 때문에 높이(위 그림에서 빨간색)를 그어보면 밑변의 중심에 도착해 밑변의 절반과 길이가 같다는 것도 확인할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[파일:2025KOI직각이등변삼각형 1.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
문제에 주어진 것처럼 N개의 점이 좌표평면에 있을 때, 우리가 고려해봐야할 경우는&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;① 아래쪽이 빗변&#039;&#039;&#039;, &#039;&#039;&#039;② 위쪽이 빗변&#039;&#039;&#039; (문제 조건에서 빗변은 x축과 평행) 2가지입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
그러면 먼저 &#039;&#039;&#039;아래쪽이 빗변인 경우&#039;&#039;&#039;를 보겠습니다.&lt;br /&gt;
&lt;br /&gt;
① 아래쪽이 빗변이기 때문에, &#039;&#039;&#039;y축이 가장 작은 점들&#039;&#039;&#039;을 찾아 그 점을 기준으로 가로선을 길게 그어주었습니다.&lt;br /&gt;
&lt;br /&gt;
② 남은 것은 위에 있는 점들인데, 그림에서 &#039;&#039;&#039;밑 변(빗변)과 얼마나 떨어져있는지 높이&#039;&#039;&#039;에 주목해주세요.&lt;br /&gt;
&lt;br /&gt;
[[파일:2025KOI직각이등변삼각형 2.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
직각이등변삼각형이기 때문에 밑 변의 양 끝 점에서 45도 각도를 이루면서 나머지 두 변을 그리게 되고&lt;br /&gt;
&lt;br /&gt;
가로로 왼쪽, 오른쪽이 정확히 한 칸씩 좁혀지게 됩니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
따라서 어떤 점이 밑 변과 거리 n만큼 떨어져있다면, 최소 그 점 x좌표의 +n, -n만큼의 여유 공간이&lt;br /&gt;
&lt;br /&gt;
밑변에 있어야 한 칸씩 좁혀들어와도 점이 경계나 내부에 존재할 수 있다는 사실을 알 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 &#039;&#039;&#039;남은 세 점&#039;&#039;&#039;을 모두 살펴보겠습니다.&lt;br /&gt;
&lt;br /&gt;
​&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;* 밑 변의 y좌표 : -1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
ⓐ (-1, 2)&lt;br /&gt;
&lt;br /&gt;
밑 변과 떨어진 거리가 3입니다.&lt;br /&gt;
&lt;br /&gt;
밑 변 왼쪽 끝 점 x좌표가 -1 - 3 = -4 또는 더 왼쪽,&lt;br /&gt;
&lt;br /&gt;
밑 변 오른쪽 끝 점 x좌표가  -1 + 3 = 2 또는 더 오른쪽이라면 이 점은 삼각형 경계 또는 내부에 존재합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ⓑ (2, 4)&lt;br /&gt;
&lt;br /&gt;
밑 변과 떨어진 거리가 5입니다.&lt;br /&gt;
&lt;br /&gt;
밑 변 왼쪽 끝 점 x좌표가 2 - 5 = -3 또는 더 왼쪽,&lt;br /&gt;
&lt;br /&gt;
밑 변 오른쪽 끝 점 x좌표가  2 + 5 = 7 또는 더 오른쪽이라면 이 점은 삼각형 경계 또는 내부에 존재합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ⓒ (3, 1)&lt;br /&gt;
&lt;br /&gt;
밑 변과 떨어진 거리가 2입니다.&lt;br /&gt;
&lt;br /&gt;
밑 변 왼쪽 끝 점 x좌표가 3 - 2 = 1 또는 더 왼쪽,&lt;br /&gt;
&lt;br /&gt;
밑 변 오른쪽 끝 점 x좌표가  3 + 2 = 5 또는 더 오른쪽이라면 이 점은 삼각형 경계 또는 내부에 존재합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
세 점을 모두 확인했을 때 빗변이 가장 짧으면서 삼각형이 모든 점을 포함하려면&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;왼쪽 끝 점 x좌표는 ⓐ 케이스의 -4&#039;&#039;&#039;, 가장 &#039;&#039;&#039;오른쪽 끝 점 x좌표는 ⓑ 케이스의 7&#039;&#039;&#039;이 되는 것을 확인했습니다. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
따라서 이 경우 &#039;&#039;&#039;빗변의 최소 길이는 7 - (-4) = 11&#039;&#039;&#039;이 됩니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
같은 방법으로 &#039;&#039;&#039;위쪽이 빗변인 경우&#039;&#039;&#039;를 보겠습니다.&lt;br /&gt;
&lt;br /&gt;
위쪽이 빗변이기 때문에 주어진 점들 중 &#039;&#039;&#039;가장 y좌표가 큰 점&#039;&#039;&#039;을 찾아 가로선을 길게 그어주었습니다.&lt;br /&gt;
&lt;br /&gt;
[[파일:2025KOI직각이등변삼각형 3.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;* 윗 변의 y좌표 : 4&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
ⓐ (-1, 2)&lt;br /&gt;
&lt;br /&gt;
윗 변과 떨어진 거리가 2입니다.&lt;br /&gt;
&lt;br /&gt;
윗 변 왼쪽 끝 점 x좌표가 -1 - 2 = -3 또는 더 왼쪽,&lt;br /&gt;
&lt;br /&gt;
윗 변 오른쪽 끝 점 x좌표가  -1 + 2 = 1 또는 더 오른쪽이라면 이 점은 삼각형 경계 또는 내부에 존재합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ⓑ (3, 1)&lt;br /&gt;
&lt;br /&gt;
윗 변과 떨어진 거리가 3입니다.&lt;br /&gt;
&lt;br /&gt;
윗 변 왼쪽 끝 점 x좌표가 3 - 3 = 0 또는 더 왼쪽,&lt;br /&gt;
&lt;br /&gt;
윗 변 오른쪽 끝 점 x좌표가  3 + 3 = 6 또는 더 오른쪽이라면 이 점은 삼각형 경계 또는 내부에 존재합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ⓒ (0, -1)&lt;br /&gt;
&lt;br /&gt;
윗 변과 떨어진 거리가 5입니다.&lt;br /&gt;
&lt;br /&gt;
윗 변 왼쪽 끝 점 x좌표가 0 - 5 = -5 또는 더 왼쪽,&lt;br /&gt;
&lt;br /&gt;
윗 변 오른쪽 끝 점 x좌표가  0 + 5 = 5 또는 더 오른쪽이라면 이 점은 삼각형 경계 또는 내부에 존재합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ⓓ (4, -1)&lt;br /&gt;
&lt;br /&gt;
윗 변과 떨어진 거리가 5입니다.&lt;br /&gt;
&lt;br /&gt;
윗 변 왼쪽 끝 점 x좌표가 4 - 5 = -1 또는 더 왼쪽,&lt;br /&gt;
&lt;br /&gt;
윗 변 오른쪽 끝 점 x좌표가  4 + 5 = 9 또는 더 오른쪽이라면 이 점은 삼각형 경계 또는 내부에 존재합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
네 점을 모두 확인했을 때 빗변이 가장 짧으면서 삼각형이 모든 점을 포함하려면&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;왼쪽 끝 점 x좌표는&#039;&#039;&#039; &#039;&#039;&#039;ⓒ 케이스의 -5&#039;&#039;&#039;, 가장 &#039;&#039;&#039;오른쪽 끝 점 x좌표는&#039;&#039;&#039; &#039;&#039;&#039;ⓓ 케이스의 9&#039;&#039;&#039;가 되는 것을 확인했습니다. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
따라서 이 경우 &#039;&#039;&#039;빗변의 최소 길이는 9 - (-5) = 14&#039;&#039;&#039;가 됩니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
아래쪽이 빗변일 때 최소 길이는 11, 위쪽이 빗변일 때 최소 길이는 14이기 때문에 둘 중 더 짧은 &#039;&#039;&#039;&amp;lt;u&amp;gt;11&amp;lt;/u&amp;gt;&#039;&#039;&#039;이 정답이 됩니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💻 &#039;&#039;&#039;코드 구현&#039;&#039;&#039; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n = int(input())&lt;br /&gt;
arr = []&lt;br /&gt;
for i in range(n):&lt;br /&gt;
    arr.append(tuple(map(int, input().split())))&lt;br /&gt;
&lt;br /&gt;
max_y = float(&#039;-inf&#039;)&lt;br /&gt;
min_y = float(&#039;inf&#039;)&lt;br /&gt;
&lt;br /&gt;
for i in arr: # 밑 변, 윗 변 y좌표 찾기&lt;br /&gt;
    y = i[1]&lt;br /&gt;
    min_y = min(min_y, y)&lt;br /&gt;
    max_y = max(max_y, y)&lt;br /&gt;
&lt;br /&gt;
# 아래쪽이 빗변&lt;br /&gt;
left = float(&#039;inf&#039;)&lt;br /&gt;
right = float(&#039;-inf&#039;)&lt;br /&gt;
&lt;br /&gt;
for i in arr: # 모든 점을 돌면서 왼쪽 끝, 오른쪽 끝 찾기&lt;br /&gt;
    x = i[0]&lt;br /&gt;
    y = i[1]&lt;br /&gt;
    left = min(left, x - (y - min_y))&lt;br /&gt;
    right = max(right, x + (y - min_y))&lt;br /&gt;
&lt;br /&gt;
result = right - left # 빗변 길이(오른쪽 x좌표 - 왼쪽 x좌표)&lt;br /&gt;
&lt;br /&gt;
# 위쪽이 빗변&lt;br /&gt;
left = float(&#039;inf&#039;)&lt;br /&gt;
right = float(&#039;-inf&#039;)&lt;br /&gt;
&lt;br /&gt;
for i in arr: # 모든 점을 돌면서 왼쪽 끝, 오른쪽 끝 찾기&lt;br /&gt;
    x = i[0]&lt;br /&gt;
    y = i[1]&lt;br /&gt;
    left = min(left, x - (max_y - y))&lt;br /&gt;
    right = max(right, x + (max_y - y))&lt;br /&gt;
&lt;br /&gt;
# 두 경우 빗변 길이 중 짧은 쪽을 선택&lt;br /&gt;
result = min(result, right - left)&lt;br /&gt;
&lt;br /&gt;
print(result)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;🧾 코드 설명&#039;&#039;&#039; ===&lt;br /&gt;
&lt;br /&gt;
* min_y : 아래쪽 빗변의 y좌표(모든 점들 중 가장 작은 y좌표)&lt;br /&gt;
* max_y : 위쪽 빗변의 y좌표(모든 점들 중 가장 큰 y좌표)&lt;br /&gt;
* &#039;&#039;&#039;아래쪽 빗변 계산&#039;&#039;&#039; : x좌표에 (y - min_y)만큼 좌우를 확장했을 때 가장 왼쪽과 오른쪽 찾기&lt;br /&gt;
* &#039;&#039;&#039;위쪽 빗변 계산&#039;&#039;&#039; : x좌표에 (max_y - y)만큼 좌우를 확장했을 때 가장 왼쪽과 오른쪽 찾기&lt;br /&gt;
* 두 결과 중 더 짧은 값을 선택하여 출력&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📊 &#039;&#039;&#039;정답률&#039;&#039;&#039; ===&lt;br /&gt;
[[파일:2025KOI직각이등변삼각형 4.png|center|class=coders70]][[파일:2025KOI직각이등변삼각형 5.png|center|class=coders70]]&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;3. 허수아비 (초3)&#039;&#039;&#039; ==&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2022_%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)_1%EC%B0%A8_%EB%8C%80%ED%9A%8C_2%EA%B5%90%EC%8B%9C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2897</id>
		<title>2022 한국정보올림피아드(KOI) 1차 대회 2교시 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2022_%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)_1%EC%B0%A8_%EB%8C%80%ED%9A%8C_2%EA%B5%90%EC%8B%9C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2897"/>
		<updated>2026-04-28T11:47:13Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: /* 1. 빵 (초1) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2022 KOI, 2022 초등부 1차 대회 2교시|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1369 1. 빵 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
﻿﻿&lt;br /&gt;
&lt;br /&gt;
=== 📄 문제 개요 ===&lt;br /&gt;
KOI 마을에 N개의 빵집이 있습니다. 각 빵집에서 KOI 빵을 사려고 합니다.&lt;br /&gt;
&lt;br /&gt;
* 현재 위치에서 i번째 빵집까지 가는 데 걸리는 시간은 a입니다.&lt;br /&gt;
* i번째 빵집에 빵이 들어오는 시간은 b입니다.&lt;br /&gt;
* 빵집에 도착하는 시간이 빵이 들어오는 시간보다 늦으면(a &amp;gt; b), 빵이 다 팔려 살 수 없습니다.&lt;br /&gt;
* &#039;&#039;&#039;목표 :&#039;&#039;&#039; 빵을 살 수 있는 빵집 중, 가장 일찍 빵을 구할 수 있는 시간(최소 b)을 구해야 합니다. 모든 빵집에서 빵을 살 수 없다면 -1을 출력합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
이 문제는 시간이 흘러가는 것을 복잡하게 시뮬레이션할 필요 없이, 주어진 두 변수(a, b)의 대소 관계만 비교하면 되는 문제입니다.&lt;br /&gt;
&lt;br /&gt;
빵을 사기 위해 체크해야할 필수 조건은 &#039;&#039;&#039;내가 빵집에 도착하는 시간(a)이 빵이 나오는 시간(b)보다 작거나 같아야 한다&#039;&#039;&#039;는 것입니다.&lt;br /&gt;
&lt;br /&gt;
따라서 우리가 할 일은 다음과 같습니다.&lt;br /&gt;
&lt;br /&gt;
# 모든 빵집을 순서대로 확인하며, a &amp;lt;= b 조건을 만족하는지(빵을 살 수 있는지) 검사합니다.&lt;br /&gt;
# 조건을 만족하는 빵집들 중에서, 빵이 나오는 시간(b)이 가장 작은 값을 찾습니다.&lt;br /&gt;
# 만약 조건을 만족하는 빵집이 단 하나도 없다면 -1을 출력하도록 예외 처리를 해줍니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현&#039;&#039;&#039;﻿&#039;&#039;&#039; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n = int(input())&lt;br /&gt;
&lt;br /&gt;
# 시간(b)의 최댓값이 1000이므로, 절대 정답이 될 수 없는 1001을 초기값으로 설정&lt;br /&gt;
ans = 1001&lt;br /&gt;
&lt;br /&gt;
# N개의 빵집을 하나씩 확인&lt;br /&gt;
for i in range(n):&lt;br /&gt;
    a, b = map(int, input().split())&lt;br /&gt;
&lt;br /&gt;
    if a &amp;lt;= b: # 빵집에 도착하는 시간(a)이 빵이 나오는 시간(b)보다 작거나 같을 때만 구매 가능&lt;br /&gt;
        if b &amp;lt; ans: # 기존에 찾은 시간보다 더 빨리 나오는 곳을 발견했다면 갱신&lt;br /&gt;
            ans = b&lt;br /&gt;
&lt;br /&gt;
if ans == 1001: # ans가 여전히 1001이라면(살 수 있는 빵이 없었다) -1 출력&lt;br /&gt;
    print(-1)&lt;br /&gt;
else:&lt;br /&gt;
    print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿최소값을 구하는 상황에서 ans의 초기값을 무한대(&#039;&#039;&#039;float(&#039;inf&#039;)&#039;&#039;&#039;)로 잡아도 무방합니다.&lt;br /&gt;
&lt;br /&gt;
하지만 평소 연습할 때 문제 데이터 제한 크기를 확인하여 논리적인 상/하한선을 설정해주면 좋은 공부가 됩니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1464 2. 조약돌 (초2)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=%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)&amp;diff=2896</id>
		<title>한국정보올림피아드(KOI)</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=%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)&amp;diff=2896"/>
		<updated>2026-04-28T11:45:15Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: /* KOI 2022 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;KOI 2025&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
=== 1차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* 1교시(사고력 문제 및 비버챌린지 유형) : &#039;&#039;&#039;[[2025 한국정보올림피아드(KOI) 1차 대회 1교시 초등부|초등부]]&#039;&#039;&#039; / &#039;&#039;&#039;[[2025 한국정보올림피아드(KOI) 1교시 1차 대회 중등부|중등부]]&#039;&#039;&#039;&lt;br /&gt;
* 2교시(프로그래밍 실기) : &#039;&#039;&#039;[[2025 한국정보올림피아드(KOI) 1차 대회 2교시 초등부|초등부]]&#039;&#039;&#039; / &#039;&#039;&#039;[[2025 한국정보올림피아드(KOI) 1차 대회 2교시 중등부|중등부]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 2차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* [[2025 한국정보올림피아드(KOI) 2차 대회 초등부|&#039;&#039;&#039;초등부&#039;&#039;&#039;]]&lt;br /&gt;
* &#039;&#039;&#039;[[2025 한국정보올림피아드(KOI) 2차 대회 중등부|중등부]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;KOI 2024&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
=== 1차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* 1교시(사고력 문제 및 비버챌린지 유형) : &#039;&#039;&#039;초등부&#039;&#039;&#039; / &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;br /&gt;
* 2교시(프로그래밍 실기) : &#039;&#039;&#039;[[2024 한국정보올림피아드(KOI) 1차 대회 2교시 초등부|초등부]]&#039;&#039;&#039; / &#039;&#039;&#039;[[2024 한국정보올림피아드(KOI) 1차 대회 2교시 중등부|중등부]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 2차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[[2024 한국정보올림피아드(KOI) 2차 대회 초등부|초등부]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[[2024 한국정보올림피아드(KOI) 2차 대회 중등부|중등부]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;KOI 2023&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
=== 1차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* 1교시(사고력 문제 및 비버챌린지 유형) : &#039;&#039;&#039;초등부&#039;&#039;&#039; / &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;br /&gt;
* 2교시(프로그래밍 실기) : &#039;&#039;&#039;[[2023 한국정보올림피아드(KOI) 1차 대회 2교시 초등부|초등부]]&#039;&#039;&#039; / &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 2차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[[2023 한국정보올림피아드(KOI) 2차 대회 초등부|초등부]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[[2023 한국정보올림피아드(KOI) 2차 대회 중등부|중등부]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;KOI 2022&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
=== 1차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* 1교시(사고력 문제 및 비버챌린지 유형) : &#039;&#039;&#039;초등부&#039;&#039;&#039; / &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;br /&gt;
* 2교시(프로그래밍 실기) : &#039;&#039;&#039;[[2022 한국정보올림피아드(KOI) 1차 대회 2교시 초등부|초등부]]&#039;&#039;&#039; / &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 2차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;초등부&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;KOI 2021&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
=== 1차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* 1교시(사고력 문제 및 비버챌린지 유형) : &#039;&#039;&#039;초등부&#039;&#039;&#039; / &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;br /&gt;
* 2교시(프로그래밍 실기) : &#039;&#039;&#039;초등부&#039;&#039;&#039; / &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 2차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;초등부&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=%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)&amp;diff=2895</id>
		<title>한국정보올림피아드(KOI)</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=%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)&amp;diff=2895"/>
		<updated>2026-04-28T09:29:40Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;KOI 2025&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
=== 1차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* 1교시(사고력 문제 및 비버챌린지 유형) : &#039;&#039;&#039;[[2025 한국정보올림피아드(KOI) 1차 대회 1교시 초등부|초등부]]&#039;&#039;&#039; / &#039;&#039;&#039;[[2025 한국정보올림피아드(KOI) 1교시 1차 대회 중등부|중등부]]&#039;&#039;&#039;&lt;br /&gt;
* 2교시(프로그래밍 실기) : &#039;&#039;&#039;[[2025 한국정보올림피아드(KOI) 1차 대회 2교시 초등부|초등부]]&#039;&#039;&#039; / &#039;&#039;&#039;[[2025 한국정보올림피아드(KOI) 1차 대회 2교시 중등부|중등부]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 2차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* [[2025 한국정보올림피아드(KOI) 2차 대회 초등부|&#039;&#039;&#039;초등부&#039;&#039;&#039;]]&lt;br /&gt;
* &#039;&#039;&#039;[[2025 한국정보올림피아드(KOI) 2차 대회 중등부|중등부]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;KOI 2024&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
=== 1차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* 1교시(사고력 문제 및 비버챌린지 유형) : &#039;&#039;&#039;초등부&#039;&#039;&#039; / &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;br /&gt;
* 2교시(프로그래밍 실기) : &#039;&#039;&#039;[[2024 한국정보올림피아드(KOI) 1차 대회 2교시 초등부|초등부]]&#039;&#039;&#039; / &#039;&#039;&#039;[[2024 한국정보올림피아드(KOI) 1차 대회 2교시 중등부|중등부]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 2차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[[2024 한국정보올림피아드(KOI) 2차 대회 초등부|초등부]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[[2024 한국정보올림피아드(KOI) 2차 대회 중등부|중등부]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;KOI 2023&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
=== 1차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* 1교시(사고력 문제 및 비버챌린지 유형) : &#039;&#039;&#039;초등부&#039;&#039;&#039; / &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;br /&gt;
* 2교시(프로그래밍 실기) : &#039;&#039;&#039;[[2023 한국정보올림피아드(KOI) 1차 대회 2교시 초등부|초등부]]&#039;&#039;&#039; / &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 2차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[[2023 한국정보올림피아드(KOI) 2차 대회 초등부|초등부]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[[2023 한국정보올림피아드(KOI) 2차 대회 중등부|중등부]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;KOI 2022&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
=== 1차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* 1교시(사고력 문제 및 비버챌린지 유형) : &#039;&#039;&#039;초등부&#039;&#039;&#039; / &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;br /&gt;
* 2교시(프로그래밍 실기) : &#039;&#039;&#039;초등부&#039;&#039;&#039; / &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 2차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[[2022 한국정보올림피아드(KOI) 1차 대회 2교시 초등부|초등부]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;KOI 2021&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
=== 1차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* 1교시(사고력 문제 및 비버챌린지 유형) : &#039;&#039;&#039;초등부&#039;&#039;&#039; / &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;br /&gt;
* 2교시(프로그래밍 실기) : &#039;&#039;&#039;초등부&#039;&#039;&#039; / &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 2차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;초등부&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2022_%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)_1%EC%B0%A8_%EB%8C%80%ED%9A%8C_2%EA%B5%90%EC%8B%9C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2894</id>
		<title>2022 한국정보올림피아드(KOI) 1차 대회 2교시 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2022_%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)_1%EC%B0%A8_%EB%8C%80%ED%9A%8C_2%EA%B5%90%EC%8B%9C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2894"/>
		<updated>2026-04-28T09:29:15Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: 새 문서: {{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2022 KOI, 2022 초등부 1차 대회 2교시|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/ard...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2022 KOI, 2022 초등부 1차 대회 2교시|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1369 1. 빵 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1464 2. 조약돌 (초2)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=%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)&amp;diff=2893</id>
		<title>한국정보올림피아드(KOI)</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=%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)&amp;diff=2893"/>
		<updated>2026-04-28T09:16:39Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;KOI 2025&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
=== 1차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* 1교시(사고력 문제 및 비버챌린지 유형) : &#039;&#039;&#039;[[2025 한국정보올림피아드(KOI) 1차 대회 1교시 초등부|초등부]]&#039;&#039;&#039; / &#039;&#039;&#039;[[2025 한국정보올림피아드(KOI) 1교시 1차 대회 중등부|중등부]]&#039;&#039;&#039;&lt;br /&gt;
* 2교시(프로그래밍 실기) : &#039;&#039;&#039;[[2025 한국정보올림피아드(KOI) 1차 대회 2교시 초등부|초등부]]&#039;&#039;&#039; / &#039;&#039;&#039;[[2025 한국정보올림피아드(KOI) 1차 대회 2교시 중등부|중등부]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 2차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* [[2025 한국정보올림피아드(KOI) 2차 대회 초등부|&#039;&#039;&#039;초등부&#039;&#039;&#039;]]&lt;br /&gt;
* &#039;&#039;&#039;[[2025 한국정보올림피아드(KOI) 2차 대회 중등부|중등부]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;KOI 2024&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
=== 1차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* 1교시(사고력 문제 및 비버챌린지 유형) : &#039;&#039;&#039;초등부&#039;&#039;&#039; / &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;br /&gt;
* 2교시(프로그래밍 실기) : &#039;&#039;&#039;[[2024 한국정보올림피아드(KOI) 1차 대회 2교시 초등부|초등부]]&#039;&#039;&#039; / &#039;&#039;&#039;[[2024 한국정보올림피아드(KOI) 1차 대회 2교시 중등부|중등부]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 2차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[[2024 한국정보올림피아드(KOI) 2차 대회 초등부|초등부]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[[2024 한국정보올림피아드(KOI) 2차 대회 중등부|중등부]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;KOI 2023&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
=== 1차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* 1교시(사고력 문제 및 비버챌린지 유형) : &#039;&#039;&#039;초등부&#039;&#039;&#039; / &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;br /&gt;
* 2교시(프로그래밍 실기) : &#039;&#039;&#039;[[2023 한국정보올림피아드(KOI) 1차 대회 2교시 초등부|초등부]]&#039;&#039;&#039; / &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 2차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[[2023 한국정보올림피아드(KOI) 2차 대회 초등부|초등부]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[[2023 한국정보올림피아드(KOI) 2차 대회 중등부|중등부]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;KOI 2022&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
=== 1차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* 1교시(사고력 문제 및 비버챌린지 유형) : &#039;&#039;&#039;초등부&#039;&#039;&#039; / &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;br /&gt;
* 2교시(프로그래밍 실기) : &#039;&#039;&#039;초등부&#039;&#039;&#039; / &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 2차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;초등부&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;KOI 2021&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
=== 1차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* 1교시(사고력 문제 및 비버챌린지 유형) : &#039;&#039;&#039;초등부&#039;&#039;&#039; / &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;br /&gt;
* 2교시(프로그래밍 실기) : &#039;&#039;&#039;초등부&#039;&#039;&#039; / &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 2차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;초등부&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%A4%91%EB%93%B1%EB%B6%80&amp;diff=2892</id>
		<title>2023 한국정보올림피아드(KOI) 2차 대회 중등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%A4%91%EB%93%B1%EB%B6%80&amp;diff=2892"/>
		<updated>2026-04-28T09:16:13Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: 새 문서: {{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2023 KOI, 2023 중등부 2차 대회|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.pn...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2023 KOI, 2023 중등부 2차 대회|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1629 1. 스케이트 연습 (초2/중1/고1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== ﻿📄 문제 개요 ===&lt;br /&gt;
N개의 체크포인트(중간 지점)가 있는 스케이트 코스가 있습니다.&lt;br /&gt;
&lt;br /&gt;
* 출발점과 도착점에서의 속력은 반드시 0이어야 합니다.&lt;br /&gt;
* 각 체크포인트에는 넘어서는 안 되는 &#039;&#039;&#039;속력 제한(V)&#039;&#039;&#039;이 있습니다.&lt;br /&gt;
* 속력을 높일 때는 제한 없이 확 높일 수 있지만, &#039;&#039;&#039;속력을 낮출 때는 직전 지점의 속력에서 딱 1만큼만&#039;&#039;&#039; 낮출 수 있습니다.&lt;br /&gt;
* &#039;&#039;&#039;목표 :&#039;&#039;&#039; 조건을 지키며 코스를 완주할 때, 각 체크포인트에서 낼 수 있는 속력들의 &#039;&#039;&#039;총합의 최댓값&#039;&#039;&#039;을 구해야 합니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
보통 문제를 풀 때 배열의 처음부터 끝으로 순서대로 탐색하는 것이 일반적입니다.&lt;br /&gt;
&lt;br /&gt;
하지만 이 문제를 앞에서부터 탐색하게 되면 로직이 매우 복잡해집니다.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;속력을 낮출 때는 1씩만 낮출 수 있다&#039;&#039;&#039;는 조건 때문에, 현재 위치에서 속력을 마음 편히 올리려면 앞으로 남은 모든 코스의 속력 제한을 &#039;&#039;&#039;미리 내다보고 계산&#039;&#039;&#039;해야 하기 때문입니다. 이런 상황에서는 탐색의 방향을 완전히 뒤집어 &#039;&#039;&#039;도착점부터 역방향으로 탐색&#039;&#039;&#039;해보는 것이 아주 좋은 해결책이 됩니다.&lt;br /&gt;
&lt;br /&gt;
도착점부터 거꾸로  생각하면, &#039;&#039;&#039;원래의 속력을 최대 1만 낮출 수 있다&#039;&#039;&#039;는 조건은 반대로 &#039;&#039;&#039;속력을 최대 1만 높일 수 있다&#039;&#039;&#039;는 단순한 조건으로 바뀝니다.&lt;br /&gt;
&lt;br /&gt;
[[파일:2023KOI스케이트연습1.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
도착점의 속력은 무조건 0이기 때문에 도착 지점의 속력 0에서 시작합니다.&lt;br /&gt;
&lt;br /&gt;
각 지점에서의 최대 속력은 ① &#039;&#039;&#039;현재 지점의 속력 제한(V)&#039;&#039;&#039;과 &#039;&#039;&#039;② 다음 지점의 속력 + 1&#039;&#039;&#039; 중 더 작은 값으로 단순하게 결정됩니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
input = sys.stdin.readline&lt;br /&gt;
&lt;br /&gt;
n = int(input())&lt;br /&gt;
arr = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
speed = 0    # 현재 위치에서의 최대 속력 (도착점은 0이므로 0부터 시작)&lt;br /&gt;
ans = 0  # 낼 수 있는 속력들의 총합&lt;br /&gt;
&lt;br /&gt;
# 배열의 맨 끝(도착점 직전)부터 첫 번째 지점까지 거꾸로 탐색&lt;br /&gt;
for i in range(n - 1, -1, -1):&lt;br /&gt;
    if speed &amp;lt; arr[i]: # 1. 내 속력을 1 높여도 속력 제한(arr[i])보다 작다면? &lt;br /&gt;
        speed += 1  # 마음 편히 속력을 1 올림&lt;br /&gt;
        &lt;br /&gt;
    else: # 2. 내 속력을 1 높이면 속력 제한을 넘어가 버린다면?&lt;br /&gt;
        speed = arr[i]  # 해당 지점의 제한 속력에 맞춤&lt;br /&gt;
        &lt;br /&gt;
    ans += speed  # 결정된 속력을 정답에 누적&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿데이터의 개수 N이 최대 50만 개로 꽤 크지만, 이중 반복문 없이 배열을 거꾸로 한 번만 스캔&#039;&#039;&#039;(시간 복잡도 : O(N))&#039;&#039;&#039;하므로 2초의 시간 제한을 아주 여유롭게 통과합니다. &lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== 📊 정답률 ===&lt;br /&gt;
﻿100점을 받은 학생 비율이 초등부 50% 정도, 중등부 80% 이상, 고등부 90% 이상이었습니다.&lt;br /&gt;
&lt;br /&gt;
초등부 학생들도 2번 문제치고는 난이도가 평이한 수준, 중/고등부에서는 반드시 맞춰야할 쉬운 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
참고로 풀어볼 만한 문제 링크를 하나 추가했으니, 시간이 나면 풀어보세요.&lt;br /&gt;
&lt;br /&gt;
[https://codersit.co.kr/oj/problems/2087 &#039;&#039;&#039;COCI 6회 &amp;quot;미래를 보는 투자자&amp;quot; 문제 풀이하러가기&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1670 2. 호숫가의 개미굴 (초3/중2)]&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;3. 고기 파티 (초4/중3)&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;4. 지그재그 (중4/고2)&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2891</id>
		<title>2023 한국정보올림피아드(KOI) 2차 대회 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2891"/>
		<updated>2026-04-28T09:14:15Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: /* 📊 정답률 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2023 KOI, 2023 초등부 2차 대회|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1589 1. 불안정한 수열 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== ﻿📄 문제 개요 ===&lt;br /&gt;
N개의 자연수가 일렬로 주어집니다. 이 중에서 원하는 만큼 숫자를 골라 새로운 수열을 만들려고 합니다.&lt;br /&gt;
&lt;br /&gt;
새로 만든 수열은 &#039;&#039;&#039;이웃한 두 숫자의 합&#039;&#039;&#039;이 무조건 &#039;&#039;&#039;홀수&#039;&#039;&#039;여야 합니다. 이를 불안정한 수열이라고 정의합니다.&lt;br /&gt;
&lt;br /&gt;
이 조건을 만족하도록 숫자를 골랐을 때, 수열의 최대 길이를 구해야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
불안정한 수열은 이웃한 두 숫자의 합이 홀수여야 합니다.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; width:60%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:25%;&amp;quot; | 숫자1 !! style=&amp;quot;width:25%;&amp;quot; | 숫자2 !! style=&amp;quot;width:25%;&amp;quot; | 두 수의 합 !! style=&amp;quot;width:25%;&amp;quot; | 불안정 여부&lt;br /&gt;
|-&lt;br /&gt;
| 짝수 || 짝수 || 짝수 || X&lt;br /&gt;
|-&lt;br /&gt;
| 홀수 || 홀수 || 짝수 || X&lt;br /&gt;
|-&lt;br /&gt;
| 짝수 || 홀수 || 홀수 || O&lt;br /&gt;
|-&lt;br /&gt;
| 홀수 || 짝수 || 홀수 || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
﻿﻿위 표와 같이 두 수의 합이 홀수가 되려면 &#039;&#039;&#039;반드시 짝수와 홀수가 번갈아 가며 나와야 합니다.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
우리가 해야할 일은 간단합니다. 주어진 배열을 돌면서 홀짝이 바뀌는 순간을 계속 카운트하면 불안정한 수열을 얻을 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
# 불안정한 수열의 최대 길이를 구해야 하기 때문에 무조건 첫 번째 숫자는 고르고 시작합니다.&lt;br /&gt;
# 다음 숫자들을 하나씩 확인하며, 이전 숫자와 홀짝이 다를 때만 그 숫자를 고릅니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n = int(input())&lt;br /&gt;
L = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
ans = 1  # 최대 길이를 구하기 위해 첫 번째 숫자는 고르고 시작&lt;br /&gt;
&lt;br /&gt;
for i in range(n - 1):&lt;br /&gt;
    # 내 숫자(L[i])와 나 다음 숫자(L[i+1])의 홀짝성이 다르다면&lt;br /&gt;
    if L[i] % 2 != L[i+1] % 2:&lt;br /&gt;
        ans += 1  # 수열 길이 1 증가&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿수열을 한 바퀴 돌아보면서 나와 내 다음 숫자의 홀짝성이 다른 경우를 찾아보았습니다.&lt;br /&gt;
&lt;br /&gt;
시간복잡도는 O(N)으로 주어진 N의 범위(1 &amp;lt;= N &amp;lt;= 300,000)를 계산하는데 충분합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📊 정답률 ===&lt;br /&gt;
2차에 진출한 초등부 학생들 중 80% 이상이 100점을 받은 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
일단 홀짝성을 비교해야겠다는 생각을 해내었다면 다양한 방법으로 풀이할 수 있는 난이도가 높지 않은 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1629 2. 스케이트 연습 (초2/중1/고1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== ﻿📄 문제 개요 ===&lt;br /&gt;
N개의 체크포인트(중간 지점)가 있는 스케이트 코스가 있습니다.&lt;br /&gt;
&lt;br /&gt;
* 출발점과 도착점에서의 속력은 반드시 0이어야 합니다.&lt;br /&gt;
* 각 체크포인트에는 넘어서는 안 되는 &#039;&#039;&#039;속력 제한(V)&#039;&#039;&#039;이 있습니다.&lt;br /&gt;
* 속력을 높일 때는 제한 없이 확 높일 수 있지만, &#039;&#039;&#039;속력을 낮출 때는 직전 지점의 속력에서 딱 1만큼만&#039;&#039;&#039; 낮출 수 있습니다.&lt;br /&gt;
* &#039;&#039;&#039;목표 :&#039;&#039;&#039; 조건을 지키며 코스를 완주할 때, 각 체크포인트에서 낼 수 있는 속력들의 &#039;&#039;&#039;총합의 최댓값&#039;&#039;&#039;을 구해야 합니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
보통 문제를 풀 때 배열의 처음부터 끝으로 순서대로 탐색하는 것이 일반적입니다.&lt;br /&gt;
&lt;br /&gt;
하지만 이 문제를 앞에서부터 탐색하게 되면 로직이 매우 복잡해집니다.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;속력을 낮출 때는 1씩만 낮출 수 있다&#039;&#039;&#039;는 조건 때문에, 현재 위치에서 속력을 마음 편히 올리려면 앞으로 남은 모든 코스의 속력 제한을 &#039;&#039;&#039;미리 내다보고 계산&#039;&#039;&#039;해야 하기 때문입니다. 이런 상황에서는 탐색의 방향을 완전히 뒤집어 &#039;&#039;&#039;도착점부터 역방향으로 탐색&#039;&#039;&#039;해보는 것이 아주 좋은 해결책이 됩니다.&lt;br /&gt;
&lt;br /&gt;
도착점부터 거꾸로  생각하면, &#039;&#039;&#039;원래의 속력을 최대 1만 낮출 수 있다&#039;&#039;&#039;는 조건은 반대로 &#039;&#039;&#039;속력을 최대 1만 높일 수 있다&#039;&#039;&#039;는 단순한 조건으로 바뀝니다.&lt;br /&gt;
&lt;br /&gt;
[[파일:2023KOI스케이트연습1.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
도착점의 속력은 무조건 0이기 때문에 도착 지점의 속력 0에서 시작합니다.&lt;br /&gt;
&lt;br /&gt;
각 지점에서의 최대 속력은 ① &#039;&#039;&#039;현재 지점의 속력 제한(V)&#039;&#039;&#039;과 &#039;&#039;&#039;② 다음 지점의 속력 + 1&#039;&#039;&#039; 중 더 작은 값으로 단순하게 결정됩니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
input = sys.stdin.readline&lt;br /&gt;
&lt;br /&gt;
n = int(input())&lt;br /&gt;
arr = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
speed = 0    # 현재 위치에서의 최대 속력 (도착점은 0이므로 0부터 시작)&lt;br /&gt;
ans = 0  # 낼 수 있는 속력들의 총합&lt;br /&gt;
&lt;br /&gt;
# 배열의 맨 끝(도착점 직전)부터 첫 번째 지점까지 거꾸로 탐색&lt;br /&gt;
for i in range(n - 1, -1, -1):&lt;br /&gt;
    if speed &amp;lt; arr[i]: # 1. 내 속력을 1 높여도 속력 제한(arr[i])보다 작다면? &lt;br /&gt;
        speed += 1  # 마음 편히 속력을 1 올림&lt;br /&gt;
        &lt;br /&gt;
    else: # 2. 내 속력을 1 높이면 속력 제한을 넘어가 버린다면?&lt;br /&gt;
        speed = arr[i]  # 해당 지점의 제한 속력에 맞춤&lt;br /&gt;
        &lt;br /&gt;
    ans += speed  # 결정된 속력을 정답에 누적&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿데이터의 개수 N이 최대 50만 개로 꽤 크지만, 이중 반복문 없이 배열을 거꾸로 한 번만 스캔&#039;&#039;&#039;(시간 복잡도 : O(N))&#039;&#039;&#039;하므로 2초의 시간 제한을 아주 여유롭게 통과합니다. &lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== 📊 정답률 ===&lt;br /&gt;
﻿100점을 받은 학생 비율이 초등부 50% 정도, 중등부 80% 이상, 고등부 90% 이상이었습니다.&lt;br /&gt;
&lt;br /&gt;
초등부 학생들도 2번 문제치고는 난이도가 평이한 수준, 중/고등부에서는 반드시 맞춰야할 쉬운 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
참고로 풀어볼 만한 문제 링크를 하나 추가했으니, 시간이 나면 풀어보세요.&lt;br /&gt;
&lt;br /&gt;
[https://codersit.co.kr/oj/problems/2087 &#039;&#039;&#039;COCI 6회 &amp;quot;미래를 보는 투자자&amp;quot; 문제 풀이하러가기&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1670 3. 호숫가의 개미굴 (초3/중2)]&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;4. 고기 파티 (초4/중3)&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2890</id>
		<title>2023 한국정보올림피아드(KOI) 2차 대회 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2890"/>
		<updated>2026-04-28T09:13:51Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2023 KOI, 2023 초등부 2차 대회|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1589 1. 불안정한 수열 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== ﻿📄 문제 개요 ===&lt;br /&gt;
N개의 자연수가 일렬로 주어집니다. 이 중에서 원하는 만큼 숫자를 골라 새로운 수열을 만들려고 합니다.&lt;br /&gt;
&lt;br /&gt;
새로 만든 수열은 &#039;&#039;&#039;이웃한 두 숫자의 합&#039;&#039;&#039;이 무조건 &#039;&#039;&#039;홀수&#039;&#039;&#039;여야 합니다. 이를 불안정한 수열이라고 정의합니다.&lt;br /&gt;
&lt;br /&gt;
이 조건을 만족하도록 숫자를 골랐을 때, 수열의 최대 길이를 구해야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
불안정한 수열은 이웃한 두 숫자의 합이 홀수여야 합니다.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; width:60%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:25%;&amp;quot; | 숫자1 !! style=&amp;quot;width:25%;&amp;quot; | 숫자2 !! style=&amp;quot;width:25%;&amp;quot; | 두 수의 합 !! style=&amp;quot;width:25%;&amp;quot; | 불안정 여부&lt;br /&gt;
|-&lt;br /&gt;
| 짝수 || 짝수 || 짝수 || X&lt;br /&gt;
|-&lt;br /&gt;
| 홀수 || 홀수 || 짝수 || X&lt;br /&gt;
|-&lt;br /&gt;
| 짝수 || 홀수 || 홀수 || O&lt;br /&gt;
|-&lt;br /&gt;
| 홀수 || 짝수 || 홀수 || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
﻿﻿위 표와 같이 두 수의 합이 홀수가 되려면 &#039;&#039;&#039;반드시 짝수와 홀수가 번갈아 가며 나와야 합니다.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
우리가 해야할 일은 간단합니다. 주어진 배열을 돌면서 홀짝이 바뀌는 순간을 계속 카운트하면 불안정한 수열을 얻을 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
# 불안정한 수열의 최대 길이를 구해야 하기 때문에 무조건 첫 번째 숫자는 고르고 시작합니다.&lt;br /&gt;
# 다음 숫자들을 하나씩 확인하며, 이전 숫자와 홀짝이 다를 때만 그 숫자를 고릅니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n = int(input())&lt;br /&gt;
L = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
ans = 1  # 최대 길이를 구하기 위해 첫 번째 숫자는 고르고 시작&lt;br /&gt;
&lt;br /&gt;
for i in range(n - 1):&lt;br /&gt;
    # 내 숫자(L[i])와 나 다음 숫자(L[i+1])의 홀짝성이 다르다면&lt;br /&gt;
    if L[i] % 2 != L[i+1] % 2:&lt;br /&gt;
        ans += 1  # 수열 길이 1 증가&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿수열을 한 바퀴 돌아보면서 나와 내 다음 숫자의 홀짝성이 다른 경우를 찾아보았습니다.&lt;br /&gt;
&lt;br /&gt;
시간복잡도는 O(N)으로 주어진 N의 범위(1 &amp;lt;= N &amp;lt;= 300,000)를 계산하는데 충분합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📊 정답률 ===&lt;br /&gt;
2차에 진출한 초등부 학생들 중 80% 이상이 100점을 받은 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
일단 홀짝성을 비교해야겠다는 생각을 해내었다면 다양한 방법으로 풀이할 수 있는 난이도가 높지 않은 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1629 2. 스케이트 연습 (초2/중1/고1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== ﻿📄 문제 개요 ===&lt;br /&gt;
N개의 체크포인트(중간 지점)가 있는 스케이트 코스가 있습니다.&lt;br /&gt;
&lt;br /&gt;
* 출발점과 도착점에서의 속력은 반드시 0이어야 합니다.&lt;br /&gt;
* 각 체크포인트에는 넘어서는 안 되는 &#039;&#039;&#039;속력 제한(V)&#039;&#039;&#039;이 있습니다.&lt;br /&gt;
* 속력을 높일 때는 제한 없이 확 높일 수 있지만, &#039;&#039;&#039;속력을 낮출 때는 직전 지점의 속력에서 딱 1만큼만&#039;&#039;&#039; 낮출 수 있습니다.&lt;br /&gt;
* &#039;&#039;&#039;목표 :&#039;&#039;&#039; 조건을 지키며 코스를 완주할 때, 각 체크포인트에서 낼 수 있는 속력들의 &#039;&#039;&#039;총합의 최댓값&#039;&#039;&#039;을 구해야 합니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
보통 문제를 풀 때 배열의 처음부터 끝으로 순서대로 탐색하는 것이 일반적입니다.&lt;br /&gt;
&lt;br /&gt;
하지만 이 문제를 앞에서부터 탐색하게 되면 로직이 매우 복잡해집니다.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;속력을 낮출 때는 1씩만 낮출 수 있다&#039;&#039;&#039;는 조건 때문에, 현재 위치에서 속력을 마음 편히 올리려면 앞으로 남은 모든 코스의 속력 제한을 &#039;&#039;&#039;미리 내다보고 계산&#039;&#039;&#039;해야 하기 때문입니다. 이런 상황에서는 탐색의 방향을 완전히 뒤집어 &#039;&#039;&#039;도착점부터 역방향으로 탐색&#039;&#039;&#039;해보는 것이 아주 좋은 해결책이 됩니다.&lt;br /&gt;
&lt;br /&gt;
도착점부터 거꾸로  생각하면, &#039;&#039;&#039;원래의 속력을 최대 1만 낮출 수 있다&#039;&#039;&#039;는 조건은 반대로 &#039;&#039;&#039;속력을 최대 1만 높일 수 있다&#039;&#039;&#039;는 단순한 조건으로 바뀝니다.&lt;br /&gt;
&lt;br /&gt;
[[파일:2023KOI스케이트연습1.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
도착점의 속력은 무조건 0이기 때문에 도착 지점의 속력 0에서 시작합니다.&lt;br /&gt;
&lt;br /&gt;
각 지점에서의 최대 속력은 ① &#039;&#039;&#039;현재 지점의 속력 제한(V)&#039;&#039;&#039;과 &#039;&#039;&#039;② 다음 지점의 속력 + 1&#039;&#039;&#039; 중 더 작은 값으로 단순하게 결정됩니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
input = sys.stdin.readline&lt;br /&gt;
&lt;br /&gt;
n = int(input())&lt;br /&gt;
arr = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
speed = 0    # 현재 위치에서의 최대 속력 (도착점은 0이므로 0부터 시작)&lt;br /&gt;
ans = 0  # 낼 수 있는 속력들의 총합&lt;br /&gt;
&lt;br /&gt;
# 배열의 맨 끝(도착점 직전)부터 첫 번째 지점까지 거꾸로 탐색&lt;br /&gt;
for i in range(n - 1, -1, -1):&lt;br /&gt;
    if speed &amp;lt; arr[i]: # 1. 내 속력을 1 높여도 속력 제한(arr[i])보다 작다면? &lt;br /&gt;
        speed += 1  # 마음 편히 속력을 1 올림&lt;br /&gt;
        &lt;br /&gt;
    else: # 2. 내 속력을 1 높이면 속력 제한을 넘어가 버린다면?&lt;br /&gt;
        speed = arr[i]  # 해당 지점의 제한 속력에 맞춤&lt;br /&gt;
        &lt;br /&gt;
    ans += speed  # 결정된 속력을 정답에 누적&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿데이터의 개수 N이 최대 50만 개로 꽤 크지만, 이중 반복문 없이 배열을 거꾸로 한 번만 스캔&#039;&#039;&#039;(시간 복잡도 : O(N))&#039;&#039;&#039;하므로 2초의 시간 제한을 아주 여유롭게 통과합니다. &lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== 📊 정답률 ===&lt;br /&gt;
﻿100점을 받은 학생 비율이 초등부 50% 정도, 중등부 80% 이상, 고등부 90% 이상이었습니다.&lt;br /&gt;
&lt;br /&gt;
초등부 학생들도 2번 문제치고는 난이도가 평이한 수준, 중/고등부에서는 반드시 맞춰야할 쉬운 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
﻿참고로 풀어볼 만한 문제 링크를 하나 추가했으니, 시간이 나면 풀어보세요.&lt;br /&gt;
&lt;br /&gt;
[https://codersit.co.kr/oj/problems/2087 COCI 6회 &amp;quot;미래를 보는 투자자&amp;quot; 문제 풀이하러가기]&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1670 3. 호숫가의 개미굴 (초3/중2)]&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;4. 고기 파티 (초4/중3)&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2889</id>
		<title>2023 한국정보올림피아드(KOI) 2차 대회 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2889"/>
		<updated>2026-04-28T09:13:33Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2023 KOI, 2023 초등부 2차 대회|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1589 1. 불안정한 수열 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== ﻿📄 문제 개요 ===&lt;br /&gt;
N개의 자연수가 일렬로 주어집니다. 이 중에서 원하는 만큼 숫자를 골라 새로운 수열을 만들려고 합니다.&lt;br /&gt;
&lt;br /&gt;
새로 만든 수열은 &#039;&#039;&#039;이웃한 두 숫자의 합&#039;&#039;&#039;이 무조건 &#039;&#039;&#039;홀수&#039;&#039;&#039;여야 합니다. 이를 불안정한 수열이라고 정의합니다.&lt;br /&gt;
&lt;br /&gt;
이 조건을 만족하도록 숫자를 골랐을 때, 수열의 최대 길이를 구해야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
불안정한 수열은 이웃한 두 숫자의 합이 홀수여야 합니다.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; width:60%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:25%;&amp;quot; | 숫자1 !! style=&amp;quot;width:25%;&amp;quot; | 숫자2 !! style=&amp;quot;width:25%;&amp;quot; | 두 수의 합 !! style=&amp;quot;width:25%;&amp;quot; | 불안정 여부&lt;br /&gt;
|-&lt;br /&gt;
| 짝수 || 짝수 || 짝수 || X&lt;br /&gt;
|-&lt;br /&gt;
| 홀수 || 홀수 || 짝수 || X&lt;br /&gt;
|-&lt;br /&gt;
| 짝수 || 홀수 || 홀수 || O&lt;br /&gt;
|-&lt;br /&gt;
| 홀수 || 짝수 || 홀수 || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
﻿﻿위 표와 같이 두 수의 합이 홀수가 되려면 &#039;&#039;&#039;반드시 짝수와 홀수가 번갈아 가며 나와야 합니다.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
우리가 해야할 일은 간단합니다. 주어진 배열을 돌면서 홀짝이 바뀌는 순간을 계속 카운트하면 불안정한 수열을 얻을 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
# 불안정한 수열의 최대 길이를 구해야 하기 때문에 무조건 첫 번째 숫자는 고르고 시작합니다.&lt;br /&gt;
# 다음 숫자들을 하나씩 확인하며, 이전 숫자와 홀짝이 다를 때만 그 숫자를 고릅니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n = int(input())&lt;br /&gt;
L = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
ans = 1  # 최대 길이를 구하기 위해 첫 번째 숫자는 고르고 시작&lt;br /&gt;
&lt;br /&gt;
for i in range(n - 1):&lt;br /&gt;
    # 내 숫자(L[i])와 나 다음 숫자(L[i+1])의 홀짝성이 다르다면&lt;br /&gt;
    if L[i] % 2 != L[i+1] % 2:&lt;br /&gt;
        ans += 1  # 수열 길이 1 증가&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿수열을 한 바퀴 돌아보면서 나와 내 다음 숫자의 홀짝성이 다른 경우를 찾아보았습니다.&lt;br /&gt;
&lt;br /&gt;
시간복잡도는 O(N)으로 주어진 N의 범위(1 &amp;lt;= N &amp;lt;= 300,000)를 계산하는데 충분합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📊 정답률 ===&lt;br /&gt;
2차에 진출한 초등부 학생들 중 80% 이상이 100점을 받은 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
일단 홀짝성을 비교해야겠다는 생각을 해내었다면 다양한 방법으로 풀이할 수 있는 난이도가 높지 않은 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1629 2. 스케이트 연습 (초2/중1/고1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== ﻿📄 문제 개요 ===&lt;br /&gt;
N개의 체크포인트(중간 지점)가 있는 스케이트 코스가 있습니다.&lt;br /&gt;
&lt;br /&gt;
* 출발점과 도착점에서의 속력은 반드시 0이어야 합니다.&lt;br /&gt;
* 각 체크포인트에는 넘어서는 안 되는 &#039;&#039;&#039;속력 제한(V)&#039;&#039;&#039;이 있습니다.&lt;br /&gt;
* 속력을 높일 때는 제한 없이 확 높일 수 있지만, &#039;&#039;&#039;속력을 낮출 때는 직전 지점의 속력에서 딱 1만큼만&#039;&#039;&#039; 낮출 수 있습니다.&lt;br /&gt;
* &#039;&#039;&#039;목표 :&#039;&#039;&#039; 조건을 지키며 코스를 완주할 때, 각 체크포인트에서 낼 수 있는 속력들의 &#039;&#039;&#039;총합의 최댓값&#039;&#039;&#039;을 구해야 합니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
보통 문제를 풀 때 배열의 처음부터 끝으로 순서대로 탐색하는 것이 일반적입니다.&lt;br /&gt;
&lt;br /&gt;
하지만 이 문제를 앞에서부터 탐색하게 되면 로직이 매우 복잡해집니다.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;속력을 낮출 때는 1씩만 낮출 수 있다&#039;&#039;&#039;는 조건 때문에, 현재 위치에서 속력을 마음 편히 올리려면 앞으로 남은 모든 코스의 속력 제한을 &#039;&#039;&#039;미리 내다보고 계산&#039;&#039;&#039;해야 하기 때문입니다. 이런 상황에서는 탐색의 방향을 완전히 뒤집어 &#039;&#039;&#039;도착점부터 역방향으로 탐색&#039;&#039;&#039;해보는 것이 아주 좋은 해결책이 됩니다.&lt;br /&gt;
&lt;br /&gt;
도착점부터 거꾸로  생각하면, &#039;&#039;&#039;원래의 속력을 최대 1만 낮출 수 있다&#039;&#039;&#039;는 조건은 반대로 &#039;&#039;&#039;속력을 최대 1만 높일 수 있다&#039;&#039;&#039;는 단순한 조건으로 바뀝니다.&lt;br /&gt;
&lt;br /&gt;
[[파일:2023KOI스케이트연습1.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
도착점의 속력은 무조건 0이기 때문에 도착 지점의 속력 0에서 시작합니다.&lt;br /&gt;
&lt;br /&gt;
각 지점에서의 최대 속력은 ① &#039;&#039;&#039;현재 지점의 속력 제한(V)&#039;&#039;&#039;과 &#039;&#039;&#039;② 다음 지점의 속력 + 1&#039;&#039;&#039; 중 더 작은 값으로 단순하게 결정됩니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
input = sys.stdin.readline&lt;br /&gt;
&lt;br /&gt;
n = int(input())&lt;br /&gt;
arr = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
speed = 0    # 현재 위치에서의 최대 속력 (도착점은 0이므로 0부터 시작)&lt;br /&gt;
ans = 0  # 낼 수 있는 속력들의 총합&lt;br /&gt;
&lt;br /&gt;
# 배열의 맨 끝(도착점 직전)부터 첫 번째 지점까지 거꾸로 탐색&lt;br /&gt;
for i in range(n - 1, -1, -1):&lt;br /&gt;
    if speed &amp;lt; arr[i]: # 1. 내 속력을 1 높여도 속력 제한(arr[i])보다 작다면? &lt;br /&gt;
        speed += 1  # 마음 편히 속력을 1 올림&lt;br /&gt;
        &lt;br /&gt;
    else: # 2. 내 속력을 1 높이면 속력 제한을 넘어가 버린다면?&lt;br /&gt;
        speed = arr[i]  # 해당 지점의 제한 속력에 맞춤&lt;br /&gt;
        &lt;br /&gt;
    ans += speed  # 결정된 속력을 정답에 누적&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿데이터의 개수 N이 최대 50만 개로 꽤 크지만, 이중 반복문 없이 배열을 거꾸로 한 번만 스캔&#039;&#039;&#039;(시간 복잡도 : O(N))&#039;&#039;&#039;하므로 2초의 시간 제한을 아주 여유롭게 통과합니다. &lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== 📊 정답률 ===&lt;br /&gt;
﻿100점을 받은 학생 비율이 초등부 50% 정도, 중등부 80% 이상, 고등부 90% 이상이었습니다.&lt;br /&gt;
&lt;br /&gt;
초등부 학생들도 2번 문제치고는 난이도가 평이한 수준, 중/고등부에서는 반드시 맞춰야할 쉬운 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
﻿참고로 풀어볼 만한 문제 링크를 하나 추가했으니, 시간이 나면 풀어보세요.&lt;br /&gt;
&lt;br /&gt;
[https://codersit.co.kr/oj/problems/2087 COCI 6회 &amp;quot;미래를 보는 투자자&amp;quot; 문제 풀이하러가기]&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1670 3. 호숫가의 개미굴 (초3/중2)]&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;4. 고기 파티 (초4/중3)&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2888</id>
		<title>2023 한국정보올림피아드(KOI) 2차 대회 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2888"/>
		<updated>2026-04-28T09:13:04Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2023 KOI, 2023 초등부 2차 대회|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1589 1. 불안정한 수열 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== ﻿📄 문제 개요 ===&lt;br /&gt;
N개의 자연수가 일렬로 주어집니다. 이 중에서 원하는 만큼 숫자를 골라 새로운 수열을 만들려고 합니다.&lt;br /&gt;
&lt;br /&gt;
새로 만든 수열은 &#039;&#039;&#039;이웃한 두 숫자의 합&#039;&#039;&#039;이 무조건 &#039;&#039;&#039;홀수&#039;&#039;&#039;여야 합니다. 이를 불안정한 수열이라고 정의합니다.&lt;br /&gt;
&lt;br /&gt;
이 조건을 만족하도록 숫자를 골랐을 때, 수열의 최대 길이를 구해야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
불안정한 수열은 이웃한 두 숫자의 합이 홀수여야 합니다.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; width:60%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:25%;&amp;quot; | 숫자1 !! style=&amp;quot;width:25%;&amp;quot; | 숫자2 !! style=&amp;quot;width:25%;&amp;quot; | 두 수의 합 !! style=&amp;quot;width:25%;&amp;quot; | 불안정 여부&lt;br /&gt;
|-&lt;br /&gt;
| 짝수 || 짝수 || 짝수 || X&lt;br /&gt;
|-&lt;br /&gt;
| 홀수 || 홀수 || 짝수 || X&lt;br /&gt;
|-&lt;br /&gt;
| 짝수 || 홀수 || 홀수 || O&lt;br /&gt;
|-&lt;br /&gt;
| 홀수 || 짝수 || 홀수 || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
﻿﻿위 표와 같이 두 수의 합이 홀수가 되려면 &#039;&#039;&#039;반드시 짝수와 홀수가 번갈아 가며 나와야 합니다.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
우리가 해야할 일은 간단합니다. 주어진 배열을 돌면서 홀짝이 바뀌는 순간을 계속 카운트하면 불안정한 수열을 얻을 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
# 불안정한 수열의 최대 길이를 구해야 하기 때문에 무조건 첫 번째 숫자는 고르고 시작합니다.&lt;br /&gt;
# 다음 숫자들을 하나씩 확인하며, 이전 숫자와 홀짝이 다를 때만 그 숫자를 고릅니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n = int(input())&lt;br /&gt;
L = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
ans = 1  # 최대 길이를 구하기 위해 첫 번째 숫자는 고르고 시작&lt;br /&gt;
&lt;br /&gt;
for i in range(n - 1):&lt;br /&gt;
    # 내 숫자(L[i])와 나 다음 숫자(L[i+1])의 홀짝성이 다르다면&lt;br /&gt;
    if L[i] % 2 != L[i+1] % 2:&lt;br /&gt;
        ans += 1  # 수열 길이 1 증가&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿수열을 한 바퀴 돌아보면서 나와 내 다음 숫자의 홀짝성이 다른 경우를 찾아보았습니다.&lt;br /&gt;
&lt;br /&gt;
시간복잡도는 O(N)으로 주어진 N의 범위(1 &amp;lt;= N &amp;lt;= 300,000)를 계산하는데 충분합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📊 정답률 ===&lt;br /&gt;
2차에 진출한 초등부 학생들 중 80% 이상이 100점을 받은 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
일단 홀짝성을 비교해야겠다는 생각을 해내었다면 다양한 방법으로 풀이할 수 있는 난이도가 높지 않은 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1629 2. 스케이트 연습 (초2/중1/고1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== ﻿📄 문제 개요 ===&lt;br /&gt;
N개의 체크포인트(중간 지점)가 있는 스케이트 코스가 있습니다.&lt;br /&gt;
&lt;br /&gt;
* 출발점과 도착점에서의 속력은 반드시 0이어야 합니다.&lt;br /&gt;
* 각 체크포인트에는 넘어서는 안 되는 &#039;&#039;&#039;속력 제한(V)&#039;&#039;&#039;이 있습니다.&lt;br /&gt;
* 속력을 높일 때는 제한 없이 확 높일 수 있지만, &#039;&#039;&#039;속력을 낮출 때는 직전 지점의 속력에서 딱 1만큼만&#039;&#039;&#039; 낮출 수 있습니다.&lt;br /&gt;
* &#039;&#039;&#039;목표 :&#039;&#039;&#039; 조건을 지키며 코스를 완주할 때, 각 체크포인트에서 낼 수 있는 속력들의 &#039;&#039;&#039;총합의 최댓값&#039;&#039;&#039;을 구해야 합니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
보통 문제를 풀 때 배열의 처음부터 끝으로 순서대로 탐색하는 것이 일반적입니다.&lt;br /&gt;
&lt;br /&gt;
하지만 이 문제를 앞에서부터 탐색하게 되면 로직이 매우 복잡해집니다.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;속력을 낮출 때는 1씩만 낮출 수 있다&#039;&#039;&#039;는 조건 때문에, 현재 위치에서 속력을 마음 편히 올리려면 앞으로 남은 모든 코스의 속력 제한을 &#039;&#039;&#039;미리 내다보고 계산&#039;&#039;&#039;해야 하기 때문입니다. 이런 상황에서는 탐색의 방향을 완전히 뒤집어 &#039;&#039;&#039;도착점부터 역방향으로 탐색&#039;&#039;&#039;해보는 것이 아주 좋은 해결책이 됩니다.&lt;br /&gt;
&lt;br /&gt;
도착점부터 거꾸로  생각하면, &#039;&#039;&#039;원래의 속력을 최대 1만 낮출 수 있다&#039;&#039;&#039;는 조건은 반대로 &#039;&#039;&#039;속력을 최대 1만 높일 수 있다&#039;&#039;&#039;는 단순한 조건으로 바뀝니다.&lt;br /&gt;
&lt;br /&gt;
[[파일:2023KOI스케이트연습1.png]]﻿&lt;br /&gt;
&lt;br /&gt;
도착점의 속력은 무조건 0이기 때문에 도착 지점의 속력 0에서 시작합니다.&lt;br /&gt;
&lt;br /&gt;
각 지점에서의 최대 속력은 ① &#039;&#039;&#039;현재 지점의 속력 제한(V)&#039;&#039;&#039;과 &#039;&#039;&#039;② 다음 지점의 속력 + 1&#039;&#039;&#039; 중 더 작은 값으로 단순하게 결정됩니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
input = sys.stdin.readline&lt;br /&gt;
&lt;br /&gt;
n = int(input())&lt;br /&gt;
arr = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
speed = 0    # 현재 위치에서의 최대 속력 (도착점은 0이므로 0부터 시작)&lt;br /&gt;
ans = 0  # 낼 수 있는 속력들의 총합&lt;br /&gt;
&lt;br /&gt;
# 배열의 맨 끝(도착점 직전)부터 첫 번째 지점까지 거꾸로 탐색&lt;br /&gt;
for i in range(n - 1, -1, -1):&lt;br /&gt;
    if speed &amp;lt; arr[i]: # 1. 내 속력을 1 높여도 속력 제한(arr[i])보다 작다면? &lt;br /&gt;
        speed += 1  # 마음 편히 속력을 1 올림&lt;br /&gt;
        &lt;br /&gt;
    else: # 2. 내 속력을 1 높이면 속력 제한을 넘어가 버린다면?&lt;br /&gt;
        speed = arr[i]  # 해당 지점의 제한 속력에 맞춤&lt;br /&gt;
        &lt;br /&gt;
    ans += speed  # 결정된 속력을 정답에 누적&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿데이터의 개수 N이 최대 50만 개로 꽤 크지만, 이중 반복문 없이 배열을 거꾸로 한 번만 스캔&#039;&#039;&#039;(시간 복잡도 : O(N))&#039;&#039;&#039;하므로 2초의 시간 제한을 아주 여유롭게 통과합니다. &lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== 📊 정답률 ===&lt;br /&gt;
﻿100점을 받은 학생 비율이 초등부 50% 정도, 중등부 80% 이상, 고등부 90% 이상이었습니다.&lt;br /&gt;
&lt;br /&gt;
초등부 학생들도 2번 문제치고는 난이도가 평이한 수준, 중/고등부에서는 반드시 맞춰야할 쉬운 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
﻿참고로 풀어볼 만한 문제 링크를 하나 추가했으니, 시간이 나면 풀어보세요.&lt;br /&gt;
&lt;br /&gt;
[https://codersit.co.kr/oj/problems/2087 COCI 6회 &amp;quot;미래를 보는 투자자&amp;quot; 문제 풀이하러가기]&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1670 3. 호숫가의 개미굴 (초3/중2)]&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;4. 고기 파티 (초4/중3)&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=%ED%8C%8C%EC%9D%BC:2023KOI%EC%8A%A4%EC%BC%80%EC%9D%B4%ED%8A%B8%EC%97%B0%EC%8A%B51.png&amp;diff=2887</id>
		<title>파일:2023KOI스케이트연습1.png</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=%ED%8C%8C%EC%9D%BC:2023KOI%EC%8A%A4%EC%BC%80%EC%9D%B4%ED%8A%B8%EC%97%B0%EC%8A%B51.png&amp;diff=2887"/>
		<updated>2026-04-28T09:10:49Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;2023KOI스케이트연습1&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2886</id>
		<title>2023 한국정보올림피아드(KOI) 2차 대회 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2886"/>
		<updated>2026-04-25T06:26:13Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: /* 💡 문제 풀이 시뮬레이션 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2023 KOI, 2023 초등부 2차 대회|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1589 1. 불안정한 수열 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== ﻿📄 문제 개요 ===&lt;br /&gt;
N개의 자연수가 일렬로 주어집니다. 이 중에서 원하는 만큼 숫자를 골라 새로운 수열을 만들려고 합니다.&lt;br /&gt;
&lt;br /&gt;
새로 만든 수열은 &#039;&#039;&#039;이웃한 두 숫자의 합&#039;&#039;&#039;이 무조건 &#039;&#039;&#039;홀수&#039;&#039;&#039;여야 합니다. 이를 불안정한 수열이라고 정의합니다.&lt;br /&gt;
&lt;br /&gt;
이 조건을 만족하도록 숫자를 골랐을 때, 수열의 최대 길이를 구해야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
불안정한 수열은 이웃한 두 숫자의 합이 홀수여야 합니다.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; width:60%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:25%;&amp;quot; | 숫자1 !! style=&amp;quot;width:25%;&amp;quot; | 숫자2 !! style=&amp;quot;width:25%;&amp;quot; | 두 수의 합 !! style=&amp;quot;width:25%;&amp;quot; | 불안정 여부&lt;br /&gt;
|-&lt;br /&gt;
| 짝수 || 짝수 || 짝수 || X&lt;br /&gt;
|-&lt;br /&gt;
| 홀수 || 홀수 || 짝수 || X&lt;br /&gt;
|-&lt;br /&gt;
| 짝수 || 홀수 || 홀수 || O&lt;br /&gt;
|-&lt;br /&gt;
| 홀수 || 짝수 || 홀수 || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
﻿﻿위 표와 같이 두 수의 합이 홀수가 되려면 &#039;&#039;&#039;반드시 짝수와 홀수가 번갈아 가며 나와야 합니다.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
우리가 해야할 일은 간단합니다. 주어진 배열을 돌면서 홀짝이 바뀌는 순간을 계속 카운트하면 불안정한 수열을 얻을 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
# 불안정한 수열의 최대 길이를 구해야 하기 때문에 무조건 첫 번째 숫자는 고르고 시작합니다.&lt;br /&gt;
# 다음 숫자들을 하나씩 확인하며, 이전 숫자와 홀짝이 다를 때만 그 숫자를 고릅니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n = int(input())&lt;br /&gt;
L = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
ans = 1  # 최대 길이를 구하기 위해 첫 번째 숫자는 고르고 시작&lt;br /&gt;
&lt;br /&gt;
for i in range(n - 1):&lt;br /&gt;
    # 내 숫자(L[i])와 나 다음 숫자(L[i+1])의 홀짝성이 다르다면&lt;br /&gt;
    if L[i] % 2 != L[i+1] % 2:&lt;br /&gt;
        ans += 1  # 수열 길이 1 증가&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿수열을 한 바퀴 돌아보면서 나와 내 다음 숫자의 홀짝성이 다른 경우를 찾아보았습니다.&lt;br /&gt;
&lt;br /&gt;
시간복잡도는 O(N)으로 주어진 N의 범위(1 &amp;lt;= N &amp;lt;= 300,000)를 계산하는데 충분합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📊 정답률 ===&lt;br /&gt;
2차에 진출한 초등부 학생들 중 80% 이상이 100점을 받은 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
일단 홀짝성을 비교해야겠다는 생각을 해내었다면 다양한 방법으로 풀이할 수 있는 난이도가 높지 않은 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1629 2. 스케이트 연습 (초2/중1/고1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1670 3. 호숫가의 개미굴 (초3/중2)]&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;4. 고기 파티 (초4/중3)&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2885</id>
		<title>2023 한국정보올림피아드(KOI) 2차 대회 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2885"/>
		<updated>2026-04-25T02:48:08Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2023 KOI, 2023 초등부 2차 대회|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1589 1. 불안정한 수열 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== ﻿📄 문제 개요 ===&lt;br /&gt;
N개의 자연수가 일렬로 주어집니다. 이 중에서 원하는 만큼 숫자를 골라 새로운 수열을 만들려고 합니다.&lt;br /&gt;
&lt;br /&gt;
새로 만든 수열은 &#039;&#039;&#039;이웃한 두 숫자의 합&#039;&#039;&#039;이 무조건 &#039;&#039;&#039;홀수&#039;&#039;&#039;여야 합니다. 이를 불안정한 수열이라고 정의합니다.&lt;br /&gt;
&lt;br /&gt;
이 조건을 만족하도록 숫자를 골랐을 때, 수열의 최대 길이를 구해야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
불안정한 수열은 이웃한 두 숫자의 합이 홀수여야 합니다.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; width:60%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:25%;&amp;quot; | 숫자1 !! style=&amp;quot;width:25%;&amp;quot; | 숫자2 !! style=&amp;quot;width:25%;&amp;quot; | 두 수의 합 !! style=&amp;quot;width:25%;&amp;quot; | 불안정 여부&lt;br /&gt;
|-&lt;br /&gt;
| 짝수 || 짝수 || 짝수 || X&lt;br /&gt;
|-&lt;br /&gt;
| 홀수 || 홀수 || 짝수 || X&lt;br /&gt;
|-&lt;br /&gt;
| 짝수 || 홀수 || 홀수 || O&lt;br /&gt;
|-&lt;br /&gt;
| 홀수 || 짝수 || 홀수 || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
﻿﻿위 표와 같이 두 수의 합이 홀수가 되려면 &#039;&#039;&#039;반드시 짝수와 홀수가 번갈아 가며 나와야 합니다.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
우리가 해야할 일은 간단합니다. 주어진 배열을 돌면서 홀짝이 바뀌는 순간을 계속 카운트하면 불안정한 수열을 얻을 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
# 불안정한 수열의 최대 길이를 구해야 하기 때문에 무조건 첫 번째 숫자는 고르고 시작합니다.&lt;br /&gt;
# 다음 숫자들을 하나씩 확인하며, 바로 이전에 고른 숫자와 홀짝이 다를 때만 그 숫자를 고릅니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n = int(input())&lt;br /&gt;
L = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
ans = 1  # 최대 길이를 구하기 위해 첫 번째 숫자는 고르고 시작&lt;br /&gt;
&lt;br /&gt;
for i in range(n - 1):&lt;br /&gt;
    # 내 숫자(L[i])와 나 다음 숫자(L[i+1])의 홀짝성이 다르다면&lt;br /&gt;
    if L[i] % 2 != L[i+1] % 2:&lt;br /&gt;
        ans += 1  # 수열 길이 1 증가&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿수열을 한 바퀴 돌아보면서 나와 내 다음 숫자의 홀짝성이 다른 경우를 찾아보았습니다.&lt;br /&gt;
&lt;br /&gt;
시간복잡도는 O(N)으로 주어진 N의 범위(1 &amp;lt;= N &amp;lt;= 300,000)를 계산하는데 충분합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📊 정답률 ===&lt;br /&gt;
2차에 진출한 초등부 학생들 중 80% 이상이 100점을 받은 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
일단 홀짝성을 비교해야겠다는 생각을 해내었다면 다양한 방법으로 풀이할 수 있는 난이도가 높지 않은 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1629 2. 스케이트 연습 (초2/중1/고1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1670 3. 호숫가의 개미굴 (초3/중2)]&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;4. 고기 파티 (초4/중3)&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2884</id>
		<title>2023 한국정보올림피아드(KOI) 2차 대회 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2884"/>
		<updated>2026-04-25T02:47:34Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: /* 💡 문제 풀이 시뮬레이션 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2023 KOI, 2023 초등부 2차 대회|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1589 1. 불안정한 수열 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== ﻿📄 문제 개요 ===&lt;br /&gt;
N개의 자연수가 일렬로 주어집니다. 이 중에서 원하는 만큼 숫자를 골라 새로운 수열을 만들려고 합니다.&lt;br /&gt;
&lt;br /&gt;
새로 만든 수열은 &#039;&#039;&#039;이웃한 두 숫자의 합&#039;&#039;&#039;이 무조건 &#039;&#039;&#039;홀수&#039;&#039;&#039;여야 합니다. 이를 불안정한 수열이라고 정의합니다.&lt;br /&gt;
&lt;br /&gt;
이 조건을 만족하도록 숫자를 골랐을 때, 수열의 최대 길이를 구해야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
불안정한 수열은 이웃한 두 숫자의 합이 홀수여야 합니다.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; width:60%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:25%;&amp;quot; | 숫자1 !! style=&amp;quot;width:25%;&amp;quot; | 숫자2 !! style=&amp;quot;width:25%;&amp;quot; | 두 수의 합 !! style=&amp;quot;width:25%;&amp;quot; | 불안정 여부&lt;br /&gt;
|-&lt;br /&gt;
| 짝수 || 짝수 || 짝수 || X&lt;br /&gt;
|-&lt;br /&gt;
| 홀수 || 홀수 || 짝수 || X&lt;br /&gt;
|-&lt;br /&gt;
| 짝수 || 홀수 || 홀수 || O&lt;br /&gt;
|-&lt;br /&gt;
| 홀수 || 짝수 || 홀수 || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
﻿﻿위 표와 같이 두 수의 합이 홀수가 되려면 &#039;&#039;&#039;반드시 짝수와 홀수가 번갈아 가며 나와야 합니다.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
우리가 해야할 일은 간단합니다. 주어진 배열을 돌면서 홀짝이 바뀌는 순간을 계속 카운트하면 불안정한 수열을 얻을 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
# 불안정한 수열의 최대 길이를 구해야 하기 때문에 무조건 첫 번째 숫자는 고르고 시작합니다.&lt;br /&gt;
# 다음 숫자들을 하나씩 확인하며, 바로 이전에 고른 숫자와 홀짝이 다를 때만 그 숫자를 고릅니다.&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n = int(input())&lt;br /&gt;
L = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
ans = 1  # 최대 길이를 구하기 위해 첫 번째 숫자는 고르고 시작&lt;br /&gt;
&lt;br /&gt;
for i in range(n - 1):&lt;br /&gt;
    # 내 숫자(L[i])와 나 다음 숫자(L[i+1])의 홀짝성이 다르다면&lt;br /&gt;
    if L[i] % 2 != L[i+1] % 2:&lt;br /&gt;
        ans += 1  # 수열 길이 1 증가&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿수열을 한 바퀴 돌아보면서 나와 내 다음 숫자의 홀짝성이 다른 경우를 찾아보았습니다.&lt;br /&gt;
&lt;br /&gt;
시간복잡도는 O(N)으로 주어진 N의 범위(1 &amp;lt;= N &amp;lt;= 300,000)를 계산하는데 충분합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📊 정답률 ===&lt;br /&gt;
2차에 진출한 초등부 학생들 중 80% 이상이 100점을 받은 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
일단 홀짝성을 비교해야겠다는 생각을 해내었다면 다양한 방법으로 풀이할 수 있는 난이도가 높지 않은 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1629 2. 스케이트 연습 (초2/중1/고1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1670 3. 호숫가의 개미굴 (초3/중2)]&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;4. 고기 파티 (초4/중3)&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2883</id>
		<title>2023 한국정보올림피아드(KOI) 2차 대회 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2883"/>
		<updated>2026-04-25T02:47:25Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: /* 💡 문제 풀이 시뮬레이션 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2023 KOI, 2023 초등부 2차 대회|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1589 1. 불안정한 수열 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== ﻿📄 문제 개요 ===&lt;br /&gt;
N개의 자연수가 일렬로 주어집니다. 이 중에서 원하는 만큼 숫자를 골라 새로운 수열을 만들려고 합니다.&lt;br /&gt;
&lt;br /&gt;
새로 만든 수열은 &#039;&#039;&#039;이웃한 두 숫자의 합&#039;&#039;&#039;이 무조건 &#039;&#039;&#039;홀수&#039;&#039;&#039;여야 합니다. 이를 불안정한 수열이라고 정의합니다.&lt;br /&gt;
&lt;br /&gt;
이 조건을 만족하도록 숫자를 골랐을 때, 수열의 최대 길이를 구해야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
불안정한 수열은 이웃한 두 숫자의 합이 홀수여야 합니다.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; width:70%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:25%;&amp;quot; | 숫자1 !! style=&amp;quot;width:25%;&amp;quot; | 숫자2 !! style=&amp;quot;width:25%;&amp;quot; | 두 수의 합 !! style=&amp;quot;width:25%;&amp;quot; | 불안정 여부&lt;br /&gt;
|-&lt;br /&gt;
| 짝수 || 짝수 || 짝수 || X&lt;br /&gt;
|-&lt;br /&gt;
| 홀수 || 홀수 || 짝수 || X&lt;br /&gt;
|-&lt;br /&gt;
| 짝수 || 홀수 || 홀수 || O&lt;br /&gt;
|-&lt;br /&gt;
| 홀수 || 짝수 || 홀수 || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
﻿﻿위 표와 같이 두 수의 합이 홀수가 되려면 &#039;&#039;&#039;반드시 짝수와 홀수가 번갈아 가며 나와야 합니다.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
우리가 해야할 일은 간단합니다. 주어진 배열을 돌면서 홀짝이 바뀌는 순간을 계속 카운트하면 불안정한 수열을 얻을 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
# 불안정한 수열의 최대 길이를 구해야 하기 때문에 무조건 첫 번째 숫자는 고르고 시작합니다.&lt;br /&gt;
# 다음 숫자들을 하나씩 확인하며, 바로 이전에 고른 숫자와 홀짝이 다를 때만 그 숫자를 고릅니다.&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n = int(input())&lt;br /&gt;
L = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
ans = 1  # 최대 길이를 구하기 위해 첫 번째 숫자는 고르고 시작&lt;br /&gt;
&lt;br /&gt;
for i in range(n - 1):&lt;br /&gt;
    # 내 숫자(L[i])와 나 다음 숫자(L[i+1])의 홀짝성이 다르다면&lt;br /&gt;
    if L[i] % 2 != L[i+1] % 2:&lt;br /&gt;
        ans += 1  # 수열 길이 1 증가&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿수열을 한 바퀴 돌아보면서 나와 내 다음 숫자의 홀짝성이 다른 경우를 찾아보았습니다.&lt;br /&gt;
&lt;br /&gt;
시간복잡도는 O(N)으로 주어진 N의 범위(1 &amp;lt;= N &amp;lt;= 300,000)를 계산하는데 충분합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📊 정답률 ===&lt;br /&gt;
2차에 진출한 초등부 학생들 중 80% 이상이 100점을 받은 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
일단 홀짝성을 비교해야겠다는 생각을 해내었다면 다양한 방법으로 풀이할 수 있는 난이도가 높지 않은 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1629 2. 스케이트 연습 (초2/중1/고1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1670 3. 호숫가의 개미굴 (초3/중2)]&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;4. 고기 파티 (초4/중3)&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2882</id>
		<title>2023 한국정보올림피아드(KOI) 2차 대회 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2882"/>
		<updated>2026-04-25T02:47:02Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2023 KOI, 2023 초등부 2차 대회|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1589 1. 불안정한 수열 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== ﻿📄 문제 개요 ===&lt;br /&gt;
N개의 자연수가 일렬로 주어집니다. 이 중에서 원하는 만큼 숫자를 골라 새로운 수열을 만들려고 합니다.&lt;br /&gt;
&lt;br /&gt;
새로 만든 수열은 &#039;&#039;&#039;이웃한 두 숫자의 합&#039;&#039;&#039;이 무조건 &#039;&#039;&#039;홀수&#039;&#039;&#039;여야 합니다. 이를 불안정한 수열이라고 정의합니다.&lt;br /&gt;
&lt;br /&gt;
이 조건을 만족하도록 숫자를 골랐을 때, 수열의 최대 길이를 구해야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
불안정한 수열은 이웃한 두 숫자의 합이 홀수여야 합니다.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; width:100%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:25%;&amp;quot; | 숫자1 !! style=&amp;quot;width:25%;&amp;quot; | 숫자2 !! style=&amp;quot;width:25%;&amp;quot; | 두 수의 합 !! style=&amp;quot;width:25%;&amp;quot; | 불안정 여부&lt;br /&gt;
|-&lt;br /&gt;
| 짝수 || 짝수 || 짝수 || X&lt;br /&gt;
|-&lt;br /&gt;
| 홀수 || 홀수 || 짝수 || X&lt;br /&gt;
|-&lt;br /&gt;
| 짝수 || 홀수 || 홀수 || O&lt;br /&gt;
|-&lt;br /&gt;
| 홀수 || 짝수 || 홀수 || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
﻿﻿위 표와 같이 두 수의 합이 홀수가 되려면 &#039;&#039;&#039;반드시 짝수와 홀수가 번갈아 가며 나와야 합니다.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
우리가 해야할 일은 간단합니다. 주어진 배열을 돌면서 홀짝이 바뀌는 순간을 계속 카운트하면 불안정한 수열을 얻을 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
# 불안정한 수열의 최대 길이를 구해야 하기 때문에 무조건 첫 번째 숫자는 고르고 시작합니다.&lt;br /&gt;
# 다음 숫자들을 하나씩 확인하며, 바로 이전에 고른 숫자와 홀짝이 다를 때만 그 숫자를 고릅니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n = int(input())&lt;br /&gt;
L = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
ans = 1  # 최대 길이를 구하기 위해 첫 번째 숫자는 고르고 시작&lt;br /&gt;
&lt;br /&gt;
for i in range(n - 1):&lt;br /&gt;
    # 내 숫자(L[i])와 나 다음 숫자(L[i+1])의 홀짝성이 다르다면&lt;br /&gt;
    if L[i] % 2 != L[i+1] % 2:&lt;br /&gt;
        ans += 1  # 수열 길이 1 증가&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿수열을 한 바퀴 돌아보면서 나와 내 다음 숫자의 홀짝성이 다른 경우를 찾아보았습니다.&lt;br /&gt;
&lt;br /&gt;
시간복잡도는 O(N)으로 주어진 N의 범위(1 &amp;lt;= N &amp;lt;= 300,000)를 계산하는데 충분합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📊 정답률 ===&lt;br /&gt;
2차에 진출한 초등부 학생들 중 80% 이상이 100점을 받은 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
일단 홀짝성을 비교해야겠다는 생각을 해내었다면 다양한 방법으로 풀이할 수 있는 난이도가 높지 않은 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1629 2. 스케이트 연습 (초2/중1/고1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1670 3. 호숫가의 개미굴 (초3/중2)]&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;4. 고기 파티 (초4/중3)&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2881</id>
		<title>2023 한국정보올림피아드(KOI) 2차 대회 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2881"/>
		<updated>2026-04-25T02:45:55Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2023 KOI, 2023 초등부 2차 대회|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1589 1. 불안정한 수열 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== ﻿📄 문제 개요 ===&lt;br /&gt;
N개의 자연수가 일렬로 주어집니다. 이 중에서 원하는 만큼 숫자를 골라 새로운 수열을 만들려고 합니다.&lt;br /&gt;
&lt;br /&gt;
새로 만든 수열은 &#039;&#039;&#039;이웃한 두 숫자의 합&#039;&#039;&#039;이 무조건 &#039;&#039;&#039;홀수&#039;&#039;&#039;여야 합니다. 이를 불안정한 수열이라고 정의합니다.&lt;br /&gt;
&lt;br /&gt;
이 조건을 만족하도록 숫자를 골랐을 때, 수열의 최대 길이를 구해야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
불안정한 수열은 이웃한 두 숫자의 합이 홀수여야 합니다.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 숫자1 !! 숫자2 !! 두 수의 합 !! 불안정 여부&lt;br /&gt;
|-&lt;br /&gt;
| 짝수 || 짝수 || 짝수 || X&lt;br /&gt;
|-&lt;br /&gt;
| 홀수 || 홀수 || 짝수 || X&lt;br /&gt;
|-&lt;br /&gt;
| 짝수 || 홀수 || 홀수 || O&lt;br /&gt;
|-&lt;br /&gt;
| 홀수 || 짝수 || 홀수 || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
﻿﻿위 표와 같이 두 수의 합이 홀수가 되려면 &#039;&#039;&#039;반드시 짝수와 홀수가 번갈아 가며 나와야 합니다.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
우리가 해야할 일은 간단합니다. 주어진 배열을 돌면서 홀짝이 바뀌는 순간을 계속 카운트하면 불안정한 수열을 얻을 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
# 불안정한 수열의 최대 길이를 구해야 하기 때문에 무조건 첫 번째 숫자는 고르고 시작합니다.&lt;br /&gt;
# 다음 숫자들을 하나씩 확인하며, 바로 이전에 고른 숫자와 홀짝이 다를 때만 그 숫자를 고릅니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n = int(input())&lt;br /&gt;
L = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
ans = 1  # 최대 길이를 구하기 위해 첫 번째 숫자는 고르고 시작&lt;br /&gt;
&lt;br /&gt;
for i in range(n - 1):&lt;br /&gt;
    # 내 숫자(L[i])와 나 다음 숫자(L[i+1])의 홀짝성이 다르다면&lt;br /&gt;
    if L[i] % 2 != L[i+1] % 2:&lt;br /&gt;
        ans += 1  # 수열 길이 1 증가&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿수열을 한 바퀴 돌아보면서 나와 내 다음 숫자의 홀짝성이 다른 경우를 찾아보았습니다.&lt;br /&gt;
&lt;br /&gt;
시간복잡도는 O(N)으로 주어진 N의 범위(1 &amp;lt;= N &amp;lt;= 300,000)를 계산하는데 충분합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📊 정답률 ===&lt;br /&gt;
2차에 진출한 초등부 학생들 중 80% 이상이 100점을 받은 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
일단 홀짝성을 비교해야겠다는 생각을 해내었다면 다양한 방법으로 풀이할 수 있는 난이도가 높지 않은 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1629 2. 스케이트 연습 (초2/중1/고1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1670 3. 호숫가의 개미굴 (초3/중2)]&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;4. 고기 파티 (초4/중3)&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2880</id>
		<title>2023 한국정보올림피아드(KOI) 2차 대회 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2880"/>
		<updated>2026-04-25T02:45:38Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2023 KOI, 2023 초등부 2차 대회|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1589 1. 불안정한 수열 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== ﻿📄 문제 개요 ===&lt;br /&gt;
N개의 자연수가 일렬로 주어집니다. 이 중에서 원하는 만큼 숫자를 골라 새로운 수열을 만들려고 합니다.&lt;br /&gt;
&lt;br /&gt;
새로 만든 수열은 &#039;&#039;&#039;이웃한 두 숫자의 합&#039;&#039;&#039;이 무조건 &#039;&#039;&#039;홀수&#039;&#039;&#039;여야 합니다. 이를 불안정한 수열이라고 정의합니다.&lt;br /&gt;
&lt;br /&gt;
이 조건을 만족하도록 숫자를 골랐을 때, 수열의 최대 길이를 구해야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
불안정한 수열은 이웃한 두 숫자의 합이 홀수여야 합니다.&lt;br /&gt;
&lt;br /&gt;
﻿{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 숫자1 !! 숫자2 !! 두 수의 합 !! 불안정 여부&lt;br /&gt;
|-&lt;br /&gt;
| 짝수 || 짝수 || 짝수 || X&lt;br /&gt;
|-&lt;br /&gt;
| 홀수 || 홀수 || 짝수 || X&lt;br /&gt;
|-&lt;br /&gt;
| 짝수 || 홀수 || 홀수 || O&lt;br /&gt;
|-&lt;br /&gt;
| 홀수 || 짝수 || 홀수 || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
﻿﻿위 표와 같이 두 수의 합이 홀수가 되려면 &#039;&#039;&#039;반드시 짝수와 홀수가 번갈아 가며 나와야 합니다.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
우리가 해야할 일은 간단합니다. 주어진 배열을 돌면서 홀짝이 바뀌는 순간을 계속 카운트하면 불안정한 수열을 얻을 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
# 불안정한 수열의 최대 길이를 구해야 하기 때문에 무조건 첫 번째 숫자는 고르고 시작합니다.&lt;br /&gt;
# 다음 숫자들을 하나씩 확인하며, 바로 이전에 고른 숫자와 홀짝이 다를 때만 그 숫자를 고릅니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n = int(input())&lt;br /&gt;
L = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
ans = 1  # 최대 길이를 구하기 위해 첫 번째 숫자는 고르고 시작&lt;br /&gt;
&lt;br /&gt;
for i in range(n - 1):&lt;br /&gt;
    # 내 숫자(L[i])와 나 다음 숫자(L[i+1])의 홀짝성이 다르다면&lt;br /&gt;
    if L[i] % 2 != L[i+1] % 2:&lt;br /&gt;
        ans += 1  # 수열 길이 1 증가&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿수열을 한 바퀴 돌아보면서 나와 내 다음 숫자의 홀짝성이 다른 경우를 찾아보았습니다.&lt;br /&gt;
&lt;br /&gt;
시간복잡도는 O(N)으로 주어진 N의 범위(1 &amp;lt;= N &amp;lt;= 300,000)를 계산하는데 충분합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📊 정답률 ===&lt;br /&gt;
2차에 진출한 초등부 학생들 중 80% 이상이 100점을 받은 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
일단 홀짝성을 비교해야겠다는 생각을 해내었다면 다양한 방법으로 풀이할 수 있는 난이도가 높지 않은 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1629 2. 스케이트 연습 (초2/중1/고1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1670 3. 호숫가의 개미굴 (초3/중2)]&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;4. 고기 파티 (초4/중3)&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2879</id>
		<title>2023 한국정보올림피아드(KOI) 2차 대회 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2879"/>
		<updated>2026-04-25T02:44:39Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2023 KOI, 2023 초등부 2차 대회|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1589 1. 불안정한 수열 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== ﻿📄 문제 개요 ===&lt;br /&gt;
N개의 자연수가 일렬로 주어집니다. 이 중에서 원하는 만큼 숫자를 골라 새로운 수열을 만들려고 합니다.&lt;br /&gt;
&lt;br /&gt;
새로 만든 수열은 &#039;&#039;&#039;이웃한 두 숫자의 합&#039;&#039;&#039;이 무조건 &#039;&#039;&#039;홀수&#039;&#039;&#039;여야 합니다. 이를 불안정한 수열이라고 정의합니다.&lt;br /&gt;
&lt;br /&gt;
이 조건을 만족하도록 숫자를 골랐을 때, 수열의 최대 길이를 구해야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
불안정한 수열은 이웃한 두 숫자의 합이 홀수여야 합니다.&lt;br /&gt;
&lt;br /&gt;
﻿{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!숫자1&lt;br /&gt;
!숫자2&lt;br /&gt;
!두 수의 합&lt;br /&gt;
!불안정 여부&lt;br /&gt;
|-&lt;br /&gt;
|짝수&lt;br /&gt;
|홀수&lt;br /&gt;
|짝수&lt;br /&gt;
|홀수&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|오른쪽&lt;br /&gt;
|6 (5+1)&lt;br /&gt;
|꽝&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|왼쪽&lt;br /&gt;
|4 (5-1)&lt;br /&gt;
|꽝&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|오른쪽&lt;br /&gt;
|7 (5+2)&lt;br /&gt;
|꽝&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|왼쪽&lt;br /&gt;
|3 (5-2)&lt;br /&gt;
|꽝&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|오른쪽&lt;br /&gt;
|8 (5+3)&lt;br /&gt;
|꽝&lt;br /&gt;
|-&lt;br /&gt;
|7&lt;br /&gt;
|왼쪽&lt;br /&gt;
|2 (5-3)&lt;br /&gt;
|왼쪽 보물 찾음&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
﻿﻿위 표와 같이 두 수의 합이 홀수가 되려면 &#039;&#039;&#039;반드시 짝수와 홀수가 번갈아 가며 나와야 합니다.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
우리가 해야할 일은 간단합니다. 주어진 배열을 돌면서 홀짝이 바뀌는 순간을 계속 카운트하면 불안정한 수열을 얻을 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
# 불안정한 수열의 최대 길이를 구해야 하기 때문에 무조건 첫 번째 숫자는 고르고 시작합니다.&lt;br /&gt;
# 다음 숫자들을 하나씩 확인하며, 바로 이전에 고른 숫자와 홀짝이 다를 때만 그 숫자를 고릅니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n = int(input())&lt;br /&gt;
L = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
ans = 1  # 최대 길이를 구하기 위해 첫 번째 숫자는 고르고 시작&lt;br /&gt;
&lt;br /&gt;
for i in range(n - 1):&lt;br /&gt;
    # 내 숫자(L[i])와 나 다음 숫자(L[i+1])의 홀짝성이 다르다면&lt;br /&gt;
    if L[i] % 2 != L[i+1] % 2:&lt;br /&gt;
        ans += 1  # 수열 길이 1 증가&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿수열을 한 바퀴 돌아보면서 나와 내 다음 숫자의 홀짝성이 다른 경우를 찾아보았습니다.&lt;br /&gt;
&lt;br /&gt;
시간복잡도는 O(N)으로 주어진 N의 범위(1 &amp;lt;= N &amp;lt;= 300,000)를 계산하는데 충분합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📊 정답률 ===&lt;br /&gt;
2차에 진출한 초등부 학생들 중 80% 이상이 100점을 받은 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
일단 홀짝성을 비교해야겠다는 생각을 해내었다면 다양한 방법으로 풀이할 수 있는 난이도가 높지 않은 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1629 2. 스케이트 연습 (초2/중1/고1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1670 3. 호숫가의 개미굴 (초3/중2)]&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;4. 고기 파티 (초4/중3)&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=%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)&amp;diff=2878</id>
		<title>한국정보올림피아드(KOI)</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=%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)&amp;diff=2878"/>
		<updated>2026-04-25T02:43:31Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: /* KOI 2023 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;KOI 2025&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
=== 1차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* 1교시(사고력 문제 및 비버챌린지 유형) : &#039;&#039;&#039;[[2025 한국정보올림피아드(KOI) 1차 대회 1교시 초등부|초등부]]&#039;&#039;&#039; / &#039;&#039;&#039;[[2025 한국정보올림피아드(KOI) 1교시 1차 대회 중등부|중등부]]&#039;&#039;&#039;&lt;br /&gt;
* 2교시(프로그래밍 실기) : &#039;&#039;&#039;[[2025 한국정보올림피아드(KOI) 1차 대회 2교시 초등부|초등부]]&#039;&#039;&#039; / &#039;&#039;&#039;[[2025 한국정보올림피아드(KOI) 1차 대회 2교시 중등부|중등부]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 2차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* [[2025 한국정보올림피아드(KOI) 2차 대회 초등부|&#039;&#039;&#039;초등부&#039;&#039;&#039;]]&lt;br /&gt;
* &#039;&#039;&#039;[[2025 한국정보올림피아드(KOI) 2차 대회 중등부|중등부]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;KOI 2024&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
=== 1차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* 1교시(사고력 문제 및 비버챌린지 유형) : &#039;&#039;&#039;초등부&#039;&#039;&#039; / &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;br /&gt;
* 2교시(프로그래밍 실기) : &#039;&#039;&#039;[[2024 한국정보올림피아드(KOI) 1차 대회 2교시 초등부|초등부]]&#039;&#039;&#039; / &#039;&#039;&#039;[[2024 한국정보올림피아드(KOI) 1차 대회 2교시 중등부|중등부]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 2차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[[2024 한국정보올림피아드(KOI) 2차 대회 초등부|초등부]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[[2024 한국정보올림피아드(KOI) 2차 대회 중등부|중등부]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;KOI 2023&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
=== 1차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* 1교시(사고력 문제 및 비버챌린지 유형) : &#039;&#039;&#039;초등부&#039;&#039;&#039; / &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;br /&gt;
* 2교시(프로그래밍 실기) : &#039;&#039;&#039;[[2023 한국정보올림피아드(KOI) 1차 대회 2교시 초등부|초등부]]&#039;&#039;&#039; / &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 2차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[[2023 한국정보올림피아드(KOI) 2차 대회 초등부|초등부]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;KOI 2022&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
=== 1차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* 1교시(사고력 문제 및 비버챌린지 유형) : &#039;&#039;&#039;초등부&#039;&#039;&#039; / &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;br /&gt;
* 2교시(프로그래밍 실기) : &#039;&#039;&#039;초등부&#039;&#039;&#039; / &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 2차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;초등부&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;KOI 2021&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
=== 1차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* 1교시(사고력 문제 및 비버챌린지 유형) : &#039;&#039;&#039;초등부&#039;&#039;&#039; / &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;br /&gt;
* 2교시(프로그래밍 실기) : &#039;&#039;&#039;초등부&#039;&#039;&#039; / &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 2차 대회 ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;초등부&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;중등부&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2877</id>
		<title>2023 한국정보올림피아드(KOI) 2차 대회 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2877"/>
		<updated>2026-04-25T02:43:10Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: /* 1. 불안정한 수열 (초1) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2023 KOI, 2023 초등부 2차 대회|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1589 1. 불안정한 수열 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== ﻿📄 문제 개요 ===&lt;br /&gt;
N개의 자연수가 일렬로 주어집니다. 이 중에서 원하는 만큼 숫자를 골라 새로운 수열을 만들려고 합니다.&lt;br /&gt;
&lt;br /&gt;
새로 만든 수열은 &#039;&#039;&#039;이웃한 두 숫자의 합&#039;&#039;&#039;이 무조건 &#039;&#039;&#039;홀수&#039;&#039;&#039;여야 합니다. 이를 불안정한 수열이라고 정의합니다.&lt;br /&gt;
&lt;br /&gt;
이 조건을 만족하도록 숫자를 골랐을 때, 수열의 최대 길이를 구해야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
불안정한 수열은 이웃한 두 숫자의 합이 홀수여야 합니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
﻿﻿위 표와 같이 두 수의 합이 홀수가 되려면 &#039;&#039;&#039;반드시 짝수와 홀수가 번갈아 가며 나와야 합니다.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
우리가 해야할 일은 간단합니다. 주어진 배열을 돌면서 홀짝이 바뀌는 순간을 계속 카운트하면 불안정한 수열을 얻을 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
# 불안정한 수열의 최대 길이를 구해야 하기 때문에 무조건 첫 번째 숫자는 고르고 시작합니다.&lt;br /&gt;
# 다음 숫자들을 하나씩 확인하며, 바로 이전에 고른 숫자와 홀짝이 다를 때만 그 숫자를 고릅니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n = int(input())&lt;br /&gt;
L = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
ans = 1  # 최대 길이를 구하기 위해 첫 번째 숫자는 고르고 시작&lt;br /&gt;
&lt;br /&gt;
for i in range(n - 1):&lt;br /&gt;
    # 내 숫자(L[i])와 나 다음 숫자(L[i+1])의 홀짝성이 다르다면&lt;br /&gt;
    if L[i] % 2 != L[i+1] % 2:&lt;br /&gt;
        ans += 1  # 수열 길이 1 증가&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿수열을 한 바퀴 돌아보면서 나와 내 다음 숫자의 홀짝성이 다른 경우를 찾아보았습니다.&lt;br /&gt;
&lt;br /&gt;
시간복잡도는 O(N)으로 주어진 N의 범위(1 &amp;lt;= N &amp;lt;= 300,000)를 계산하는데 충분합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📊 정답률 ===&lt;br /&gt;
2차에 진출한 초등부 학생들 중 80% 이상이 100점을 받은 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
일단 홀짝성을 비교해야겠다는 생각을 해내었다면 다양한 방법으로 풀이할 수 있는 난이도가 높지 않은 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1629 2. 스케이트 연습 (초2/중1/고1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1670 3. 호숫가의 개미굴 (초3/중2)]&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;4. 고기 파티 (초4/중3)&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2876</id>
		<title>2023 한국정보올림피아드(KOI) 2차 대회 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2876"/>
		<updated>2026-04-25T02:42:57Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: /* 1. 불안정한 수열 (초1) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2023 KOI, 2023 초등부 2차 대회|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1589 1. 불안정한 수열 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
﻿﻿&lt;br /&gt;
&lt;br /&gt;
=== ﻿📄 문제 개요 ===&lt;br /&gt;
N개의 자연수가 일렬로 주어집니다. 이 중에서 원하는 만큼 숫자를 골라 새로운 수열을 만들려고 합니다.&lt;br /&gt;
&lt;br /&gt;
새로 만든 수열은 &#039;&#039;&#039;이웃한 두 숫자의 합&#039;&#039;&#039;이 무조건 &#039;&#039;&#039;홀수&#039;&#039;&#039;여야 합니다. 이를 불안정한 수열이라고 정의합니다.&lt;br /&gt;
&lt;br /&gt;
이 조건을 만족하도록 숫자를 골랐을 때, 수열의 최대 길이를 구해야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
불안정한 수열은 이웃한 두 숫자의 합이 홀수여야 합니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
﻿﻿위 표와 같이 두 수의 합이 홀수가 되려면 &#039;&#039;&#039;반드시 짝수와 홀수가 번갈아 가며 나와야 합니다.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
우리가 해야할 일은 간단합니다. 주어진 배열을 돌면서 홀짝이 바뀌는 순간을 계속 카운트하면 불안정한 수열을 얻을 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
# 불안정한 수열의 최대 길이를 구해야 하기 때문에 무조건 첫 번째 숫자는 고르고 시작합니다.&lt;br /&gt;
# 다음 숫자들을 하나씩 확인하며, 바로 이전에 고른 숫자와 홀짝이 다를 때만 그 숫자를 고릅니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n = int(input())&lt;br /&gt;
L = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
ans = 1  # 최대 길이를 구하기 위해 첫 번째 숫자는 고르고 시작&lt;br /&gt;
&lt;br /&gt;
for i in range(n - 1):&lt;br /&gt;
    # 내 숫자(L[i])와 나 다음 숫자(L[i+1])의 홀짝성이 다르다면&lt;br /&gt;
    if L[i] % 2 != L[i+1] % 2:&lt;br /&gt;
        ans += 1  # 수열 길이 1 증가&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿수열을 한 바퀴 돌아보면서 나와 내 다음 숫자의 홀짝성이 다른 경우를 찾아보았습니다.&lt;br /&gt;
&lt;br /&gt;
시간복잡도는 O(N)으로 주어진 N의 범위(1 &amp;lt;= N &amp;lt;= 300,000)를 계산하는데 충분합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📊 정답률 ===&lt;br /&gt;
2차에 진출한 초등부 학생들 중 80% 이상이 100점을 받은 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
일단 홀짝성을 비교해야겠다는 생각을 해내었다면 다양한 방법으로 풀이할 수 있는 난이도가 높지 않은 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1629 2. 스케이트 연습 (초2/중1/고1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1670 3. 호숫가의 개미굴 (초3/중2)]&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;4. 고기 파티 (초4/중3)&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2875</id>
		<title>2023 한국정보올림피아드(KOI) 2차 대회 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2875"/>
		<updated>2026-04-25T02:42:24Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2023 KOI, 2023 초등부 2차 대회|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1589 1. 불안정한 수열 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
﻿﻿&lt;br /&gt;
&lt;br /&gt;
=== ﻿📄 문제 개요 ===&lt;br /&gt;
N개의 자연수가 일렬로 주어집니다. 이 중에서 원하는 만큼 숫자를 골라 새로운 수열을 만들려고 합니다.&lt;br /&gt;
&lt;br /&gt;
새로 만든 수열은 &#039;&#039;&#039;이웃한 두 숫자의 합&#039;&#039;&#039;이 무조건 &#039;&#039;&#039;홀수&#039;&#039;&#039;여야 합니다. 이를 불안정한 수열이라고 정의합니다.&lt;br /&gt;
&lt;br /&gt;
이 조건을 만족하도록 숫자를 골랐을 때, 수열의 최대 길이를 구해야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
불안정한 수열은 이웃한 두 숫자의 합이 홀수여야 합니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
﻿﻿&lt;br /&gt;
위 표와 같이 두 수의 합이 홀수가 되려면 &#039;&#039;&#039;반드시 짝수와 홀수가 번갈아 가며 나와야 합니다.&#039;&#039;&#039; &lt;br /&gt;
우리가 해야할 일은 간단합니다. 주어진 배열을 돌면서 홀짝이 바뀌는 순간을 계속 카운트하면 불안정한 수열을 얻을 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
# 불안정한 수열의 최대 길이를 구해야 하기 때문에 무조건 첫 번째 숫자는 고르고 시작합니다.&lt;br /&gt;
# 다음 숫자들을 하나씩 확인하며, 바로 이전에 고른 숫자와 홀짝이 다를 때만 그 숫자를 고릅니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n = int(input())&lt;br /&gt;
L = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
ans = 1  # 최대 길이를 구하기 위해 첫 번째 숫자는 고르고 시작&lt;br /&gt;
&lt;br /&gt;
for i in range(n - 1):&lt;br /&gt;
    # 내 숫자(L[i])와 나 다음 숫자(L[i+1])의 홀짝성이 다르다면&lt;br /&gt;
    if L[i] % 2 != L[i+1] % 2:&lt;br /&gt;
        ans += 1  # 수열 길이 1 증가&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿수열을 한 바퀴 돌아보면서 나와 내 다음 숫자의 홀짝성이 다른 경우를 찾아보았습니다.&lt;br /&gt;
&lt;br /&gt;
시간복잡도는 O(N)으로 주어진 N의 범위(1 &amp;lt;= N &amp;lt;= 300,000)를 계산하는데 충분합니다.&lt;br /&gt;
﻿&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== 📊 정답률 ===&lt;br /&gt;
2차에 진출한 초등부 학생들 중 80% 이상이 100점을 받은 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
일단 홀짝성을 비교해야겠다는 생각을 해내었다면 다양한 방법으로 풀이할 수 있는 난이도가 높지 않은 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1629 2. 스케이트 연습 (초2/중1/고1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1670 3. 호숫가의 개미굴 (초3/중2)]&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;4. 고기 파티 (초4/중3)&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2874</id>
		<title>2023 한국정보올림피아드(KOI) 2차 대회 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2874"/>
		<updated>2026-04-25T02:40:55Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2023 KOI, 2023 초등부 2차 대회|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1589 1. 불안정한 수열 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
﻿﻿&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1629 2. 스케이트 연습 (초2/중1/고1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1670 3. 호숫가의 개미굴 (초3/중2)]&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;4. 고기 파티 (초4/중3)&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2873</id>
		<title>2023 한국정보올림피아드(KOI) 2차 대회 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2023_%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)_2%EC%B0%A8_%EB%8C%80%ED%9A%8C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2873"/>
		<updated>2026-04-25T02:38:20Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: 새 문서: {{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2024 KOI, 2024 초등부 2차 대회|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.pn...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2024 KOI, 2024 초등부 2차 대회|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1688 1. 보물찾기 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
﻿﻿📄 문제 개요﻿&lt;br /&gt;
&lt;br /&gt;
﻿다빈이가 무한히 긴 수직선 위에서 보물을 찾는 놀이를 합니다.&lt;br /&gt;
보물은 왼쪽(L)과 오른쪽(R) 두 곳에 숨겨져 있고, 다빈이는 그 사이인 시작 위치(S)에서 출발합니다.&lt;br /&gt;
&lt;br /&gt;
다빈이는 다음과 같은 규칙으로 이동합니다.&lt;br /&gt;
&lt;br /&gt;
[[파일:2024KOI보물찾기1.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
* 1단계: 제자리(S) 조사&lt;br /&gt;
* 2단계: 오른쪽으로 1칸 떨어진 곳(S+1) 조사&lt;br /&gt;
* 3단계: 왼쪽으로 1칸 떨어진 곳(S-1) 조사&lt;br /&gt;
* 4단계: 오른쪽으로 2칸 떨어진 곳(S+2) 조사&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 규칙대로 번갈아 가며 범위를 넓혀갈 때, 왼쪽(L)이나 오른쪽(R) 보물 중 &#039;&#039;&#039;가장 먼저 보물을 찾게 되는 단계&#039;&#039;&#039;를 구하는 문제입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿﻿💡 첫 번째 접근 - 직접 이동해보기 ===&lt;br /&gt;
가장 직관적인 방법은 시작 위치(S)부터 한 단계씩 직접 움직여보면서 L 또는 R에 도착하는 상황을 확인하는 것입니다.&lt;br /&gt;
&lt;br /&gt;
예를 들어 &#039;&#039;&#039;왼쪽 보물이 2(L=2), 오른쪽 보물이 9(R=9)&#039;&#039;&#039;에 있고 &#039;&#039;&#039;다빈이가 5(S=5)에서 출발&#039;&#039;&#039;한다고 가정해 보겠습니다.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!단계&lt;br /&gt;
!이동 방향&lt;br /&gt;
!다빈이의 위치&lt;br /&gt;
!확인 결과&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|제자리&lt;br /&gt;
|5&lt;br /&gt;
|꽝&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|오른쪽&lt;br /&gt;
|6 (5+1)&lt;br /&gt;
|꽝&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|왼쪽&lt;br /&gt;
|4 (5-1)&lt;br /&gt;
|꽝&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|오른쪽&lt;br /&gt;
|7 (5+2)&lt;br /&gt;
|꽝&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|왼쪽&lt;br /&gt;
|3 (5-2)&lt;br /&gt;
|꽝&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|오른쪽&lt;br /&gt;
|8 (5+3)&lt;br /&gt;
|꽝&lt;br /&gt;
|-&lt;br /&gt;
|7&lt;br /&gt;
|왼쪽&lt;br /&gt;
|2 (5-3)&lt;br /&gt;
|왼쪽 보물 찾음&lt;br /&gt;
|}&lt;br /&gt;
이렇게 단계(step)를 1씩 늘려가며 짝수일 때는 오른쪽, 홀수일 때는 왼쪽을 확인하다가,&lt;br /&gt;
&lt;br /&gt;
다빈이의 현재 위치가 L이나 R과 같아지면 반복을 멈추고 단계를 출력합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현 - 하나씩 모두 비교하기 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
input = sys.stdin.readline&lt;br /&gt;
&lt;br /&gt;
t = int(input())&lt;br /&gt;
for _ in range(t):&lt;br /&gt;
    l, r, s = map(int, input().split())&lt;br /&gt;
    &lt;br /&gt;
    step = 1&lt;br /&gt;
    k = 0&lt;br /&gt;
    while True:&lt;br /&gt;
        # step이 짝수면 오른쪽(+k), 홀수면 왼쪽(-k)&lt;br /&gt;
        if step % 2 == 0:&lt;br /&gt;
            pos = s + k&lt;br /&gt;
        else:&lt;br /&gt;
            pos = s - k&lt;br /&gt;
            &lt;br /&gt;
        # 보물을 찾으면 종료&lt;br /&gt;
        if pos == l or pos == r:&lt;br /&gt;
            print(step)&lt;br /&gt;
            break&lt;br /&gt;
            &lt;br /&gt;
        # 다음 단계를 위한 설정&lt;br /&gt;
        step += 1&lt;br /&gt;
        if step % 2 == 0:&lt;br /&gt;
            k += 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿이 방식은 구현이 쉽다는 장점이 있지만, 제약 조건에 따라 보물이 시작점으로부터 1억 칸(100,000,000) 떨어져 있다면&lt;br /&gt;
&lt;br /&gt;
반복문도 수억 번을 돌아야 합니다. 따라서 제한 시간 내에 모든 테스트 케이스를 통과하지 못하고 &#039;&#039;&#039;부분 점수(48점)&#039;&#039;&#039;를 받게 됩니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 두 번째 접근 - 수학적 규칙 찾기 ===&lt;br /&gt;
반복문으로 인한 시간 초과를 피하려면 종이 위에서 다빈이의 이동 패턴을 차분하게 수식으로 전개해 보아야 합니다.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!단계&lt;br /&gt;
!이동 방향&lt;br /&gt;
!다빈이의 위치&lt;br /&gt;
!목표 지점&lt;br /&gt;
|-&lt;br /&gt;
|1(홀수)&lt;br /&gt;
|제자리&lt;br /&gt;
|S&lt;br /&gt;
|d&lt;br /&gt;
|-&lt;br /&gt;
|2(짝수)&lt;br /&gt;
|오른쪽&lt;br /&gt;
|S + 1&lt;br /&gt;
|R(오른쪽 보물)&lt;br /&gt;
|-&lt;br /&gt;
|3(홀수)&lt;br /&gt;
|왼쪽&lt;br /&gt;
|S - 1&lt;br /&gt;
|L(왼쪽 보물)&lt;br /&gt;
|-&lt;br /&gt;
|4(짝수)&lt;br /&gt;
|오른쪽&lt;br /&gt;
|S + 2&lt;br /&gt;
|R(오른쪽 보물)&lt;br /&gt;
|-&lt;br /&gt;
|5(홀수)&lt;br /&gt;
|왼쪽&lt;br /&gt;
|S - 2&lt;br /&gt;
|L(왼쪽 보물)&lt;br /&gt;
|}&lt;br /&gt;
﻿가장 중요한 핵심은 오른쪽, 왼쪽을 번갈아 가며 확인하기 때문에 &#039;&#039;&#039;두 단계를 거쳐야&#039;&#039;&#039; 어느 한 방향으로 한 칸씩 전진이 가능하다는 점입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;오른쪽 보물(R)을 찾는 규칙&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
오른쪽으로 1칸 전진하려면 (오른쪽) 👉 &#039;&#039;&#039;2단계&#039;&#039;&#039; 소요&lt;br /&gt;
&lt;br /&gt;
오른쪽으로 2칸 전진하려면 (오른쪽, 왼쪽, 오른쪽) 👉 &#039;&#039;&#039;4단계&#039;&#039;&#039; 소요&lt;br /&gt;
&lt;br /&gt;
오른쪽으로 떨어진 거리(R - S)를 가기 위해서는 &#039;&#039;&#039;두 단계씩&#039;&#039;&#039; 거쳐야 하므로 거리에 &#039;&#039;&#039;2를 곱하면&#039;&#039;&#039; 됩니다. 👉 &#039;&#039;&#039;수식: 2 * (R - S)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;왼쪽 보물(L)을 찾는 규칙&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
왼쪽으로 1칸 전진하려면 (오른쪽, 왼쪽) 👉 &#039;&#039;&#039;3단계&#039;&#039;&#039; 소요&lt;br /&gt;
&lt;br /&gt;
왼쪽으로 2칸 전진하려면 (오른쪽, 왼쪽, 오른쪽, 왼쪽) 👉 &#039;&#039;&#039;5단계&#039;&#039;&#039; 소요&lt;br /&gt;
&lt;br /&gt;
항상 오른쪽을 먼저 확인한 뒤 왼쪽을 확인하기 때문에 왼쪽으로 떨어진 거리(S - L)에 &#039;&#039;&#039;2를 곱한 뒤, 처음에 썼던 1단계를 더해주면&#039;&#039;&#039; 됩니다.&lt;br /&gt;
&lt;br /&gt;
👉 &#039;&#039;&#039;수식: 2 * (S - L) + 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현 - 카드 번호 처음 등장 위치 메모해두기﻿ ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
t = int(input())&lt;br /&gt;
for i in range(t):&lt;br /&gt;
    l, r, s = map(int, input().split())&lt;br /&gt;
    &lt;br /&gt;
    r_step = 2 * (r - s)  # 오른쪽 보물(R)을 찾는 단계&lt;br /&gt;
    l_step = 2 * (s - l) + 1 # 왼쪽 보물(L)을 찾는 단계&lt;br /&gt;
    &lt;br /&gt;
    # 둘 중 더 빨리 찾는(작은) 단계 출력&lt;br /&gt;
    print(min(r_step, l_step))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿﻿이렇게 수학적인 규칙을 찾아 수식을 잘 생각해내었다면 보물이 아주 멀리있더라도 단 한 번의 사칙연산으로 정답을 구할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
따라서 제한 시간 내에 모든 테스트 케이스를 통과하고 &#039;&#039;&#039;100점&#039;&#039;&#039;을 받을 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📊 정답률 ===&lt;br /&gt;
2차에 진출한 80% 이상의 초등부 학생들이 100점을 받아낸 비교적 난이도가 쉬운 문제였습니다.&lt;br /&gt;
&lt;br /&gt;
100점을 받지 못했더라도 거의 모든 학생들이 48점을 받을 수 있는 풀이는 해낸 모습입니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1689 2. 가로등 (초2/중1/고1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== 📄 문제 개요 ===&lt;br /&gt;
수직선 도로 위에 N개의 가로등이 켜져 있습니다. 도로의 끝은 L로 아주 깁니다.&lt;br /&gt;
&lt;br /&gt;
어떤 위치의 &#039;&#039;&#039;어두운 정도&#039;&#039;&#039;는 그 위치에서 &#039;&#039;&#039;가장 가까운 가로등까지의 거리&#039;&#039;&#039;를 뜻합니다.&lt;br /&gt;
&lt;br /&gt;
[[파일:2024KOI가로등1.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
예를 들어 3, 6번 위치에 가로등이 있다면 그림과 같이 가로등이 있는 위치(p=0)을 시작으로 어두운 정도를 표시하게 됩니다.&lt;br /&gt;
&lt;br /&gt;
0부터 L까지 모든 위치의 어두운 정도를 구했을 때, &#039;&#039;&#039;가장 작은 값부터 K번째로 작은 값&#039;&#039;&#039;까지 차례대로 출력해야 합니다.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== 💡 첫 번째 접근 - 모든 위치 직접 탐색하기 ===&lt;br /&gt;
가장 먼저 떠올릴 수 있는 직관적인 방법은 0부터 L까지 도로 위를 직접 걸어가며, 각 위치마다 모든 가로등과의 거리를 계산해 보는 것입니다.&lt;br /&gt;
&lt;br /&gt;
예를 들어 각 위치(pos)에서 가로등까지의 거리들을 모두 구한 뒤, 그중 가장 짧은 거리가 그 위치의 어두운 정도가 됩니다.&lt;br /&gt;
&lt;br /&gt;
[[파일:2024KOI가로등2.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
﻿﻿이 값들을 리스트에 모아 오름차순으로 정렬한 뒤 앞에서부터 K개를 출력하는 방식입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현 - 모든 위치 직접 탐색하기﻿ ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
input = sys.stdin.readline&lt;br /&gt;
&lt;br /&gt;
l, n, k = map(int, input().split())&lt;br /&gt;
a = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
ans = []&lt;br /&gt;
&lt;br /&gt;
# 0부터 L까지 모든 위치 확인&lt;br /&gt;
for pos in range(l + 1):&lt;br /&gt;
    # 현재 위치에서 모든 가로등과의 거리 중 최솟값(어두운 정도) 찾기&lt;br /&gt;
    m = 1000000000000000000 # 이론상 가능한 최대 거리&lt;br /&gt;
    for i in a:&lt;br /&gt;
        m = min(m, abs(pos - i))&lt;br /&gt;
    ans.append(m)&lt;br /&gt;
&lt;br /&gt;
ans.sort() # 오름차순 정렬&lt;br /&gt;
&lt;br /&gt;
# 가장 어두운 정도가 작은 K개 출력&lt;br /&gt;
for i in range(k):&lt;br /&gt;
    print(ans[i])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿﻿위 코드는 L칸을 일일이 확인하며 N개의 가로등을 매번 비교하므로,&lt;br /&gt;
&lt;br /&gt;
가로등 개수(N)와 도로 길이(L)가 모두 작은 부분문제 2번(N &amp;lt;= 2500, L &amp;lt;= 2500)까지만 무사히 통과하여 &#039;&#039;&#039;20점&#039;&#039;&#039;을 받게 됩니다.&lt;br /&gt;
&lt;br /&gt;
만약 도로 길이가 부분문제 4번(L &amp;lt;= 5,000,000)이나, 사실상 무한하게 커질 수 있는 부분문제 5번의 데이터가 들어오면&lt;br /&gt;
&lt;br /&gt;
이런 방식은 &#039;&#039;&#039;&amp;lt;nowiki/&amp;gt;&#039;시간 초과&#039;&#039;&#039;&#039;가 발생할 수밖에 없습니다. 따라서 100점을 받기 위해서는 탐색 방식을 바꾸어야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 두 번째 접근 - 너비 우선 탐색(BFS)﻿ ===&lt;br /&gt;
﻿우리가 출력해야할 것은 가장 밝은(어두운 정도가 가장 낮은) K개의 값입니다.&lt;br /&gt;
&lt;br /&gt;
따라서 가장 밝은 곳&#039;&#039;&#039;(가로등이 있는 위치)&#039;&#039;&#039;부터 영역을 점점 넓혀나가면서 탐색하는 방법을 생각해봅시다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
잔잔한 호수에 돌멩이를 던졌을 때 퍼져나가는 물결을 상상해봅시다.&lt;br /&gt;
&lt;br /&gt;
가로등이 서 있는 위치를 물결의 중심(거리 0)이라고 생각하고, 양옆으로 동시에 1칸씩 영역을 넓혀가는 겁니다.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;거리 0인 곳:&#039;&#039;&#039; 가로등이 있는 중심 위치들&lt;br /&gt;
# &#039;&#039;&#039;거리 1인 곳:&#039;&#039;&#039; 중심에서 양옆으로 1칸 퍼져나간 위치들&lt;br /&gt;
# &#039;&#039;&#039;거리 2인 곳:&#039;&#039;&#039; 거기서 다시 양옆으로 1칸 더 퍼져나간 위치들&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
도로의 길이와 무관하게 가장 밝은 곳부터 점점 범위를 넓혀나가다가 가장 밝은 K개 값을 찾는 순간 탐색을 종료합니다.&lt;br /&gt;
&lt;br /&gt;
이처럼 가까운 곳부터 동심원처럼 영역을 넓혀가는 방식을 컴퓨터 공학에서는 &#039;&#039;&#039;너비 우선 탐색(BFS)&#039;&#039;&#039;이라고 부릅니다.&lt;br /&gt;
&lt;br /&gt;
[[파일:2024KOI가로등3.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
=== ﻿﻿💻 코드 구현 - 너비 우선 탐색(BFS) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
l, n, k = map(int, input().split())&lt;br /&gt;
# 가로등 위치는 탐색 중 변하지 않으므로, 리스트보다 가볍고 빠른 튜플(tuple) 사용&lt;br /&gt;
a = tuple(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
# 100경 크기의 방문 배열 대신, 밟은 좌표만 세트(set) 활용 (메모리 초과 방지)&lt;br /&gt;
visit = set()&lt;br /&gt;
q = deque()&lt;br /&gt;
&lt;br /&gt;
# 1단계: 초기 가로등 위치들을 어두운 정도(거리) 0으로 큐에 모두 삽입, 방문 처리&lt;br /&gt;
for i in a:&lt;br /&gt;
    q.append((i, 0))&lt;br /&gt;
    visit.add(i)&lt;br /&gt;
&lt;br /&gt;
# 2단계: 딱 K번만 정답을 출력하도록 while 조건 설정&lt;br /&gt;
while k &amp;gt; 0:&lt;br /&gt;
    x, p = q.popleft()  # x: 현재 위치, p: 어두운 정도(거리)&lt;br /&gt;
    &lt;br /&gt;
    # 거리가 짧은 곳부터 순서대로 출력됨&lt;br /&gt;
    print(p)&lt;br /&gt;
    k -= 1  # 정답을 출력할 때마다 목표 개수(K)를 1씩 감소&lt;br /&gt;
    &lt;br /&gt;
    # 3단계: 현재 위치 기준 양옆(왼쪽 1칸, 오른쪽 1칸) 탐색&lt;br /&gt;
    for cx in [(x - 1), (x + 1)]:&lt;br /&gt;
        if 0 &amp;lt;= cx &amp;lt;= l: # 도로 범위(0 ~ L) 안에 포함되고&lt;br /&gt;
            if cx not in visit: # 아직 방문하지 않은 위치라면&lt;br /&gt;
                visit.add(cx) # 방문 처리한 후&lt;br /&gt;
                q.append((cx, b + 1))  # 거리를 1 늘려서 큐에 삽입&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;﻿일반적으로 BFS 코드를 작성할 때, 방문 배열(visit = [False] * (L + 1) 형태)를 활용합니다.&lt;br /&gt;
&lt;br /&gt;
하지만 지금의 경우 &#039;&#039;&#039;L 최대 크기(100경)&#039;&#039;&#039;이 너무 크기 때문에 리스트를 활용하면 &#039;&#039;&#039;메모리 초과&#039;&#039;&#039;가 발생합니다.&lt;br /&gt;
&lt;br /&gt;
그래서 이번에는 set 자료구조를 사용해 우리가 &#039;&#039;&#039;실제로 방문한 좌표만 기록&#039;&#039;&#039;함으로써 메모리 낭비를 최소한으로 처리했습니다.&lt;br /&gt;
&lt;br /&gt;
이렇게 아주 &#039;&#039;&#039;큰 데이터 범위로 인한 몇 가지 함정&#039;&#039;&#039;을 피해서 완성하면, &#039;&#039;&#039;100점&#039;&#039;&#039;을 획득할 수 있습니다.&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;3. 색깔 모으기 (초3/중2)&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;4. 양손에 V (초4)&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2023_%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)_1%EC%B0%A8_%EB%8C%80%ED%9A%8C_2%EA%B5%90%EC%8B%9C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2872</id>
		<title>2023 한국정보올림피아드(KOI) 1차 대회 2교시 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2023_%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)_1%EC%B0%A8_%EB%8C%80%ED%9A%8C_2%EA%B5%90%EC%8B%9C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2872"/>
		<updated>2026-04-21T15:01:37Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: /* 2. 대피소 (초2/고1) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2023 KOI, 2023 초등부 1차 대회 2교시|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1501 1. 크림빵 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== 📄 문제 개요 ===&lt;br /&gt;
KOI 빵집에서 총 N * K개의 빵을 만들었습니다. 이 빵들을 일렬로 늘어놓고 앞에서부터 K개씩 묶어서 판매하려고 합니다.&lt;br /&gt;
&lt;br /&gt;
* 크림이 있는 빵은 1, 크림이 없는 빵은 0으로 표시됩니다.&lt;br /&gt;
* 단, 한 묶음 안에 크림이 없는 빵(0)이 P개 이상 있다면 그 묶음은 불량품으로 간주되어 팔 수 없습니다.&lt;br /&gt;
&lt;br /&gt;
우리는 &#039;&#039;&#039;판매 가능한 빵 묶음의 총 개수&#039;&#039;&#039;를 구해야 합니다.﻿&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
이 문제를 해결하기 위한 핵심은 일렬로 늘어선 데이터를 일정한 간격(K)으로 정확하게 나누어 검사하는 것입니다.&lt;br /&gt;
&lt;br /&gt;
예를 들어 빵이 3개씩 한 묶음(K=3), 크림 없는 빵이 1개 미만이어야 판매 가능하다고 상상해 봅시다.&lt;br /&gt;
&lt;br /&gt;
주어진 빵의 데이터를 &#039;&#039;&#039;K개씩 끊어서&#039;&#039;&#039; &#039;&#039;&#039;크림 없는 빵의 개수&#039;&#039;&#039;를 세어보면 판매가능한 빵 묶음 개수를 확인할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
﻿[[파일:2023KOI크림빵1.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
=== ﻿﻿💻 코드 구현 - K개씩 끊어서 확인하기﻿ ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# N: 묶음 수, K: 묶음당 빵의 수, P: 불량품 기준 개수&lt;br /&gt;
n, k, p = map(int, input().split())&lt;br /&gt;
breads = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
ans = 0&lt;br /&gt;
&lt;br /&gt;
# 0부터 전체 빵 개수(N*K)까지 K칸씩 건너뛰며 묶음의 시작점(i) 설정&lt;br /&gt;
for i in range(0, n * k, k):&lt;br /&gt;
    nocream = 0  # 현재 묶음의 크림 없는 빵(0) 개수를 셀 변수&lt;br /&gt;
    &lt;br /&gt;
    # 시작점(i)부터 i+k 직전까지 빵을 하나씩 검사&lt;br /&gt;
    for j in range(i, i + k):&lt;br /&gt;
        if breads[j] == 0:&lt;br /&gt;
            nocream += 1  # 크림이 없으면 개수 증가&lt;br /&gt;
            &lt;br /&gt;
    # 해당 묶음 안의 불량품이 P개 미만이라면 판매 가능&lt;br /&gt;
    if nocream &amp;lt; p:&lt;br /&gt;
        ans += 1&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
﻿전체 빵을 K개씩 끊어 순회하면서 크림없는 빵의 개수를 세고, 불량 여부를 판단하는 것을 중첩 반복의 형태로 표현했습니다.&lt;br /&gt;
&lt;br /&gt;
이번 문제는 &#039;&#039;&#039;빵의 최대 개수(1 &amp;lt;= N &amp;lt;= 50)&#039;&#039;&#039;가 크지 않기 때문에 이 방법으로 충분히 해결 가능합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿📊 정답률﻿ ===&lt;br /&gt;
[[파일:2023KOI크림빵2.png|center|class=coders70]]&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1500 2. 대피소 (초2/고1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== 📄 문제 개요 ===&lt;br /&gt;
KOI 마을에 N개의 집이 있습니다. 이 중 K개의 집에 대피소를 설치하려고 합니다.&lt;br /&gt;
&lt;br /&gt;
모든 주민의 안전을 위해, 어떤 집에서든 &#039;&#039;&#039;&amp;lt;nowiki/&amp;gt;&#039;가장 가까운 대피소까지의 거리&#039; 중 가장 먼 거리가 최소가 되도록&#039;&#039;&#039; 대피소를 설치해야 합니다.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;두 집 사이의 거리&#039;&#039;&#039;는 가로 차이와 세로 차이를 합한 값으로 계산합니다.&lt;br /&gt;
* 조건을 만족하는 K개의 집을 선택했을 때, &#039;&#039;&#039;대피소와 가장 멀리 떨어진 집과의 최소 거리&#039;&#039;&#039;를 출력해야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
이 문제에서 최적의 위치를 단번에 도출해 내는 수학적 공식이나 모델링을 찾으려 한다면, 오히려 출제 의도에서 벗어날 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
집의 개수(N)는 최대 50개이고, 설치할 대피소(r)는 최대 3개입니다.&lt;br /&gt;
&lt;br /&gt;
50개의 집 중에서 3개의 대피소를 고르는 모든 경우의 수는 &#039;&#039;&#039;50C3&#039;&#039;&#039;으로 고작 &#039;&#039;&#039;19,600가지&#039;&#039;&#039;에 불과합니다.&lt;br /&gt;
&lt;br /&gt;
따라서 복잡한 최적화 알고리즘을 구상할 필요 없이, 19,600가지의 대피소 설치 경우의 수를&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;모두 확인하는 완전 탐색(Brute-Force)&#039;&#039;&#039; 방식으로 접근하는 것이 가장 정확하고 확실한 해결책입니다.&lt;br /&gt;
&lt;br /&gt;
﻿[[파일:2023KOI대피소1.png|center|class=coders100]]&lt;br /&gt;
위와 같이 (1, 5), (3, 0), (3, 3), (6, 12), (8, 9) 위치에 총 5개의 집이 있습니다.&lt;br /&gt;
이 중 &#039;&#039;&#039;(1, 5), (3, 0)&#039;&#039;&#039; 두 집을 대피소로 선정한 상황입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;(1, 5) 위치의 집&#039;&#039;&#039; : 대피소로 선정되었기 때문에 가장 가까운 대피소까지의 거리는 0입니다.&lt;br /&gt;
* &#039;&#039;&#039;(3, 0) 위치의 집&#039;&#039;&#039; : 대피소로 선정되었기 때문에 가장 가까운 대피소까지의 거리는 0입니다.&lt;br /&gt;
* &#039;&#039;&#039;(3, 3) 위치의 집&#039;&#039;&#039; : (1, 5) 대피소까지 거리는 &#039;&#039;&#039;4&#039;&#039;&#039;, (3, 0) 대피소까지 거리는 &#039;&#039;&#039;3&#039;&#039;&#039;이므로 &#039;&#039;&#039;가장 가까운 대피소까지의 거리는 3&#039;&#039;&#039;입니다.&lt;br /&gt;
* &#039;&#039;&#039;(6, 12) 위치의 집&#039;&#039;&#039; : (1, 5) 대피소까지 거리는 &#039;&#039;&#039;12&#039;&#039;&#039;, (3, 0) 대피소까지 거리는 &#039;&#039;&#039;15&#039;&#039;&#039;이므로 &#039;&#039;&#039;가장 가까운 대피소까지의 거리는 12&#039;&#039;&#039;입니다.&lt;br /&gt;
* &#039;&#039;&#039;(8, 9) 위치의 집&#039;&#039;&#039; : (1, 5) 대피소까지 거리는 &#039;&#039;&#039;11&#039;&#039;&#039;, (3, 0) 대피소까지 거리는 &#039;&#039;&#039;14&#039;&#039;&#039;이므로 &#039;&#039;&#039;가장 가까운 대피소까지의 거리는 11&#039;&#039;&#039;입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
따라서 &#039;&#039;&#039;가장 가까운 대피소까지의 거리가 가장 먼 경우&#039;&#039;&#039;는 (6, 12) 위치의 집의 &#039;&#039;&#039;12&#039;&#039;&#039;가 됩니다.&lt;br /&gt;
&lt;br /&gt;
지금 구한 이 값은 경우의 수 하나의 값이고, 모든 경우의 수에서 계산한 후 가장 작은 값을 구해야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
풀이과정을 정리해보면 다음과 같습니다.&lt;br /&gt;
&lt;br /&gt;
① 주어진 N개의 집 중 r개를 대피소로 정합니다.&lt;br /&gt;
&lt;br /&gt;
② 각 집과 대피소 사이 가장 가까운 거리(p)를 구한 후, 그 중 가장 큰 값(k)을 선정합니다.&lt;br /&gt;
&lt;br /&gt;
③ 모든 경우에 대해 위 과정을 반복하여 k 중 가장 작은 값(m)을 구합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현﻿ ===&lt;br /&gt;
﻿&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n, r = map(int, input().split())&lt;br /&gt;
arr = []&lt;br /&gt;
for i in range(n):&lt;br /&gt;
    arr.append(tuple(map(int, input().split())))&lt;br /&gt;
&lt;br /&gt;
n = len(arr)&lt;br /&gt;
data = []         # 현재 선택된 대피소들을 담을 리스트&lt;br /&gt;
m = float(&#039;inf&#039;)  # 최종 정답 (가장 작은 값을 찾기 위해 무한대로 초기화)&lt;br /&gt;
&lt;br /&gt;
# 조합을 직접 만들어내는 재귀함수 (start: 탐색 시작 인덱스, depth: 선택한 대피소 개수)&lt;br /&gt;
def comb(start, depth):&lt;br /&gt;
    global m&lt;br /&gt;
    &lt;br /&gt;
    # r개의 대피소를 모두 골랐다면&lt;br /&gt;
    if depth == r:&lt;br /&gt;
        k = 0  # 현재 대피소 조합에서 가장 멀리 떨어진 집의 거리&lt;br /&gt;
        &lt;br /&gt;
        # 마을의 모든 집(i)에 대해 검사&lt;br /&gt;
        for i in arr:&lt;br /&gt;
            p = float(&#039;inf&#039;)  # 현재 집(i)에서 가장 가까운 대피소까지의 거리&lt;br /&gt;
            &lt;br /&gt;
            # 선택된 대피소(j)들을 하나씩 확인하며 최단 거리 계산&lt;br /&gt;
            for j in data:&lt;br /&gt;
                p = min(p, abs(i[0]-j[0]) + abs(i[1]-j[1]))&lt;br /&gt;
            &lt;br /&gt;
            # 모든 집들 중 가장 대피소와 멀리 떨어진 거리(최댓값) 갱신&lt;br /&gt;
            k = max(k, p)&lt;br /&gt;
            &lt;br /&gt;
        # 이번 조합의 최댓값(k)이 기존의 최소 거리(m)보다 작다면 정답 갱신&lt;br /&gt;
        m = min(m, k)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # 대피소 고르기&lt;br /&gt;
    for i in range(start, n):&lt;br /&gt;
        data.append(arr[i])      # 1. 대피소 선택&lt;br /&gt;
        comb(i + 1, depth + 1)   # 2. 다음 대피소 고르러 재귀 호출&lt;br /&gt;
        data.pop()               # 3. 탐색 완료 후 빼내고 다른 집 선택&lt;br /&gt;
&lt;br /&gt;
comb(0, 0)&lt;br /&gt;
print(m)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;1. 알고리즘 문제 풀이 요령&#039;&#039;&#039; ====&lt;br /&gt;
이번 문제 뿐만 아니라 알고리즘을 설계할 때 가장 먼저 확인할 것이 입력 데이터의 크기와 제한시간입니다.&lt;br /&gt;
&lt;br /&gt;
집의 개수(N)의 최대값이 50으로 굉장히 작은데도 불구하고, 문제의 시간제한이 4초로 아주 크게 주어졌습니다.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;입력 데이터의 크기와 시간 제한&#039;&#039;&#039;은 이렇게 &#039;&#039;&#039;완전 탐색을 암시하는 힌트&#039;&#039;&#039;가 될 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
알고리즘 설계 방향에 이를 반영하되, 문제에 따라 예외 상황이 있을 수 있기 때문에 올바른 판단을 위해 많은 문제 풀이 경험이 필요하겠습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;2. 재귀함수를 활용한 조합 구현&#039;&#039;&#039; ====&lt;br /&gt;
combinations  라이브러리를 활용할 수도 있지만, 재귀함수를 활용해 직접 조합을 구현했습니다.&lt;br /&gt;
&lt;br /&gt;
조합 라이브러리가 구현되어있지 않는 프로그래밍 언어를 사용하거나 라이브러리 사용이 제한적인 상황에서 문제를 잘 풀어내려면&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;순열/조합&#039;&#039;&#039;과 같은 중요한 개념은 이렇게 직접 구현하는 연습도 해보면 좋겠습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿📊 정답률﻿ ===&lt;br /&gt;
[[파일:2023KOI대피소2.png|center|class=coders70]]&lt;br /&gt;
&lt;br /&gt;
[[파일:2023KOI대피소3.png|center|class=coders70]]&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;3. 아이템 획득 (초3)&#039;&#039;&#039; ==&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2023_%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)_1%EC%B0%A8_%EB%8C%80%ED%9A%8C_2%EA%B5%90%EC%8B%9C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2871</id>
		<title>2023 한국정보올림피아드(KOI) 1차 대회 2교시 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2023_%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)_1%EC%B0%A8_%EB%8C%80%ED%9A%8C_2%EA%B5%90%EC%8B%9C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2871"/>
		<updated>2026-04-21T15:00:39Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: /* ﻿=== 📄 문제 개요 === */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2023 KOI, 2023 초등부 1차 대회 2교시|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1501 1. 크림빵 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== 📄 문제 개요 ===&lt;br /&gt;
KOI 빵집에서 총 N * K개의 빵을 만들었습니다. 이 빵들을 일렬로 늘어놓고 앞에서부터 K개씩 묶어서 판매하려고 합니다.&lt;br /&gt;
&lt;br /&gt;
* 크림이 있는 빵은 1, 크림이 없는 빵은 0으로 표시됩니다.&lt;br /&gt;
* 단, 한 묶음 안에 크림이 없는 빵(0)이 P개 이상 있다면 그 묶음은 불량품으로 간주되어 팔 수 없습니다.&lt;br /&gt;
&lt;br /&gt;
우리는 &#039;&#039;&#039;판매 가능한 빵 묶음의 총 개수&#039;&#039;&#039;를 구해야 합니다.﻿&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
이 문제를 해결하기 위한 핵심은 일렬로 늘어선 데이터를 일정한 간격(K)으로 정확하게 나누어 검사하는 것입니다.&lt;br /&gt;
&lt;br /&gt;
예를 들어 빵이 3개씩 한 묶음(K=3), 크림 없는 빵이 1개 미만이어야 판매 가능하다고 상상해 봅시다.&lt;br /&gt;
&lt;br /&gt;
주어진 빵의 데이터를 &#039;&#039;&#039;K개씩 끊어서&#039;&#039;&#039; &#039;&#039;&#039;크림 없는 빵의 개수&#039;&#039;&#039;를 세어보면 판매가능한 빵 묶음 개수를 확인할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
﻿[[파일:2023KOI크림빵1.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
=== ﻿﻿💻 코드 구현 - K개씩 끊어서 확인하기﻿ ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# N: 묶음 수, K: 묶음당 빵의 수, P: 불량품 기준 개수&lt;br /&gt;
n, k, p = map(int, input().split())&lt;br /&gt;
breads = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
ans = 0&lt;br /&gt;
&lt;br /&gt;
# 0부터 전체 빵 개수(N*K)까지 K칸씩 건너뛰며 묶음의 시작점(i) 설정&lt;br /&gt;
for i in range(0, n * k, k):&lt;br /&gt;
    nocream = 0  # 현재 묶음의 크림 없는 빵(0) 개수를 셀 변수&lt;br /&gt;
    &lt;br /&gt;
    # 시작점(i)부터 i+k 직전까지 빵을 하나씩 검사&lt;br /&gt;
    for j in range(i, i + k):&lt;br /&gt;
        if breads[j] == 0:&lt;br /&gt;
            nocream += 1  # 크림이 없으면 개수 증가&lt;br /&gt;
            &lt;br /&gt;
    # 해당 묶음 안의 불량품이 P개 미만이라면 판매 가능&lt;br /&gt;
    if nocream &amp;lt; p:&lt;br /&gt;
        ans += 1&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
﻿전체 빵을 K개씩 끊어 순회하면서 크림없는 빵의 개수를 세고, 불량 여부를 판단하는 것을 중첩 반복의 형태로 표현했습니다.&lt;br /&gt;
&lt;br /&gt;
이번 문제는 &#039;&#039;&#039;빵의 최대 개수(1 &amp;lt;= N &amp;lt;= 50)&#039;&#039;&#039;가 크지 않기 때문에 이 방법으로 충분히 해결 가능합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿📊 정답률﻿ ===&lt;br /&gt;
[[파일:2023KOI크림빵2.png|center|class=coders70]]&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1500 2. 대피소 (초2/고1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== 📄 문제 개요 ===&lt;br /&gt;
KOI 마을에 N개의 집이 있습니다. 이 중 K개의 집에 대피소를 설치하려고 합니다.&lt;br /&gt;
&lt;br /&gt;
모든 주민의 안전을 위해, 어떤 집에서든 &#039;&#039;&#039;&amp;lt;nowiki/&amp;gt;&#039;가장 가까운 대피소까지의 거리&#039; 중 가장 먼 거리가 최소가 되도록&#039;&#039;&#039; 대피소를 설치해야 합니다.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;두 집 사이의 거리&#039;&#039;&#039;는 가로 차이와 세로 차이를 합한 값으로 계산합니다.&lt;br /&gt;
* 조건을 만족하는 K개의 집을 선택했을 때, &#039;&#039;&#039;대피소와 가장 멀리 떨어진 집과의 최소 거리&#039;&#039;&#039;를 출력해야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
이 문제에서 최적의 위치를 단번에 도출해 내는 수학적 공식이나 모델링을 찾으려 한다면, 오히려 출제 의도에서 벗어날 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
집의 개수(N)는 최대 50개이고, 설치할 대피소(r)는 최대 3개입니다.&lt;br /&gt;
&lt;br /&gt;
50개의 집 중에서 3개의 대피소를 고르는 모든 경우의 수는 &#039;&#039;&#039;50C3&#039;&#039;&#039;으로 고작 &#039;&#039;&#039;19,600가지&#039;&#039;&#039;에 불과합니다.&lt;br /&gt;
&lt;br /&gt;
따라서 복잡한 최적화 알고리즘을 구상할 필요 없이, 19,600가지의 대피소 설치 경우의 수를&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;모두 확인하는 완전 탐색(Brute-Force)&#039;&#039;&#039; 방식으로 접근하는 것이 가장 정확하고 확실한 해결책입니다.&lt;br /&gt;
&lt;br /&gt;
﻿[[파일:2023KOI대피소1.png|center|class=coders100]]&lt;br /&gt;
위와 같이 (1, 5), (3, 0), (3, 3), (6, 12), (8, 9) 위치에 총 5개의 집이 있습니다.&lt;br /&gt;
이 중 &#039;&#039;&#039;(1, 5), (3, 0)&#039;&#039;&#039; 두 집을 대피소로 선정한 상황입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;(1, 5) 위치의 집&#039;&#039;&#039; : 대피소로 선정되었기 때문에 가장 가까운 대피소까지의 거리는 0입니다.&lt;br /&gt;
* &#039;&#039;&#039;(3, 0) 위치의 집&#039;&#039;&#039; : 대피소로 선정되었기 때문에 가장 가까운 대피소까지의 거리는 0입니다.&lt;br /&gt;
* &#039;&#039;&#039;(3, 3) 위치의 집&#039;&#039;&#039; : (1, 5) 대피소까지 거리는 &#039;&#039;&#039;4&#039;&#039;&#039;, (3, 0) 대피소까지 거리는 &#039;&#039;&#039;3&#039;&#039;&#039;이므로 &#039;&#039;&#039;가장 가까운 대피소까지의 거리는 3&#039;&#039;&#039;입니다.&lt;br /&gt;
* &#039;&#039;&#039;(6, 12) 위치의 집&#039;&#039;&#039; : (1, 5) 대피소까지 거리는 &#039;&#039;&#039;12&#039;&#039;&#039;, (3, 0) 대피소까지 거리는 &#039;&#039;&#039;15&#039;&#039;&#039;이므로 &#039;&#039;&#039;가장 가까운 대피소까지의 거리는 12&#039;&#039;&#039;입니다.&lt;br /&gt;
* &#039;&#039;&#039;(8, 9) 위치의 집&#039;&#039;&#039; : (1, 5) 대피소까지 거리는 &#039;&#039;&#039;11&#039;&#039;&#039;, (3, 0) 대피소까지 거리는 &#039;&#039;&#039;14&#039;&#039;&#039;이므로 &#039;&#039;&#039;가장 가까운 대피소까지의 거리는 11&#039;&#039;&#039;입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
따라서 &#039;&#039;&#039;가장 가까운 대피소까지의 거리가 가장 먼 경우&#039;&#039;&#039;는 (6, 12) 위치의 집의 &#039;&#039;&#039;12&#039;&#039;&#039;가 됩니다.&lt;br /&gt;
&lt;br /&gt;
지금 구한 이 값은 경우의 수 하나의 값이고, 모든 경우의 수에서 계산한 후 가장 작은 값을 구해야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
풀이과정을 정리해보면 다음과 같습니다.&lt;br /&gt;
&lt;br /&gt;
① 주어진 N개의 집 중 r개를 대피소로 정합니다.&lt;br /&gt;
&lt;br /&gt;
② 각 집과 대피소 사이 가장 가까운 거리(p)를 구한 후, 그 중 가장 큰 값(k)을 선정합니다.&lt;br /&gt;
&lt;br /&gt;
③ 모든 경우에 대해 위 과정을 반복하여 k 중 가장 작은 값(m)을 구합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현﻿ ===&lt;br /&gt;
﻿&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n, r = map(int, input().split())&lt;br /&gt;
arr = []&lt;br /&gt;
for i in range(n):&lt;br /&gt;
    arr.append(tuple(map(int, input().split())))&lt;br /&gt;
&lt;br /&gt;
n = len(arr)&lt;br /&gt;
data = []         # 현재 선택된 대피소들을 담을 리스트&lt;br /&gt;
m = float(&#039;inf&#039;)  # 최종 정답 (가장 작은 값을 찾기 위해 무한대로 초기화)&lt;br /&gt;
&lt;br /&gt;
# 조합을 직접 만들어내는 재귀함수 (start: 탐색 시작 인덱스, depth: 선택한 대피소 개수)&lt;br /&gt;
def comb(start, depth):&lt;br /&gt;
    global m&lt;br /&gt;
    &lt;br /&gt;
    # r개의 대피소를 모두 골랐다면&lt;br /&gt;
    if depth == r:&lt;br /&gt;
        k = 0  # 현재 대피소 조합에서 가장 멀리 떨어진 집의 거리&lt;br /&gt;
        &lt;br /&gt;
        # 마을의 모든 집(i)에 대해 검사&lt;br /&gt;
        for i in arr:&lt;br /&gt;
            p = float(&#039;inf&#039;)  # 현재 집(i)에서 가장 가까운 대피소까지의 거리&lt;br /&gt;
            &lt;br /&gt;
            # 선택된 대피소(j)들을 하나씩 확인하며 최단 거리 계산&lt;br /&gt;
            for j in data:&lt;br /&gt;
                p = min(p, abs(i[0]-j[0]) + abs(i[1]-j[1]))&lt;br /&gt;
            &lt;br /&gt;
            # 모든 집들 중 가장 대피소와 멀리 떨어진 거리(최댓값) 갱신&lt;br /&gt;
            k = max(k, p)&lt;br /&gt;
            &lt;br /&gt;
        # 이번 조합의 최댓값(k)이 기존의 최소 거리(m)보다 작다면 정답 갱신&lt;br /&gt;
        m = min(m, k)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # 대피소 고르기&lt;br /&gt;
    for i in range(start, n):&lt;br /&gt;
        data.append(arr[i])      # 1. 대피소 선택&lt;br /&gt;
        comb(i + 1, depth + 1)   # 2. 다음 대피소 고르러 재귀 호출&lt;br /&gt;
        data.pop()               # 3. 탐색 완료 후 빼내고 다른 집 선택&lt;br /&gt;
&lt;br /&gt;
comb(0, 0)&lt;br /&gt;
print(m)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;1. 알고리즘 문제 풀이 요령&#039;&#039;&#039; ====&lt;br /&gt;
이번 문제 뿐만 아니라 알고리즘을 설계할 때 가장 먼저 확인할 것이 입력 데이터의 크기와 제한시간입니다.&lt;br /&gt;
&lt;br /&gt;
집의 개수(N)의 최대값이 50으로 굉장히 작은데도 불구하고, 문제의 시간제한이 4초로 아주 크게 주어졌습니다.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;입력 데이터의 크기와 시간 제한&#039;&#039;&#039;은 이렇게 &#039;&#039;&#039;완전 탐색을 암시하는 힌트&#039;&#039;&#039;가 될 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
알고리즘 설계 방향에 이를 반영하되, 문제에 따라 예외 상황이 있을 수 있기 때문에 올바른 판단을 위해 많은 문제 풀이 경험이 필요하겠습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;2. 재귀함수를 활용한 조합 구현&#039;&#039;&#039; ====&lt;br /&gt;
combinations  라이브러리를 활용할 수도 있지만, 재귀함수를 활용해 직접 조합을 구현했습니다.&lt;br /&gt;
&lt;br /&gt;
조합 라이브러리가 구현되어있지 않는 프로그래밍 언어를 사용하거나 라이브러리 사용이 제한적인 상황에서 문제를 잘 풀어내려면&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;순열/조합&#039;&#039;&#039;과 같은 중요한 개념은 이렇게 직접 구현하는 연습도 해보면 좋겠습니다.&lt;br /&gt;
&lt;br /&gt;
=== ﻿ ﻿📊 정답률﻿ ===&lt;br /&gt;
[[파일:2023KOI대피소2.png|center|class=coders70]]&lt;br /&gt;
&lt;br /&gt;
[[파일:2023KOI대피소3.png|center|class=coders70]]&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;3. 아이템 획득 (초3)&#039;&#039;&#039; ==&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2023_%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)_1%EC%B0%A8_%EB%8C%80%ED%9A%8C_2%EA%B5%90%EC%8B%9C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2870</id>
		<title>2023 한국정보올림피아드(KOI) 1차 대회 2교시 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2023_%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)_1%EC%B0%A8_%EB%8C%80%ED%9A%8C_2%EA%B5%90%EC%8B%9C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2870"/>
		<updated>2026-04-21T15:00:04Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: /* 2. 대피소 (초2/고1) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2023 KOI, 2023 초등부 1차 대회 2교시|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1501 1. 크림빵 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== 📄 문제 개요 ===&lt;br /&gt;
KOI 빵집에서 총 N * K개의 빵을 만들었습니다. 이 빵들을 일렬로 늘어놓고 앞에서부터 K개씩 묶어서 판매하려고 합니다.&lt;br /&gt;
&lt;br /&gt;
* 크림이 있는 빵은 1, 크림이 없는 빵은 0으로 표시됩니다.&lt;br /&gt;
* 단, 한 묶음 안에 크림이 없는 빵(0)이 P개 이상 있다면 그 묶음은 불량품으로 간주되어 팔 수 없습니다.&lt;br /&gt;
&lt;br /&gt;
우리는 &#039;&#039;&#039;판매 가능한 빵 묶음의 총 개수&#039;&#039;&#039;를 구해야 합니다.﻿&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
이 문제를 해결하기 위한 핵심은 일렬로 늘어선 데이터를 일정한 간격(K)으로 정확하게 나누어 검사하는 것입니다.&lt;br /&gt;
&lt;br /&gt;
예를 들어 빵이 3개씩 한 묶음(K=3), 크림 없는 빵이 1개 미만이어야 판매 가능하다고 상상해 봅시다.&lt;br /&gt;
&lt;br /&gt;
주어진 빵의 데이터를 &#039;&#039;&#039;K개씩 끊어서&#039;&#039;&#039; &#039;&#039;&#039;크림 없는 빵의 개수&#039;&#039;&#039;를 세어보면 판매가능한 빵 묶음 개수를 확인할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
﻿[[파일:2023KOI크림빵1.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
=== ﻿﻿💻 코드 구현 - K개씩 끊어서 확인하기﻿ ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# N: 묶음 수, K: 묶음당 빵의 수, P: 불량품 기준 개수&lt;br /&gt;
n, k, p = map(int, input().split())&lt;br /&gt;
breads = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
ans = 0&lt;br /&gt;
&lt;br /&gt;
# 0부터 전체 빵 개수(N*K)까지 K칸씩 건너뛰며 묶음의 시작점(i) 설정&lt;br /&gt;
for i in range(0, n * k, k):&lt;br /&gt;
    nocream = 0  # 현재 묶음의 크림 없는 빵(0) 개수를 셀 변수&lt;br /&gt;
    &lt;br /&gt;
    # 시작점(i)부터 i+k 직전까지 빵을 하나씩 검사&lt;br /&gt;
    for j in range(i, i + k):&lt;br /&gt;
        if breads[j] == 0:&lt;br /&gt;
            nocream += 1  # 크림이 없으면 개수 증가&lt;br /&gt;
            &lt;br /&gt;
    # 해당 묶음 안의 불량품이 P개 미만이라면 판매 가능&lt;br /&gt;
    if nocream &amp;lt; p:&lt;br /&gt;
        ans += 1&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
﻿전체 빵을 K개씩 끊어 순회하면서 크림없는 빵의 개수를 세고, 불량 여부를 판단하는 것을 중첩 반복의 형태로 표현했습니다.&lt;br /&gt;
&lt;br /&gt;
이번 문제는 &#039;&#039;&#039;빵의 최대 개수(1 &amp;lt;= N &amp;lt;= 50)&#039;&#039;&#039;가 크지 않기 때문에 이 방법으로 충분히 해결 가능합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿📊 정답률﻿ ===&lt;br /&gt;
[[파일:2023KOI크림빵2.png|center|class=coders70]]&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1500 2. 대피소 (초2/고1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== ﻿=== 📄 문제 개요 === ===&lt;br /&gt;
KOI 마을에 N개의 집이 있습니다. 이 중 K개의 집에 대피소를 설치하려고 합니다.&lt;br /&gt;
&lt;br /&gt;
모든 주민의 안전을 위해, 어떤 집에서든 &#039;&#039;&#039;&amp;lt;nowiki/&amp;gt;&#039;가장 가까운 대피소까지의 거리&#039; 중 가장 먼 거리가 최소가 되도록&#039;&#039;&#039; 대피소를 설치해야 합니다.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;두 집 사이의 거리&#039;&#039;&#039;는 가로 차이와 세로 차이를 합한 값으로 계산합니다.&lt;br /&gt;
* 조건을 만족하는 K개의 집을 선택했을 때, &#039;&#039;&#039;대피소와 가장 멀리 떨어진 집과의 최소 거리&#039;&#039;&#039;를 출력해야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
이 문제에서 최적의 위치를 단번에 도출해 내는 수학적 공식이나 모델링을 찾으려 한다면, 오히려 출제 의도에서 벗어날 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
집의 개수(N)는 최대 50개이고, 설치할 대피소(r)는 최대 3개입니다.&lt;br /&gt;
&lt;br /&gt;
50개의 집 중에서 3개의 대피소를 고르는 모든 경우의 수는 &#039;&#039;&#039;50C3&#039;&#039;&#039;으로 고작 &#039;&#039;&#039;19,600가지&#039;&#039;&#039;에 불과합니다.&lt;br /&gt;
&lt;br /&gt;
따라서 복잡한 최적화 알고리즘을 구상할 필요 없이, 19,600가지의 대피소 설치 경우의 수를&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;모두 확인하는 완전 탐색(Brute-Force)&#039;&#039;&#039; 방식으로 접근하는 것이 가장 정확하고 확실한 해결책입니다.&lt;br /&gt;
&lt;br /&gt;
﻿[[파일:2023KOI대피소1.png|center|class=coders100]]&lt;br /&gt;
위와 같이 (1, 5), (3, 0), (3, 3), (6, 12), (8, 9) 위치에 총 5개의 집이 있습니다.&lt;br /&gt;
이 중 &#039;&#039;&#039;(1, 5), (3, 0)&#039;&#039;&#039; 두 집을 대피소로 선정한 상황입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;(1, 5) 위치의 집&#039;&#039;&#039; : 대피소로 선정되었기 때문에 가장 가까운 대피소까지의 거리는 0입니다.&lt;br /&gt;
* &#039;&#039;&#039;(3, 0) 위치의 집&#039;&#039;&#039; : 대피소로 선정되었기 때문에 가장 가까운 대피소까지의 거리는 0입니다.&lt;br /&gt;
* &#039;&#039;&#039;(3, 3) 위치의 집&#039;&#039;&#039; : (1, 5) 대피소까지 거리는 &#039;&#039;&#039;4&#039;&#039;&#039;, (3, 0) 대피소까지 거리는 &#039;&#039;&#039;3&#039;&#039;&#039;이므로 &#039;&#039;&#039;가장 가까운 대피소까지의 거리는 3&#039;&#039;&#039;입니다.&lt;br /&gt;
* &#039;&#039;&#039;(6, 12) 위치의 집&#039;&#039;&#039; : (1, 5) 대피소까지 거리는 &#039;&#039;&#039;12&#039;&#039;&#039;, (3, 0) 대피소까지 거리는 &#039;&#039;&#039;15&#039;&#039;&#039;이므로 &#039;&#039;&#039;가장 가까운 대피소까지의 거리는 12&#039;&#039;&#039;입니다.&lt;br /&gt;
* &#039;&#039;&#039;(8, 9) 위치의 집&#039;&#039;&#039; : (1, 5) 대피소까지 거리는 &#039;&#039;&#039;11&#039;&#039;&#039;, (3, 0) 대피소까지 거리는 &#039;&#039;&#039;14&#039;&#039;&#039;이므로 &#039;&#039;&#039;가장 가까운 대피소까지의 거리는 11&#039;&#039;&#039;입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
따라서 &#039;&#039;&#039;가장 가까운 대피소까지의 거리가 가장 먼 경우&#039;&#039;&#039;는 (6, 12) 위치의 집의 &#039;&#039;&#039;12&#039;&#039;&#039;가 됩니다.&lt;br /&gt;
&lt;br /&gt;
지금 구한 이 값은 경우의 수 하나의 값이고, 모든 경우의 수에서 계산한 후 가장 작은 값을 구해야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
풀이과정을 정리해보면 다음과 같습니다.&lt;br /&gt;
&lt;br /&gt;
① 주어진 N개의 집 중 r개를 대피소로 정합니다.&lt;br /&gt;
&lt;br /&gt;
② 각 집과 대피소 사이 가장 가까운 거리(p)를 구한 후, 그 중 가장 큰 값(k)을 선정합니다.&lt;br /&gt;
&lt;br /&gt;
③ 모든 경우에 대해 위 과정을 반복하여 k 중 가장 작은 값(m)을 구합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현﻿ ===&lt;br /&gt;
﻿&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n, r = map(int, input().split())&lt;br /&gt;
arr = []&lt;br /&gt;
for i in range(n):&lt;br /&gt;
    arr.append(tuple(map(int, input().split())))&lt;br /&gt;
&lt;br /&gt;
n = len(arr)&lt;br /&gt;
data = []         # 현재 선택된 대피소들을 담을 리스트&lt;br /&gt;
m = float(&#039;inf&#039;)  # 최종 정답 (가장 작은 값을 찾기 위해 무한대로 초기화)&lt;br /&gt;
&lt;br /&gt;
# 조합을 직접 만들어내는 재귀함수 (start: 탐색 시작 인덱스, depth: 선택한 대피소 개수)&lt;br /&gt;
def comb(start, depth):&lt;br /&gt;
    global m&lt;br /&gt;
    &lt;br /&gt;
    # r개의 대피소를 모두 골랐다면&lt;br /&gt;
    if depth == r:&lt;br /&gt;
        k = 0  # 현재 대피소 조합에서 가장 멀리 떨어진 집의 거리&lt;br /&gt;
        &lt;br /&gt;
        # 마을의 모든 집(i)에 대해 검사&lt;br /&gt;
        for i in arr:&lt;br /&gt;
            p = float(&#039;inf&#039;)  # 현재 집(i)에서 가장 가까운 대피소까지의 거리&lt;br /&gt;
            &lt;br /&gt;
            # 선택된 대피소(j)들을 하나씩 확인하며 최단 거리 계산&lt;br /&gt;
            for j in data:&lt;br /&gt;
                p = min(p, abs(i[0]-j[0]) + abs(i[1]-j[1]))&lt;br /&gt;
            &lt;br /&gt;
            # 모든 집들 중 가장 대피소와 멀리 떨어진 거리(최댓값) 갱신&lt;br /&gt;
            k = max(k, p)&lt;br /&gt;
            &lt;br /&gt;
        # 이번 조합의 최댓값(k)이 기존의 최소 거리(m)보다 작다면 정답 갱신&lt;br /&gt;
        m = min(m, k)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # 대피소 고르기&lt;br /&gt;
    for i in range(start, n):&lt;br /&gt;
        data.append(arr[i])      # 1. 대피소 선택&lt;br /&gt;
        comb(i + 1, depth + 1)   # 2. 다음 대피소 고르러 재귀 호출&lt;br /&gt;
        data.pop()               # 3. 탐색 완료 후 빼내고 다른 집 선택&lt;br /&gt;
&lt;br /&gt;
comb(0, 0)&lt;br /&gt;
print(m)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;1. 알고리즘 문제 풀이 요령&#039;&#039;&#039; ====&lt;br /&gt;
이번 문제 뿐만 아니라 알고리즘을 설계할 때 가장 먼저 확인할 것이 입력 데이터의 크기와 제한시간입니다.&lt;br /&gt;
&lt;br /&gt;
집의 개수(N)의 최대값이 50으로 굉장히 작은데도 불구하고, 문제의 시간제한이 4초로 아주 크게 주어졌습니다.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;입력 데이터의 크기와 시간 제한&#039;&#039;&#039;은 이렇게 &#039;&#039;&#039;완전 탐색을 암시하는 힌트&#039;&#039;&#039;가 될 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
알고리즘 설계 방향에 이를 반영하되, 문제에 따라 예외 상황이 있을 수 있기 때문에 올바른 판단을 위해 많은 문제 풀이 경험이 필요하겠습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;2. 재귀함수를 활용한 조합 구현&#039;&#039;&#039; ====&lt;br /&gt;
combinations  라이브러리를 활용할 수도 있지만, 재귀함수를 활용해 직접 조합을 구현했습니다.&lt;br /&gt;
&lt;br /&gt;
조합 라이브러리가 구현되어있지 않는 프로그래밍 언어를 사용하거나 라이브러리 사용이 제한적인 상황에서 문제를 잘 풀어내려면&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;순열/조합&#039;&#039;&#039;과 같은 중요한 개념은 이렇게 직접 구현하는 연습도 해보면 좋겠습니다.&lt;br /&gt;
&lt;br /&gt;
=== ﻿ ﻿📊 정답률﻿ ===&lt;br /&gt;
[[파일:2023KOI대피소2.png|center|class=coders70]]&lt;br /&gt;
&lt;br /&gt;
[[파일:2023KOI대피소3.png|center|class=coders70]]&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;3. 아이템 획득 (초3)&#039;&#039;&#039; ==&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2023_%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)_1%EC%B0%A8_%EB%8C%80%ED%9A%8C_2%EA%B5%90%EC%8B%9C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2869</id>
		<title>2023 한국정보올림피아드(KOI) 1차 대회 2교시 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2023_%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)_1%EC%B0%A8_%EB%8C%80%ED%9A%8C_2%EA%B5%90%EC%8B%9C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2869"/>
		<updated>2026-04-21T14:59:43Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2023 KOI, 2023 초등부 1차 대회 2교시|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1501 1. 크림빵 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== 📄 문제 개요 ===&lt;br /&gt;
KOI 빵집에서 총 N * K개의 빵을 만들었습니다. 이 빵들을 일렬로 늘어놓고 앞에서부터 K개씩 묶어서 판매하려고 합니다.&lt;br /&gt;
&lt;br /&gt;
* 크림이 있는 빵은 1, 크림이 없는 빵은 0으로 표시됩니다.&lt;br /&gt;
* 단, 한 묶음 안에 크림이 없는 빵(0)이 P개 이상 있다면 그 묶음은 불량품으로 간주되어 팔 수 없습니다.&lt;br /&gt;
&lt;br /&gt;
우리는 &#039;&#039;&#039;판매 가능한 빵 묶음의 총 개수&#039;&#039;&#039;를 구해야 합니다.﻿&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
이 문제를 해결하기 위한 핵심은 일렬로 늘어선 데이터를 일정한 간격(K)으로 정확하게 나누어 검사하는 것입니다.&lt;br /&gt;
&lt;br /&gt;
예를 들어 빵이 3개씩 한 묶음(K=3), 크림 없는 빵이 1개 미만이어야 판매 가능하다고 상상해 봅시다.&lt;br /&gt;
&lt;br /&gt;
주어진 빵의 데이터를 &#039;&#039;&#039;K개씩 끊어서&#039;&#039;&#039; &#039;&#039;&#039;크림 없는 빵의 개수&#039;&#039;&#039;를 세어보면 판매가능한 빵 묶음 개수를 확인할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
﻿[[파일:2023KOI크림빵1.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
=== ﻿﻿💻 코드 구현 - K개씩 끊어서 확인하기﻿ ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# N: 묶음 수, K: 묶음당 빵의 수, P: 불량품 기준 개수&lt;br /&gt;
n, k, p = map(int, input().split())&lt;br /&gt;
breads = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
ans = 0&lt;br /&gt;
&lt;br /&gt;
# 0부터 전체 빵 개수(N*K)까지 K칸씩 건너뛰며 묶음의 시작점(i) 설정&lt;br /&gt;
for i in range(0, n * k, k):&lt;br /&gt;
    nocream = 0  # 현재 묶음의 크림 없는 빵(0) 개수를 셀 변수&lt;br /&gt;
    &lt;br /&gt;
    # 시작점(i)부터 i+k 직전까지 빵을 하나씩 검사&lt;br /&gt;
    for j in range(i, i + k):&lt;br /&gt;
        if breads[j] == 0:&lt;br /&gt;
            nocream += 1  # 크림이 없으면 개수 증가&lt;br /&gt;
            &lt;br /&gt;
    # 해당 묶음 안의 불량품이 P개 미만이라면 판매 가능&lt;br /&gt;
    if nocream &amp;lt; p:&lt;br /&gt;
        ans += 1&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
﻿전체 빵을 K개씩 끊어 순회하면서 크림없는 빵의 개수를 세고, 불량 여부를 판단하는 것을 중첩 반복의 형태로 표현했습니다.&lt;br /&gt;
&lt;br /&gt;
이번 문제는 &#039;&#039;&#039;빵의 최대 개수(1 &amp;lt;= N &amp;lt;= 50)&#039;&#039;&#039;가 크지 않기 때문에 이 방법으로 충분히 해결 가능합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿📊 정답률﻿ ===&lt;br /&gt;
[[파일:2023KOI크림빵2.png|center|class=coders70]]&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1500 2. 대피소 (초2/고1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
﻿=== 📄 문제 개요 ===&lt;br /&gt;
KOI 마을에 N개의 집이 있습니다. 이 중 K개의 집에 대피소를 설치하려고 합니다.&lt;br /&gt;
&lt;br /&gt;
모든 주민의 안전을 위해, 어떤 집에서든 &#039;&#039;&#039;&amp;lt;nowiki/&amp;gt;&#039;가장 가까운 대피소까지의 거리&#039; 중 가장 먼 거리가 최소가 되도록&#039;&#039;&#039; 대피소를 설치해야 합니다.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;두 집 사이의 거리&#039;&#039;&#039;는 가로 차이와 세로 차이를 합한 값으로 계산합니다.&lt;br /&gt;
* 조건을 만족하는 K개의 집을 선택했을 때, &#039;&#039;&#039;대피소와 가장 멀리 떨어진 집과의 최소 거리&#039;&#039;&#039;를 출력해야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
이 문제에서 최적의 위치를 단번에 도출해 내는 수학적 공식이나 모델링을 찾으려 한다면, 오히려 출제 의도에서 벗어날 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
집의 개수(N)는 최대 50개이고, 설치할 대피소(r)는 최대 3개입니다.&lt;br /&gt;
&lt;br /&gt;
50개의 집 중에서 3개의 대피소를 고르는 모든 경우의 수는 &#039;&#039;&#039;50C3&#039;&#039;&#039;으로 고작 &#039;&#039;&#039;19,600가지&#039;&#039;&#039;에 불과합니다.&lt;br /&gt;
&lt;br /&gt;
따라서 복잡한 최적화 알고리즘을 구상할 필요 없이, 19,600가지의 대피소 설치 경우의 수를&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;모두 확인하는 완전 탐색(Brute-Force)&#039;&#039;&#039; 방식으로 접근하는 것이 가장 정확하고 확실한 해결책입니다.&lt;br /&gt;
&lt;br /&gt;
﻿[[파일:2023KOI대피소1.png|center|class=coders100]]&lt;br /&gt;
위와 같이 (1, 5), (3, 0), (3, 3), (6, 12), (8, 9) 위치에 총 5개의 집이 있습니다.&lt;br /&gt;
이 중 &#039;&#039;&#039;(1, 5), (3, 0)&#039;&#039;&#039; 두 집을 대피소로 선정한 상황입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;(1, 5) 위치의 집&#039;&#039;&#039; : 대피소로 선정되었기 때문에 가장 가까운 대피소까지의 거리는 0입니다.&lt;br /&gt;
* &#039;&#039;&#039;(3, 0) 위치의 집&#039;&#039;&#039; : 대피소로 선정되었기 때문에 가장 가까운 대피소까지의 거리는 0입니다.&lt;br /&gt;
* &#039;&#039;&#039;(3, 3) 위치의 집&#039;&#039;&#039; : (1, 5) 대피소까지 거리는 &#039;&#039;&#039;4&#039;&#039;&#039;, (3, 0) 대피소까지 거리는 &#039;&#039;&#039;3&#039;&#039;&#039;이므로 &#039;&#039;&#039;가장 가까운 대피소까지의 거리는 3&#039;&#039;&#039;입니다.&lt;br /&gt;
* &#039;&#039;&#039;(6, 12) 위치의 집&#039;&#039;&#039; : (1, 5) 대피소까지 거리는 &#039;&#039;&#039;12&#039;&#039;&#039;, (3, 0) 대피소까지 거리는 &#039;&#039;&#039;15&#039;&#039;&#039;이므로 &#039;&#039;&#039;가장 가까운 대피소까지의 거리는 12&#039;&#039;&#039;입니다.&lt;br /&gt;
* &#039;&#039;&#039;(8, 9) 위치의 집&#039;&#039;&#039; : (1, 5) 대피소까지 거리는 &#039;&#039;&#039;11&#039;&#039;&#039;, (3, 0) 대피소까지 거리는 &#039;&#039;&#039;14&#039;&#039;&#039;이므로 &#039;&#039;&#039;가장 가까운 대피소까지의 거리는 11&#039;&#039;&#039;입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
따라서 &#039;&#039;&#039;가장 가까운 대피소까지의 거리가 가장 먼 경우&#039;&#039;&#039;는 (6, 12) 위치의 집의 &#039;&#039;&#039;12&#039;&#039;&#039;가 됩니다.&lt;br /&gt;
&lt;br /&gt;
지금 구한 이 값은 경우의 수 하나의 값이고, 모든 경우의 수에서 계산한 후 가장 작은 값을 구해야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
풀이과정을 정리해보면 다음과 같습니다.&lt;br /&gt;
&lt;br /&gt;
① 주어진 N개의 집 중 r개를 대피소로 정합니다.&lt;br /&gt;
&lt;br /&gt;
② 각 집과 대피소 사이 가장 가까운 거리(p)를 구한 후, 그 중 가장 큰 값(k)을 선정합니다.&lt;br /&gt;
&lt;br /&gt;
③ 모든 경우에 대해 위 과정을 반복하여 k 중 가장 작은 값(m)을 구합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현﻿ ===&lt;br /&gt;
﻿&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n, r = map(int, input().split())&lt;br /&gt;
arr = []&lt;br /&gt;
for i in range(n):&lt;br /&gt;
    arr.append(tuple(map(int, input().split())))&lt;br /&gt;
&lt;br /&gt;
n = len(arr)&lt;br /&gt;
data = []         # 현재 선택된 대피소들을 담을 리스트&lt;br /&gt;
m = float(&#039;inf&#039;)  # 최종 정답 (가장 작은 값을 찾기 위해 무한대로 초기화)&lt;br /&gt;
&lt;br /&gt;
# 조합을 직접 만들어내는 재귀함수 (start: 탐색 시작 인덱스, depth: 선택한 대피소 개수)&lt;br /&gt;
def comb(start, depth):&lt;br /&gt;
    global m&lt;br /&gt;
    &lt;br /&gt;
    # r개의 대피소를 모두 골랐다면&lt;br /&gt;
    if depth == r:&lt;br /&gt;
        k = 0  # 현재 대피소 조합에서 가장 멀리 떨어진 집의 거리&lt;br /&gt;
        &lt;br /&gt;
        # 마을의 모든 집(i)에 대해 검사&lt;br /&gt;
        for i in arr:&lt;br /&gt;
            p = float(&#039;inf&#039;)  # 현재 집(i)에서 가장 가까운 대피소까지의 거리&lt;br /&gt;
            &lt;br /&gt;
            # 선택된 대피소(j)들을 하나씩 확인하며 최단 거리 계산&lt;br /&gt;
            for j in data:&lt;br /&gt;
                p = min(p, abs(i[0]-j[0]) + abs(i[1]-j[1]))&lt;br /&gt;
            &lt;br /&gt;
            # 모든 집들 중 가장 대피소와 멀리 떨어진 거리(최댓값) 갱신&lt;br /&gt;
            k = max(k, p)&lt;br /&gt;
            &lt;br /&gt;
        # 이번 조합의 최댓값(k)이 기존의 최소 거리(m)보다 작다면 정답 갱신&lt;br /&gt;
        m = min(m, k)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # 대피소 고르기&lt;br /&gt;
    for i in range(start, n):&lt;br /&gt;
        data.append(arr[i])      # 1. 대피소 선택&lt;br /&gt;
        comb(i + 1, depth + 1)   # 2. 다음 대피소 고르러 재귀 호출&lt;br /&gt;
        data.pop()               # 3. 탐색 완료 후 빼내고 다른 집 선택&lt;br /&gt;
&lt;br /&gt;
comb(0, 0)&lt;br /&gt;
print(m)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;1. 알고리즘 문제 풀이 요령&#039;&#039;&#039; ====&lt;br /&gt;
이번 문제 뿐만 아니라 알고리즘을 설계할 때 가장 먼저 확인할 것이 입력 데이터의 크기와 제한시간입니다.&lt;br /&gt;
&lt;br /&gt;
집의 개수(N)의 최대값이 50으로 굉장히 작은데도 불구하고, 문제의 시간제한이 4초로 아주 크게 주어졌습니다.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;입력 데이터의 크기와 시간 제한&#039;&#039;&#039;은 이렇게 &#039;&#039;&#039;완전 탐색을 암시하는 힌트&#039;&#039;&#039;가 될 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
알고리즘 설계 방향에 이를 반영하되, 문제에 따라 예외 상황이 있을 수 있기 때문에 올바른 판단을 위해 많은 문제 풀이 경험이 필요하겠습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;2. 재귀함수를 활용한 조합 구현&#039;&#039;&#039; ====&lt;br /&gt;
combinations  라이브러리를 활용할 수도 있지만, 재귀함수를 활용해 직접 조합을 구현했습니다.&lt;br /&gt;
&lt;br /&gt;
조합 라이브러리가 구현되어있지 않는 프로그래밍 언어를 사용하거나 라이브러리 사용이 제한적인 상황에서 문제를 잘 풀어내려면&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;순열/조합&#039;&#039;&#039;과 같은 중요한 개념은 이렇게 직접 구현하는 연습도 해보면 좋겠습니다.&lt;br /&gt;
&lt;br /&gt;
=== ﻿ ﻿📊 정답률﻿ ===&lt;br /&gt;
[[파일:2023KOI대피소2.png|center|class=coders70]]&lt;br /&gt;
&lt;br /&gt;
[[파일:2023KOI대피소3.png|center|class=coders70]]&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;3. 아이템 획득 (초3)&#039;&#039;&#039; ==&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2023_%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)_1%EC%B0%A8_%EB%8C%80%ED%9A%8C_2%EA%B5%90%EC%8B%9C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2868</id>
		<title>2023 한국정보올림피아드(KOI) 1차 대회 2교시 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2023_%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)_1%EC%B0%A8_%EB%8C%80%ED%9A%8C_2%EA%B5%90%EC%8B%9C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2868"/>
		<updated>2026-04-21T14:58:57Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2023 KOI, 2023 초등부 1차 대회 2교시|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1501 1. 크림빵 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== 📄 문제 개요 ===&lt;br /&gt;
KOI 빵집에서 총 N * K개의 빵을 만들었습니다. 이 빵들을 일렬로 늘어놓고 앞에서부터 K개씩 묶어서 판매하려고 합니다.&lt;br /&gt;
&lt;br /&gt;
* 크림이 있는 빵은 1, 크림이 없는 빵은 0으로 표시됩니다.&lt;br /&gt;
* 단, 한 묶음 안에 크림이 없는 빵(0)이 P개 이상 있다면 그 묶음은 불량품으로 간주되어 팔 수 없습니다.&lt;br /&gt;
&lt;br /&gt;
우리는 &#039;&#039;&#039;판매 가능한 빵 묶음의 총 개수&#039;&#039;&#039;를 구해야 합니다.﻿&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
이 문제를 해결하기 위한 핵심은 일렬로 늘어선 데이터를 일정한 간격(K)으로 정확하게 나누어 검사하는 것입니다.&lt;br /&gt;
&lt;br /&gt;
예를 들어 빵이 3개씩 한 묶음(K=3), 크림 없는 빵이 1개 미만이어야 판매 가능하다고 상상해 봅시다.&lt;br /&gt;
&lt;br /&gt;
주어진 빵의 데이터를 &#039;&#039;&#039;K개씩 끊어서&#039;&#039;&#039; &#039;&#039;&#039;크림 없는 빵의 개수&#039;&#039;&#039;를 세어보면 판매가능한 빵 묶음 개수를 확인할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
﻿[[파일:2023KOI크림빵1.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
=== ﻿﻿💻 코드 구현 - K개씩 끊어서 확인하기﻿ ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# N: 묶음 수, K: 묶음당 빵의 수, P: 불량품 기준 개수&lt;br /&gt;
n, k, p = map(int, input().split())&lt;br /&gt;
breads = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
ans = 0&lt;br /&gt;
&lt;br /&gt;
# 0부터 전체 빵 개수(N*K)까지 K칸씩 건너뛰며 묶음의 시작점(i) 설정&lt;br /&gt;
for i in range(0, n * k, k):&lt;br /&gt;
    nocream = 0  # 현재 묶음의 크림 없는 빵(0) 개수를 셀 변수&lt;br /&gt;
    &lt;br /&gt;
    # 시작점(i)부터 i+k 직전까지 빵을 하나씩 검사&lt;br /&gt;
    for j in range(i, i + k):&lt;br /&gt;
        if breads[j] == 0:&lt;br /&gt;
            nocream += 1  # 크림이 없으면 개수 증가&lt;br /&gt;
            &lt;br /&gt;
    # 해당 묶음 안의 불량품이 P개 미만이라면 판매 가능&lt;br /&gt;
    if nocream &amp;lt; p:&lt;br /&gt;
        ans += 1&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
﻿전체 빵을 K개씩 끊어 순회하면서 크림없는 빵의 개수를 세고, 불량 여부를 판단하는 것을 중첩 반복의 형태로 표현했습니다.&lt;br /&gt;
&lt;br /&gt;
이번 문제는 &#039;&#039;&#039;빵의 최대 개수(1 &amp;lt;= N &amp;lt;= 50)&#039;&#039;&#039;가 크지 않기 때문에 이 방법으로 충분히 해결 가능합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿📊 정답률﻿ ===&lt;br /&gt;
[[파일:2023KOI크림빵2.png|center|class=coders70]]&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1500 2. 대피소 (초2/고1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== 📄 문제 개요 ===&lt;br /&gt;
KOI 마을에 N개의 집이 있습니다. 이 중 K개의 집에 대피소를 설치하려고 합니다.&lt;br /&gt;
&lt;br /&gt;
모든 주민의 안전을 위해, 어떤 집에서든 &#039;&#039;&#039;&amp;lt;nowiki/&amp;gt;&#039;가장 가까운 대피소까지의 거리&#039; 중 가장 먼 거리가 최소가 되도록&#039;&#039;&#039; 대피소를 설치해야 합니다.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;두 집 사이의 거리&#039;&#039;&#039;는 가로 차이와 세로 차이를 합한 값으로 계산합니다.&lt;br /&gt;
* 조건을 만족하는 K개의 집을 선택했을 때, &#039;&#039;&#039;대피소와 가장 멀리 떨어진 집과의 최소 거리&#039;&#039;&#039;를 출력해야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
이 문제에서 최적의 위치를 단번에 도출해 내는 수학적 공식이나 모델링을 찾으려 한다면, 오히려 출제 의도에서 벗어날 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
집의 개수(N)는 최대 50개이고, 설치할 대피소(r)는 최대 3개입니다.&lt;br /&gt;
&lt;br /&gt;
50개의 집 중에서 3개의 대피소를 고르는 모든 경우의 수는 &#039;&#039;&#039;50C3&#039;&#039;&#039;으로 고작 &#039;&#039;&#039;19,600가지&#039;&#039;&#039;에 불과합니다.&lt;br /&gt;
&lt;br /&gt;
따라서 복잡한 최적화 알고리즘을 구상할 필요 없이, 19,600가지의 대피소 설치 경우의 수를&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;모두 확인하는 완전 탐색(Brute-Force)&#039;&#039;&#039; 방식으로 접근하는 것이 가장 정확하고 확실한 해결책입니다.&lt;br /&gt;
&lt;br /&gt;
﻿[[파일:2023KOI대피소1.png]]﻿&lt;br /&gt;
위와 같이 (1, 5), (3, 0), (3, 3), (6, 12), (8, 9) 위치에 총 5개의 집이 있습니다.&lt;br /&gt;
이 중 &#039;&#039;&#039;(1, 5), (3, 0)&#039;&#039;&#039; 두 집을 대피소로 선정한 상황입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;(1, 5) 위치의 집&#039;&#039;&#039; : 대피소로 선정되었기 때문에 가장 가까운 대피소까지의 거리는 0입니다.&lt;br /&gt;
* &#039;&#039;&#039;(3, 0) 위치의 집&#039;&#039;&#039; : 대피소로 선정되었기 때문에 가장 가까운 대피소까지의 거리는 0입니다.&lt;br /&gt;
* &#039;&#039;&#039;(3, 3) 위치의 집&#039;&#039;&#039; : (1, 5) 대피소까지 거리는 &#039;&#039;&#039;4&#039;&#039;&#039;, (3, 0) 대피소까지 거리는 &#039;&#039;&#039;3&#039;&#039;&#039;이므로 &#039;&#039;&#039;가장 가까운 대피소까지의 거리는 3&#039;&#039;&#039;입니다.&lt;br /&gt;
* &#039;&#039;&#039;(6, 12) 위치의 집&#039;&#039;&#039; : (1, 5) 대피소까지 거리는 &#039;&#039;&#039;12&#039;&#039;&#039;, (3, 0) 대피소까지 거리는 &#039;&#039;&#039;15&#039;&#039;&#039;이므로 &#039;&#039;&#039;가장 가까운 대피소까지의 거리는 12&#039;&#039;&#039;입니다.&lt;br /&gt;
* &#039;&#039;&#039;(8, 9) 위치의 집&#039;&#039;&#039; : (1, 5) 대피소까지 거리는 &#039;&#039;&#039;11&#039;&#039;&#039;, (3, 0) 대피소까지 거리는 &#039;&#039;&#039;14&#039;&#039;&#039;이므로 &#039;&#039;&#039;가장 가까운 대피소까지의 거리는 11&#039;&#039;&#039;입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
따라서 &#039;&#039;&#039;가장 가까운 대피소까지의 거리가 가장 먼 경우&#039;&#039;&#039;는 (6, 12) 위치의 집의 &#039;&#039;&#039;12&#039;&#039;&#039;가 됩니다.&lt;br /&gt;
&lt;br /&gt;
지금 구한 이 값은 경우의 수 하나의 값이고, 모든 경우의 수에서 계산한 후 가장 작은 값을 구해야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
풀이과정을 정리해보면 다음과 같습니다.&lt;br /&gt;
&lt;br /&gt;
① 주어진 N개의 집 중 r개를 대피소로 정합니다.&lt;br /&gt;
&lt;br /&gt;
② 각 집과 대피소 사이 가장 가까운 거리(p)를 구한 후, 그 중 가장 큰 값(k)을 선정합니다.&lt;br /&gt;
&lt;br /&gt;
③ 모든 경우에 대해 위 과정을 반복하여 k 중 가장 작은 값(m)을 구합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿💻 코드 구현﻿ ===&lt;br /&gt;
﻿&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
n, r = map(int, input().split())&lt;br /&gt;
arr = []&lt;br /&gt;
for i in range(n):&lt;br /&gt;
    arr.append(tuple(map(int, input().split())))&lt;br /&gt;
&lt;br /&gt;
n = len(arr)&lt;br /&gt;
data = []         # 현재 선택된 대피소들을 담을 리스트&lt;br /&gt;
m = float(&#039;inf&#039;)  # 최종 정답 (가장 작은 값을 찾기 위해 무한대로 초기화)&lt;br /&gt;
&lt;br /&gt;
# 조합을 직접 만들어내는 재귀함수 (start: 탐색 시작 인덱스, depth: 선택한 대피소 개수)&lt;br /&gt;
def comb(start, depth):&lt;br /&gt;
    global m&lt;br /&gt;
    &lt;br /&gt;
    # r개의 대피소를 모두 골랐다면&lt;br /&gt;
    if depth == r:&lt;br /&gt;
        k = 0  # 현재 대피소 조합에서 가장 멀리 떨어진 집의 거리&lt;br /&gt;
        &lt;br /&gt;
        # 마을의 모든 집(i)에 대해 검사&lt;br /&gt;
        for i in arr:&lt;br /&gt;
            p = float(&#039;inf&#039;)  # 현재 집(i)에서 가장 가까운 대피소까지의 거리&lt;br /&gt;
            &lt;br /&gt;
            # 선택된 대피소(j)들을 하나씩 확인하며 최단 거리 계산&lt;br /&gt;
            for j in data:&lt;br /&gt;
                p = min(p, abs(i[0]-j[0]) + abs(i[1]-j[1]))&lt;br /&gt;
            &lt;br /&gt;
            # 모든 집들 중 가장 대피소와 멀리 떨어진 거리(최댓값) 갱신&lt;br /&gt;
            k = max(k, p)&lt;br /&gt;
            &lt;br /&gt;
        # 이번 조합의 최댓값(k)이 기존의 최소 거리(m)보다 작다면 정답 갱신&lt;br /&gt;
        m = min(m, k)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # 대피소 고르기&lt;br /&gt;
    for i in range(start, n):&lt;br /&gt;
        data.append(arr[i])      # 1. 대피소 선택&lt;br /&gt;
        comb(i + 1, depth + 1)   # 2. 다음 대피소 고르러 재귀 호출&lt;br /&gt;
        data.pop()               # 3. 탐색 완료 후 빼내고 다른 집 선택&lt;br /&gt;
&lt;br /&gt;
comb(0, 0)&lt;br /&gt;
print(m)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;1. 알고리즘 문제 풀이 요령&#039;&#039;&#039; ====&lt;br /&gt;
이번 문제 뿐만 아니라 알고리즘을 설계할 때 가장 먼저 확인할 것이 입력 데이터의 크기와 제한시간입니다.&lt;br /&gt;
&lt;br /&gt;
집의 개수(N)의 최대값이 50으로 굉장히 작은데도 불구하고, 문제의 시간제한이 4초로 아주 크게 주어졌습니다.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;입력 데이터의 크기와 시간 제한&#039;&#039;&#039;은 이렇게 &#039;&#039;&#039;완전 탐색을 암시하는 힌트&#039;&#039;&#039;가 될 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
알고리즘 설계 방향에 이를 반영하되, 문제에 따라 예외 상황이 있을 수 있기 때문에 올바른 판단을 위해 많은 문제 풀이 경험이 필요하겠습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;2. 재귀함수를 활용한 조합 구현&#039;&#039;&#039; ====&lt;br /&gt;
combinations  라이브러리를 활용할 수도 있지만, 재귀함수를 활용해 직접 조합을 구현했습니다.&lt;br /&gt;
&lt;br /&gt;
조합 라이브러리가 구현되어있지 않는 프로그래밍 언어를 사용하거나 라이브러리 사용이 제한적인 상황에서 문제를 잘 풀어내려면&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;순열/조합&#039;&#039;&#039;과 같은 중요한 개념은 이렇게 직접 구현하는 연습도 해보면 좋겠습니다.&lt;br /&gt;
&lt;br /&gt;
=== ﻿ ﻿📊 정답률﻿ ===&lt;br /&gt;
[[파일:2023KOI대피소2.png]]&lt;br /&gt;
&lt;br /&gt;
[[파일:2023KOI대피소3.png]]&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;3. 아이템 획득 (초3)&#039;&#039;&#039; ==&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=%ED%8C%8C%EC%9D%BC:2023KOI%EB%8C%80%ED%94%BC%EC%86%8C2.png&amp;diff=2867</id>
		<title>파일:2023KOI대피소2.png</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=%ED%8C%8C%EC%9D%BC:2023KOI%EB%8C%80%ED%94%BC%EC%86%8C2.png&amp;diff=2867"/>
		<updated>2026-04-21T14:58:45Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;2023KOI대피소2&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=%ED%8C%8C%EC%9D%BC:2023KOI%EB%8C%80%ED%94%BC%EC%86%8C3.png&amp;diff=2866</id>
		<title>파일:2023KOI대피소3.png</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=%ED%8C%8C%EC%9D%BC:2023KOI%EB%8C%80%ED%94%BC%EC%86%8C3.png&amp;diff=2866"/>
		<updated>2026-04-21T14:58:08Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;2023KOI대피소3&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=%ED%8C%8C%EC%9D%BC:2023KOI%EB%8C%80%ED%94%BC%EC%86%8C1.png&amp;diff=2865</id>
		<title>파일:2023KOI대피소1.png</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=%ED%8C%8C%EC%9D%BC:2023KOI%EB%8C%80%ED%94%BC%EC%86%8C1.png&amp;diff=2865"/>
		<updated>2026-04-21T14:55:49Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;2023KOI대피소1&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2023_%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)_1%EC%B0%A8_%EB%8C%80%ED%9A%8C_2%EA%B5%90%EC%8B%9C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2864</id>
		<title>2023 한국정보올림피아드(KOI) 1차 대회 2교시 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2023_%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)_1%EC%B0%A8_%EB%8C%80%ED%9A%8C_2%EA%B5%90%EC%8B%9C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2864"/>
		<updated>2026-04-20T08:33:26Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2023 KOI, 2023 초등부 1차 대회 2교시|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1501 1. 크림빵 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== 📄 문제 개요 ===&lt;br /&gt;
KOI 빵집에서 총 N * K개의 빵을 만들었습니다. 이 빵들을 일렬로 늘어놓고 앞에서부터 K개씩 묶어서 판매하려고 합니다.&lt;br /&gt;
&lt;br /&gt;
* 크림이 있는 빵은 1, 크림이 없는 빵은 0으로 표시됩니다.&lt;br /&gt;
* 단, 한 묶음 안에 크림이 없는 빵(0)이 P개 이상 있다면 그 묶음은 불량품으로 간주되어 팔 수 없습니다.&lt;br /&gt;
&lt;br /&gt;
우리는 &#039;&#039;&#039;판매 가능한 빵 묶음의 총 개수&#039;&#039;&#039;를 구해야 합니다.﻿&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
이 문제를 해결하기 위한 핵심은 일렬로 늘어선 데이터를 일정한 간격(K)으로 정확하게 나누어 검사하는 것입니다.&lt;br /&gt;
&lt;br /&gt;
예를 들어 빵이 3개씩 한 묶음(K=3), 크림 없는 빵이 1개 미만이어야 판매 가능하다고 상상해 봅시다.&lt;br /&gt;
&lt;br /&gt;
주어진 빵의 데이터를 &#039;&#039;&#039;K개씩 끊어서&#039;&#039;&#039; &#039;&#039;&#039;크림 없는 빵의 개수&#039;&#039;&#039;를 세어보면 판매가능한 빵 묶음 개수를 확인할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
﻿[[파일:2023KOI크림빵1.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
=== ﻿﻿💻 코드 구현 - K개씩 끊어서 확인하기﻿ ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# N: 묶음 수, K: 묶음당 빵의 수, P: 불량품 기준 개수&lt;br /&gt;
n, k, p = map(int, input().split())&lt;br /&gt;
breads = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
ans = 0&lt;br /&gt;
&lt;br /&gt;
# 0부터 전체 빵 개수(N*K)까지 K칸씩 건너뛰며 묶음의 시작점(i) 설정&lt;br /&gt;
for i in range(0, n * k, k):&lt;br /&gt;
    nocream = 0  # 현재 묶음의 크림 없는 빵(0) 개수를 셀 변수&lt;br /&gt;
    &lt;br /&gt;
    # 시작점(i)부터 i+k 직전까지 빵을 하나씩 검사&lt;br /&gt;
    for j in range(i, i + k):&lt;br /&gt;
        if breads[j] == 0:&lt;br /&gt;
            nocream += 1  # 크림이 없으면 개수 증가&lt;br /&gt;
            &lt;br /&gt;
    # 해당 묶음 안의 불량품이 P개 미만이라면 판매 가능&lt;br /&gt;
    if nocream &amp;lt; p:&lt;br /&gt;
        ans += 1&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
﻿전체 빵을 K개씩 끊어 순회하면서 크림없는 빵의 개수를 세고, 불량 여부를 판단하는 것을 중첩 반복의 형태로 표현했습니다.&lt;br /&gt;
&lt;br /&gt;
이번 문제는 &#039;&#039;&#039;빵의 최대 개수(1 &amp;lt;= N &amp;lt;= 50)&#039;&#039;&#039;가 크지 않기 때문에 이 방법으로 충분히 해결 가능합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿📊 정답률﻿ ===&lt;br /&gt;
[[파일:2023KOI크림빵2.png|center|class=coders70]]&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1500 2. 대피소 (초2/고1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;3. 아이템 획득 (초3)&#039;&#039;&#039; ==&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2023_%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)_1%EC%B0%A8_%EB%8C%80%ED%9A%8C_2%EA%B5%90%EC%8B%9C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2863</id>
		<title>2023 한국정보올림피아드(KOI) 1차 대회 2교시 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2023_%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)_1%EC%B0%A8_%EB%8C%80%ED%9A%8C_2%EA%B5%90%EC%8B%9C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2863"/>
		<updated>2026-04-20T08:33:06Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: /* 1. 크림빵 (초1) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2023 KOI, 2023 초등부 1차 대회 2교시|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1501 1. 크림빵 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
=== 📄 문제 개요 ===&lt;br /&gt;
KOI 빵집에서 총 N * K개의 빵을 만들었습니다. 이 빵들을 일렬로 늘어놓고 앞에서부터 K개씩 묶어서 판매하려고 합니다.&lt;br /&gt;
&lt;br /&gt;
* 크림이 있는 빵은 1, 크림이 없는 빵은 0으로 표시됩니다.&lt;br /&gt;
* 단, 한 묶음 안에 크림이 없는 빵(0)이 P개 이상 있다면 그 묶음은 불량품으로 간주되어 팔 수 없습니다.&lt;br /&gt;
&lt;br /&gt;
우리는 &#039;&#039;&#039;판매 가능한 빵 묶음의 총 개수&#039;&#039;&#039;를 구해야 합니다.﻿&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
이 문제를 해결하기 위한 핵심은 일렬로 늘어선 데이터를 일정한 간격(K)으로 정확하게 나누어 검사하는 것입니다.&lt;br /&gt;
&lt;br /&gt;
예를 들어 빵이 3개씩 한 묶음(K=3), 크림 없는 빵이 1개 미만이어야 판매 가능하다고 상상해 봅시다.&lt;br /&gt;
&lt;br /&gt;
주어진 빵의 데이터를 &#039;&#039;&#039;K개씩 끊어서&#039;&#039;&#039; &#039;&#039;&#039;크림 없는 빵의 개수&#039;&#039;&#039;를 세어보면 판매가능한 빵 묶음 개수를 확인할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
﻿[[파일:2023KOI크림빵1.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
=== ﻿﻿💻 코드 구현 - K개씩 끊어서 확인하기﻿ ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# N: 묶음 수, K: 묶음당 빵의 수, P: 불량품 기준 개수&lt;br /&gt;
n, k, p = map(int, input().split())&lt;br /&gt;
breads = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
ans = 0&lt;br /&gt;
&lt;br /&gt;
# 0부터 전체 빵 개수(N*K)까지 K칸씩 건너뛰며 묶음의 시작점(i) 설정&lt;br /&gt;
for i in range(0, n * k, k):&lt;br /&gt;
    nocream = 0  # 현재 묶음의 크림 없는 빵(0) 개수를 셀 변수&lt;br /&gt;
    &lt;br /&gt;
    # 시작점(i)부터 i+k 직전까지 빵을 하나씩 검사&lt;br /&gt;
    for j in range(i, i + k):&lt;br /&gt;
        if breads[j] == 0:&lt;br /&gt;
            nocream += 1  # 크림이 없으면 개수 증가&lt;br /&gt;
            &lt;br /&gt;
    # 해당 묶음 안의 불량품이 P개 미만이라면 판매 가능&lt;br /&gt;
    if nocream &amp;lt; p:&lt;br /&gt;
        ans += 1&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
﻿전체 빵을 K개씩 끊어 순회하면서 크림없는 빵의 개수를 세고, 불량 여부를 판단하는 것을 중첩 반복의 형태로 표현했습니다.&lt;br /&gt;
&lt;br /&gt;
이번 문제는 &#039;&#039;&#039;빵의 최대 개수(1 &amp;lt;= N &amp;lt;= 50)&#039;&#039;&#039;가 크지 않기 때문에 이 방법으로 충분히 해결 가능합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿📊 정답률﻿ ===&lt;br /&gt;
[[파일:2023KOI크림빵2.png|center|class=coders70]]&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1500 2. 대피소 (초2/고1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;3. 아이템 획득 (초3)&#039;&#039;&#039; ==&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2023_%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)_1%EC%B0%A8_%EB%8C%80%ED%9A%8C_2%EA%B5%90%EC%8B%9C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2862</id>
		<title>2023 한국정보올림피아드(KOI) 1차 대회 2교시 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2023_%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)_1%EC%B0%A8_%EB%8C%80%ED%9A%8C_2%EA%B5%90%EC%8B%9C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2862"/>
		<updated>2026-04-20T08:32:55Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2023 KOI, 2023 초등부 1차 대회 2교시|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1501 1. 크림빵 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== 📄 문제 개요 ===&lt;br /&gt;
KOI 빵집에서 총 N * K개의 빵을 만들었습니다. 이 빵들을 일렬로 늘어놓고 앞에서부터 K개씩 묶어서 판매하려고 합니다.&lt;br /&gt;
&lt;br /&gt;
* 크림이 있는 빵은 1, 크림이 없는 빵은 0으로 표시됩니다.&lt;br /&gt;
* 단, 한 묶음 안에 크림이 없는 빵(0)이 P개 이상 있다면 그 묶음은 불량품으로 간주되어 팔 수 없습니다.&lt;br /&gt;
&lt;br /&gt;
우리는 &#039;&#039;&#039;판매 가능한 빵 묶음의 총 개수&#039;&#039;&#039;를 구해야 합니다.﻿&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
이 문제를 해결하기 위한 핵심은 일렬로 늘어선 데이터를 일정한 간격(K)으로 정확하게 나누어 검사하는 것입니다.&lt;br /&gt;
&lt;br /&gt;
예를 들어 빵이 3개씩 한 묶음(K=3), 크림 없는 빵이 1개 미만이어야 판매 가능하다고 상상해 봅시다.&lt;br /&gt;
&lt;br /&gt;
주어진 빵의 데이터를 &#039;&#039;&#039;K개씩 끊어서&#039;&#039;&#039; &#039;&#039;&#039;크림 없는 빵의 개수&#039;&#039;&#039;를 세어보면 판매가능한 빵 묶음 개수를 확인할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
﻿[[파일:2023KOI크림빵1.png|center|class=coders100]]&lt;br /&gt;
&lt;br /&gt;
=== ﻿﻿💻 코드 구현 - K개씩 끊어서 확인하기﻿ ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# N: 묶음 수, K: 묶음당 빵의 수, P: 불량품 기준 개수&lt;br /&gt;
n, k, p = map(int, input().split())&lt;br /&gt;
breads = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
ans = 0&lt;br /&gt;
&lt;br /&gt;
# 0부터 전체 빵 개수(N*K)까지 K칸씩 건너뛰며 묶음의 시작점(i) 설정&lt;br /&gt;
for i in range(0, n * k, k):&lt;br /&gt;
    nocream = 0  # 현재 묶음의 크림 없는 빵(0) 개수를 셀 변수&lt;br /&gt;
    &lt;br /&gt;
    # 시작점(i)부터 i+k 직전까지 빵을 하나씩 검사&lt;br /&gt;
    for j in range(i, i + k):&lt;br /&gt;
        if breads[j] == 0:&lt;br /&gt;
            nocream += 1  # 크림이 없으면 개수 증가&lt;br /&gt;
            &lt;br /&gt;
    # 해당 묶음 안의 불량품이 P개 미만이라면 판매 가능&lt;br /&gt;
    if nocream &amp;lt; p:&lt;br /&gt;
        ans += 1&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
﻿전체 빵을 K개씩 끊어 순회하면서 크림없는 빵의 개수를 세고, 불량 여부를 판단하는 것을 중첩 반복의 형태로 표현했습니다.&lt;br /&gt;
&lt;br /&gt;
이번 문제는 &#039;&#039;&#039;빵의 최대 개수(1 &amp;lt;= N &amp;lt;= 50)&#039;&#039;&#039;가 크지 않기 때문에 이 방법으로 충분히 해결 가능합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿📊 정답률﻿ ===&lt;br /&gt;
[[파일:2023KOI크림빵2.png|center|class=coders70]]&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1500 2. 대피소 (초2/고1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;3. 아이템 획득 (초3)&#039;&#039;&#039; ==&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=2023_%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)_1%EC%B0%A8_%EB%8C%80%ED%9A%8C_2%EA%B5%90%EC%8B%9C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2861</id>
		<title>2023 한국정보올림피아드(KOI) 1차 대회 2교시 초등부</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=2023_%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)_1%EC%B0%A8_%EB%8C%80%ED%9A%8C_2%EA%B5%90%EC%8B%9C_%EC%B4%88%EB%93%B1%EB%B6%80&amp;diff=2861"/>
		<updated>2026-04-20T08:32:40Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: /* 1. 크림빵 (초1) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:|title=아두위키 : 한국정보올림피아드(KOI) 기출문제 풀이|title_mode=append|keywords=정보올림피아드, 한국정보올림피아드, KOI, 정올, 정올 1차대회, 정올 2차대회, 사고력, 자료구조, 컴퓨팅 사고력, 프로그래밍 대회, 정올 기출, 2023 KOI, 2023 초등부 1차 대회 2교시|description=한국정보올림피아드(KOI) 기출 문제 풀이본을 수록합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;한국 정보올림피아드(KOI) 기출 문제 풀이과정을 수록합니다.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[파일:KOISolution.jpg|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]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1501 1. 크림빵 (초1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
=== 📄 문제 개요 ===&lt;br /&gt;
KOI 빵집에서 총 N * K개의 빵을 만들었습니다. 이 빵들을 일렬로 늘어놓고 앞에서부터 K개씩 묶어서 판매하려고 합니다.&lt;br /&gt;
&lt;br /&gt;
* 크림이 있는 빵은 1, 크림이 없는 빵은 0으로 표시됩니다.&lt;br /&gt;
* 단, 한 묶음 안에 크림이 없는 빵(0)이 P개 이상 있다면 그 묶음은 불량품으로 간주되어 팔 수 없습니다.&lt;br /&gt;
&lt;br /&gt;
우리는 &#039;&#039;&#039;판매 가능한 빵 묶음의 총 개수&#039;&#039;&#039;를 구해야 합니다.﻿&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💡 문제 풀이 시뮬레이션 ===&lt;br /&gt;
이 문제를 해결하기 위한 핵심은 일렬로 늘어선 데이터를 일정한 간격(K)으로 정확하게 나누어 검사하는 것입니다.&lt;br /&gt;
&lt;br /&gt;
예를 들어 빵이 3개씩 한 묶음(K=3), 크림 없는 빵이 1개 미만이어야 판매 가능하다고 상상해 봅시다.&lt;br /&gt;
&lt;br /&gt;
주어진 빵의 데이터를 &#039;&#039;&#039;K개씩 끊어서&#039;&#039;&#039; &#039;&#039;&#039;크림 없는 빵의 개수&#039;&#039;&#039;를 세어보면 판매가능한 빵 묶음 개수를 확인할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
﻿[[파일:2023KOI크림빵1.png]]&lt;br /&gt;
&lt;br /&gt;
=== ﻿﻿💻 코드 구현 - K개씩 끊어서 확인하기﻿ ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# N: 묶음 수, K: 묶음당 빵의 수, P: 불량품 기준 개수&lt;br /&gt;
n, k, p = map(int, input().split())&lt;br /&gt;
breads = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
ans = 0&lt;br /&gt;
&lt;br /&gt;
# 0부터 전체 빵 개수(N*K)까지 K칸씩 건너뛰며 묶음의 시작점(i) 설정&lt;br /&gt;
for i in range(0, n * k, k):&lt;br /&gt;
    nocream = 0  # 현재 묶음의 크림 없는 빵(0) 개수를 셀 변수&lt;br /&gt;
    &lt;br /&gt;
    # 시작점(i)부터 i+k 직전까지 빵을 하나씩 검사&lt;br /&gt;
    for j in range(i, i + k):&lt;br /&gt;
        if breads[j] == 0:&lt;br /&gt;
            nocream += 1  # 크림이 없으면 개수 증가&lt;br /&gt;
            &lt;br /&gt;
    # 해당 묶음 안의 불량품이 P개 미만이라면 판매 가능&lt;br /&gt;
    if nocream &amp;lt; p:&lt;br /&gt;
        ans += 1&lt;br /&gt;
&lt;br /&gt;
print(ans)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
﻿전체 빵을 K개씩 끊어 순회하면서 크림없는 빵의 개수를 세고, 불량 여부를 판단하는 것을 중첩 반복의 형태로 표현했습니다.&lt;br /&gt;
&lt;br /&gt;
이번 문제는 &#039;&#039;&#039;빵의 최대 개수(1 &amp;lt;= N &amp;lt;= 50)&#039;&#039;&#039;가 크지 않기 때문에 이 방법으로 충분히 해결 가능합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ﻿📊 정답률﻿ ===&lt;br /&gt;
[[파일:2023KOI크림빵2.png]]&lt;br /&gt;
&lt;br /&gt;
﻿&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;[https://codersit.co.kr/oj/problems/1500 2. 대피소 (초2/고1)]&#039;&#039;&#039; ==&lt;br /&gt;
제목 링크를 통해 문제를 확인해주세요.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;3. 아이템 획득 (초3)&#039;&#039;&#039; ==&lt;br /&gt;
추가 예정&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=%ED%8C%8C%EC%9D%BC:2023KOI%ED%81%AC%EB%A6%BC%EB%B9%B52.png&amp;diff=2860</id>
		<title>파일:2023KOI크림빵2.png</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=%ED%8C%8C%EC%9D%BC:2023KOI%ED%81%AC%EB%A6%BC%EB%B9%B52.png&amp;diff=2860"/>
		<updated>2026-04-20T08:32:30Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;2023KOI크림빵2&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
	<entry>
		<id>https://arduwiki.com/html/index.php?title=%ED%8C%8C%EC%9D%BC:2023KOI%ED%81%AC%EB%A6%BC%EB%B9%B51.png&amp;diff=2859</id>
		<title>파일:2023KOI크림빵1.png</title>
		<link rel="alternate" type="text/html" href="https://arduwiki.com/html/index.php?title=%ED%8C%8C%EC%9D%BC:2023KOI%ED%81%AC%EB%A6%BC%EB%B9%B51.png&amp;diff=2859"/>
		<updated>2026-04-20T08:30:26Z</updated>

		<summary type="html">&lt;p&gt;ArduWiki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;2023KOI크림빵1&lt;/div&gt;</summary>
		<author><name>ArduWiki</name></author>
	</entry>
</feed>