<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>MAGNUM OPUS</title>
        <link>https://velog.io/</link>
        <description>html_programming_language</description>
        <lastBuildDate>Tue, 03 Mar 2026 04:30:48 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>MAGNUM OPUS</title>
            <url>https://velog.velcdn.com/images/dev_alchemist/profile/8f01117e-f84a-46e1-98ae-930d6f57247d/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. MAGNUM OPUS. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dev_alchemist" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Vite + React 프로젝트에 라우팅/서버상태/스타일링 기본 뼈대 세팅하기 (React Router + TanStack Query + Tailwind v4)]]></title>
            <link>https://velog.io/@dev_alchemist/Vite-React-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EC%97%90-%EB%9D%BC%EC%9A%B0%ED%8C%85%EC%84%9C%EB%B2%84%EC%83%81%ED%83%9C%EC%8A%A4%ED%83%80%EC%9D%BC%EB%A7%81-%EA%B8%B0%EB%B3%B8-%EB%BC%88%EB%8C%80-%EC%84%B8%ED%8C%85%ED%95%98%EA%B8%B0-React-Router-TanStack-Query-Tailwind-v4</link>
            <guid>https://velog.io/@dev_alchemist/Vite-React-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EC%97%90-%EB%9D%BC%EC%9A%B0%ED%8C%85%EC%84%9C%EB%B2%84%EC%83%81%ED%83%9C%EC%8A%A4%ED%83%80%EC%9D%BC%EB%A7%81-%EA%B8%B0%EB%B3%B8-%EB%BC%88%EB%8C%80-%EC%84%B8%ED%8C%85%ED%95%98%EA%B8%B0-React-Router-TanStack-Query-Tailwind-v4</guid>
            <pubDate>Tue, 03 Mar 2026 04:30:48 GMT</pubDate>
            <description><![CDATA[<h2 id="작업-배경">작업 배경</h2>
<p>실제 서비스 형태로 확장하기 위해서 이번 작업에서는 <strong>앱 개발에 필요한 핵심 인프라(라우팅/데이터/스타일)</strong>를 먼저 붙여서 “뼈대”를 만들었다.</p>
<ul>
<li><strong>라우팅</strong>: 페이지 단위 구조(리스트/상세/설정 등)로 확장 가능해야 함</li>
<li><strong>서버 상태 관리</strong>: API 요청/캐싱/로딩/재요청 정책을 표준화하고 싶음</li>
<li><strong>스타일링</strong>: 템플릿 기본 CSS 대신 Tailwind 기반으로 빠르게 UI를 잡고 싶음</li>
</ul>
<hr>
<h2 id="이번-작업-목표">이번 작업 목표</h2>
<ul>
<li>React Router로 <strong>기본 라우팅 구조</strong> 구성</li>
<li>TanStack React Query로 <strong>API 호출 표준(캐싱/리패치 정책)</strong> 구성</li>
<li>Tailwind CSS v4로 <strong>전역 스타일 엔트리</strong> 정리</li>
<li>Vite 템플릿 보일러플레이트(기본 로고/기본 CSS) 제거</li>
<li><code>LiveReserveList</code> 페이지용 <strong>플레이스홀더 화면</strong> 추가</li>
</ul>
<hr>
<h2 id="변경-사항-한눈에-보기">변경 사항 한눈에 보기</h2>
<table>
<thead>
<tr>
<th>구분</th>
<th>내가 한 일</th>
</tr>
</thead>
<tbody><tr>
<td>의존성 추가</td>
<td><code>react-router</code>, <code>@tanstack/react-query</code>, <code>tailwindcss</code>, <code>@tailwindcss/vite</code></td>
</tr>
<tr>
<td>Tailwind 적용</td>
<td><code>vite.config.ts</code>에 Tailwind 플러그인 추가 + <code>src/index.css</code>를 Tailwind 엔트리로 변경</td>
</tr>
<tr>
<td>React Query 적용</td>
<td><code>QueryClient</code> 분리(<code>src/libs/queryClient.ts</code>) + 루트에 <code>QueryClientProvider</code> 연결</td>
</tr>
<tr>
<td>Router 적용</td>
<td><code>src/routes.tsx</code> 생성 + 루트에 <code>RouterProvider</code> 연결</td>
</tr>
<tr>
<td>템플릿 제거</td>
<td><code>src/App.css</code>, <code>src/assets/react.svg</code> 삭제</td>
</tr>
<tr>
<td>페이지 추가</td>
<td><code>src/liveReserveList.tsx</code> 플레이스홀더 추가</td>
</tr>
</tbody></table>
<hr>
<h2 id="1-tailwind-css-v4-적용">1) Tailwind CSS v4 적용</h2>
<h3 id="1-1-vite-설정에-tailwind-플러그인-추가">1-1. Vite 설정에 Tailwind 플러그인 추가</h3>
<p><code>vite.config.ts</code>에 <code>@tailwindcss/vite</code> 플러그인을 추가했다.</p>
<pre><code class="language-ts">    import { defineConfig } from &quot;vite&quot;;
    import react from &quot;@vitejs/plugin-react&quot;;
    import tailwindcss from &quot;@tailwindcss/vite&quot;;

    export default defineConfig({
        plugins: [
            react({
                babel: {
                    plugins: [[&quot;babel-plugin-react-compiler&quot;]],
                },
            }),
            tailwindcss(),
        ],
    });</code></pre>
<h3 id="1-2-전역-css를-tailwind-엔트리로-정리">1-2. 전역 CSS를 Tailwind 엔트리로 정리</h3>
<p>기존 Vite 템플릿 기본 CSS를 제거하고 <code>src/index.css</code>를 아래처럼 단순화했다.</p>
<pre><code class="language-css">    @import &quot;tailwindcss&quot;;</code></pre>
<p>이제부터 컴포넌트에서 <code>className=&quot;bg-red-50&quot;</code> 같은 Tailwind 유틸 클래스를 바로 쓸 수 있다.</p>
<hr>
<h2 id="2-tanstack-react-query-세팅">2) TanStack React Query 세팅</h2>
<h3 id="2-1-queryclient를-파일로-분리">2-1. QueryClient를 파일로 분리</h3>
<p><code>src/libs/queryClient.ts</code>를 만들고 QueryClient 인스턴스를 분리했다.</p>
<pre><code class="language-ts">    import { QueryClient } from &quot;@tanstack/react-query&quot;;

    const queryClient = new QueryClient();

    export default queryClient;</code></pre>
<h3 id="2-2-앱-루트에-provider-연결">2-2. 앱 루트에 Provider 연결</h3>
<p><code>src/main.tsx</code>에서 앱 전체를 <code>QueryClientProvider</code>로 감쌌다.</p>
<pre><code class="language-tsx">    import { StrictMode } from &quot;react&quot;;
    import { createRoot } from &quot;react-dom/client&quot;;
    import &quot;./index.css&quot;;
    import { RouterProvider } from &quot;react-router&quot;;
    import { QueryClientProvider } from &quot;@tanstack/react-query&quot;;

    import router from &quot;./routes&quot;;
    import queryClient from &quot;./libs/queryClient&quot;;

    createRoot(document.getElementById(&quot;root&quot;)!).render(
        &lt;StrictMode&gt;
            &lt;QueryClientProvider client={queryClient}&gt;
                &lt;RouterProvider router={router} /&gt;
            &lt;/QueryClientProvider&gt;
        &lt;/StrictMode&gt;,
    );</code></pre>
<p>이렇게 해두면 이후 어떤 페이지/컴포넌트에서도 <code>useQuery</code>, <code>useMutation</code>을 바로 사용할 수 있다.</p>
<hr>
<h2 id="3-react-router-기본-라우팅-구성">3) React Router 기본 라우팅 구성</h2>
<p><code>src/routes.tsx</code>를 새로 만들고, <code>createBrowserRouter</code>로 라우트를 정의했다.</p>
<pre><code class="language-tsx">    import { createBrowserRouter } from &quot;react-router&quot;;
    import App from &quot;./App&quot;;
    import LiveReserveList from &quot;./liveReserveList&quot;;

    const router = createBrowserRouter([
        {
            path: &quot;/&quot;,
            element: &lt;App /&gt;,
        },        
        {
            path: &quot;liveReserveList&quot;,
            element: &lt;LiveReserveList /&gt;,
        },
    ]);

    export default router;</code></pre>
<p>현재는 최소 단위로 아래 3개만 잡아두고, 앞으로 페이지가 늘어날 수 있게 구조를 열어뒀다.</p>
<ul>
<li><code>/</code> → App</li>
<li><code>/liveReserveList</code> → LiveReserveList</li>
</ul>
<hr>
<h2 id="4-livereservelist-플레이스홀더-추가">4) LiveReserveList 플레이스홀더 추가</h2>
<p>라우팅만 먼저 연결해두고, 화면 개발은 다음 단계에서 진행하기 위해 간단한 플레이스홀더를 만들었다.</p>
<pre><code class="language-tsx">    export default function LiveReserveList() {
        return &lt;div&gt;LiveReserveList&lt;/div&gt;;
    }</code></pre>
<hr>
<h2 id="5-템플릿-보일러플레이트-제거--app-화면-정리">5) 템플릿 보일러플레이트 제거 + App 화면 정리</h2>
<p>템플릿에 기본으로 들어있던 아래 파일을 제거했다.</p>
<ul>
<li><code>src/App.css</code></li>
<li><code>src/assets/react.svg</code></li>
</ul>
<p>그리고 <code>App.tsx</code>는 “템플릿 데모 화면” 대신 아래 두 가지를 확인하는 용도로 바꿨다.</p>
<ul>
<li><code>NavLink</code>로 라우팅 동작 확인</li>
<li><code>useQuery</code>로 API 호출 방식/옵션 테스트</li>
</ul>
<pre><code class="language-tsx">    import { useQuery } from &quot;@tanstack/react-query&quot;;
    import { NavLink, useNavigation } from &quot;react-router&quot;;

    function App() {
        const navigation = useNavigation();

        useQuery({
            queryKey: [&quot;hi&quot;],
            queryFn: async () =&gt; {
                const response = await fetch(
                    &quot;https://www.mallprolive.co.kr/api/1.0/minishop/info&quot;,
                    {
                        method: &quot;post&quot;,
                        headers: {
                            &quot;Content-Type&quot;: &quot;application/x-www-form-urlencoded;charset=UTF-8&quot;,
                        },
                        body: &quot;dealerID=test01&quot;,
                    },
                );

                const jsonData = await response.json();
                console.log(jsonData);
            },
            staleTime: 60_000,
            refetchOnMount: false,
            refetchOnWindowFocus: false,
            refetchOnReconnect: false,
        });

        return (
            &lt;&gt;
                &lt;div className=&quot;bg-red-50&quot;&gt;테스트1&lt;/div&gt;
                &lt;NavLink to=&quot;about&quot;&gt;테스트2&lt;/NavLink&gt;
            &lt;/&gt;
        );
    }

    export default App;</code></pre>
<hr>
<h2 id="마무리">마무리</h2>
<p>이번 작업으로 “페이지 구조(라우팅) + 서버 상태 관리(React Query) + 스타일링(Tailwind)”의 기본 세팅을 끝냈다.
이제부터는 <code>LiveReserveList</code> 같은 실제 페이지 개발을 빠르게 진행할 수 있는 상태가 됐다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[팀 프로젝트 기술 스택 기본 정리 (Vite · React 19 · TypeScript · Tailwind v4 · React Router · TanStack Query · React Compiler)]]></title>
            <link>https://velog.io/@dev_alchemist/%ED%8C%80-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B8%B0%EC%88%A0-%EC%8A%A4%ED%83%9D-%EA%B8%B0%EB%B3%B8-%EC%A0%95%EB%A6%AC-Vite-React-19-TypeScript-Tailwind-v4-React-Router-TanStack-Query-React-Compiler</link>
            <guid>https://velog.io/@dev_alchemist/%ED%8C%80-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B8%B0%EC%88%A0-%EC%8A%A4%ED%83%9D-%EA%B8%B0%EB%B3%B8-%EC%A0%95%EB%A6%AC-Vite-React-19-TypeScript-Tailwind-v4-React-Router-TanStack-Query-React-Compiler</guid>
            <pubDate>Mon, 09 Feb 2026 05:42:10 GMT</pubDate>
            <description><![CDATA[<h1 id="팀-프로젝트-기술-스택-기본-정리-vite-·-react-19-·-typescript-·-tailwind-v4-·-react-router-·-tanstack-query-·-react-compiler">팀 프로젝트 기술 스택 기본 정리 (Vite · React 19 · TypeScript · Tailwind v4 · React Router · TanStack Query · React Compiler)</h1>
<blockquote>
<p>목적: 팀 프론트엔드 프로젝트를 시작할 때 <strong>각 기술의 역할/개념/필수 용어/설정 포인트/실무 주의사항</strong>을 한 문서로 정리했다.<br>범위: 아래 7개 스택의 “기본적으로 알아야 하는 내용”을 가능한 한 빠짐없이 포함했다.</p>
</blockquote>
<hr>
<h2 id="0-한-줄-역할-맵">0. 한 줄 역할 맵</h2>
<ul>
<li><strong>Vite</strong>: 개발 서버/빌드(번들링, HMR)</li>
<li><strong>React 19</strong>: UI 컴포넌트 기반 렌더링(상태 기반)</li>
<li><strong>TypeScript</strong>: 타입 안정성(협업/리팩토링 안전)</li>
<li><strong>Tailwind CSS v4</strong>: 유틸리티 퍼스트 스타일링(빠른 UI/일관성)</li>
<li><strong>React Router</strong>: URL 기반 화면 구성(레이아웃/중첩 라우트)</li>
<li><strong>TanStack Query</strong>: 서버 데이터 패칭/캐싱/동기화 표준</li>
<li><strong>React Compiler</strong>: 렌더 최적화 자동화(자동 memoization 방향)</li>
</ul>
<hr>
<h1 id="1-vite">1) Vite</h1>
<h2 id="1-1-vite가-뭔가">1-1. Vite가 뭔가</h2>
<ul>
<li><strong>프론트엔드 빌드 도구(Dev Server + Bundler)</strong>.</li>
<li>개발 중에는 <strong>ESM(ECMAScript Modules)</strong> 기반으로 빠르게 로딩하고,</li>
<li>빌드 시에는 <strong>Rollup</strong> 기반 번들링을 수행한다.</li>
</ul>
<h2 id="1-2-왜-쓰나">1-2. 왜 쓰나</h2>
<ul>
<li><strong>개발 서버가 매우 빠름</strong>: 필요한 모듈만 즉시 서빙(필요할 때만 변환).</li>
<li><strong>HMR(Hot Module Replacement)</strong>이 빠르고 안정적.</li>
<li>React/TS/Tailwind 플러그인 생태계가 좋고 설정이 단순한 편.</li>
</ul>
<h2 id="1-3-개발빌드-동작-방식-핵심">1-3. 개발/빌드 동작 방식 (핵심)</h2>
<h3 id="개발dev">개발(Dev)</h3>
<ul>
<li>브라우저가 <code>import</code> 하는 모듈을 Vite dev server가 <strong>그때그때 변환해서 제공</strong>.</li>
<li>전체 번들링을 매번 하지 않으니 시작/수정 반영이 빠름.</li>
</ul>
<h3 id="프로덕션-빌드build">프로덕션 빌드(Build)</h3>
<ul>
<li>Rollup으로 <strong>번들 파일 생성</strong>, 코드 스플리팅(청크 분리), 트리쉐이킹 적용.</li>
<li>보통 <code>dist/</code>에 산출물 생성(설정에 따라 변경 가능).</li>
</ul>
<h2 id="1-4-프로젝트에서-꼭-아는-설정-포인트">1-4. 프로젝트에서 꼭 아는 설정 포인트</h2>
<ul>
<li><code>vite.config.ts</code>에서 플러그인/빌드 옵션/별칭(alias)/프록시(proxy) 등을 설정한다.</li>
<li>팀 프로젝트에서 특히 자주 만지는 것:<ul>
<li><code>base</code>: 서브 디렉토리 배포 시 정적 리소스 경로 대응</li>
<li><code>server.proxy</code>: 로컬에서 API 프록시(CORS 회피)</li>
<li><code>resolve.alias</code>: <code>@/</code> 별칭 통일</li>
</ul>
</li>
</ul>
<p>예시(개념용):</p>
<pre><code class="language-ts">    import { defineConfig } from &quot;vite&quot;;
    import react from &quot;@vitejs/plugin-react&quot;;

    export default defineConfig({
        base: &quot;/&quot;,
        plugins: [react()],
        resolve: {
            alias: {
                &quot;@&quot;: &quot;/src&quot;,
            },
        },
        server: {
            proxy: {
                &quot;/api&quot;: {
                    target: &quot;https://example.com&quot;,
                    changeOrigin: true,
                },
            },
        },
    });</code></pre>
<h2 id="1-5-환경변수-기본">1-5. 환경변수 기본</h2>
<ul>
<li>Vite는 <code>import.meta.env</code>를 사용한다.</li>
<li>클라이언트에서 접근 가능한 변수는 기본적으로 <code>VITE_</code> prefix가 필요하다.<ul>
<li>예: <code>VITE_API_BASE_URL</code>, <code>VITE_APP_BASENAME</code></li>
</ul>
</li>
</ul>
<h2 id="1-6-흔한-실수">1-6. 흔한 실수</h2>
<ul>
<li><strong>base 미설정</strong>으로 운영에서 CSS/JS 404</li>
<li>SPA 라우팅인데 서버에서 <code>index.html</code> 리라이트 설정이 없어 새로고침 404</li>
<li><code>.env</code> 수정 후 dev 서버 재시작 안 해서 환경변수 반영 안 됨</li>
</ul>
<hr>
<h1 id="2-react-19">2) React 19</h1>
<h2 id="2-1-react가-뭔가">2-1. React가 뭔가</h2>
<ul>
<li>UI를 <strong>컴포넌트 단위로 구성</strong>하는 라이브러리.</li>
<li><strong>상태(state)가 바뀌면 UI를 다시 그린다</strong>는 선언적(Declarative) 모델.</li>
</ul>
<h2 id="2-2-핵심-개념">2-2. 핵심 개념</h2>
<h3 id="컴포넌트">컴포넌트</h3>
<ul>
<li>함수 컴포넌트가 기본.</li>
<li><code>props</code>로 입력을 받고 JSX를 반환한다.</li>
</ul>
<h3 id="상태state">상태(state)</h3>
<ul>
<li><code>useState</code> 등으로 관리.</li>
<li>state가 바뀌면 해당 컴포넌트가 리렌더링된다.</li>
</ul>
<h3 id="렌더링리렌더">렌더링/리렌더</h3>
<ul>
<li>리렌더는 “DOM을 다 갈아엎는다”가 아니라, 변경점을 계산해 DOM에 반영한다.</li>
<li>다만 <strong>컴포넌트 함수 자체는 다시 실행</strong>되므로 렌더 안에서 만드는 객체/함수는 매번 새로 만들어질 수 있다(성능 포인트).</li>
</ul>
<h3 id="이펙트effect">이펙트(effect)</h3>
<ul>
<li><code>useEffect</code>는 렌더 결과가 화면에 반영된 뒤 실행된다.</li>
<li>데이터 요청/구독/DOM 핸들링 같은 “렌더 외부 작업”에 사용한다.</li>
</ul>
<h2 id="2-3-실무에서-자주-나오는-포인트">2-3. 실무에서 자주 나오는 포인트</h2>
<ul>
<li>서버에서 오는 데이터는 <code>useState</code>에 복사해서 들고 있기보다 <strong>React Query</strong>로 관리하는 편이 안전하다(싱크 이슈 감소).</li>
<li>상태 업데이트에서 이전 값을 기반으로 할 때는 함수형 업데이트를 사용한다.</li>
</ul>
<pre><code class="language-ts">    setCount((prev) =&gt; prev + 1);</code></pre>
<h2 id="2-4-흔한-실수">2-4. 흔한 실수</h2>
<ul>
<li><code>useEffect</code> 의존성 배열을 잘못 잡아서 무한 루프</li>
<li>렌더 중에 무거운 계산/정렬/필터를 매번 수행(메모/컴파일러/구조 개선 고려)</li>
</ul>
<hr>
<h1 id="3-typescript">3) TypeScript</h1>
<h2 id="3-1-typescript가-뭔가">3-1. TypeScript가 뭔가</h2>
<ul>
<li>JavaScript에 <strong>정적 타입 시스템</strong>을 추가한 언어(컴파일하면 JS).</li>
<li>런타임이 아니라 <strong>개발/빌드 시점에 타입 에러를 잡는다</strong>.</li>
</ul>
<h2 id="3-2-왜-쓰나">3-2. 왜 쓰나</h2>
<ul>
<li>협업/유지보수에서:<ul>
<li>API 데이터 형태 변경을 컴파일 에러로 감지</li>
<li>컴포넌트 props 계약 명확화</li>
<li>리팩토링 안전성 증가</li>
</ul>
</li>
</ul>
<h2 id="3-3-기본-타입-개념-필수">3-3. 기본 타입 개념 (필수)</h2>
<ul>
<li>타입 추론(type inference)</li>
<li>타입 선언(type annotation)</li>
<li>유니온/인터섹션: <code>A | B</code>, <code>A &amp; B</code></li>
<li>제네릭(generics): 타입을 매개변수로 받는 패턴(React Query, 공용 컴포넌트)</li>
<li>타입 vs 인터페이스<ul>
<li>복잡한 타입 연산/유니온: <code>type</code> 선호</li>
<li>객체 확장/선언 병합: <code>interface</code> 고려</li>
</ul>
</li>
</ul>
<h2 id="3-4-react에서-자주-쓰는-ts-패턴">3-4. React에서 자주 쓰는 TS 패턴</h2>
<h3 id="props-타입">Props 타입</h3>
<pre><code class="language-ts">    type ButtonProps = {
        label: string;
        onClick: () =&gt; void;
        disabled?: boolean;
    };

    export function Button(props: ButtonProps) {
        return (
            &lt;button disabled={props.disabled} onClick={props.onClick}&gt;
                {props.label}
            &lt;/button&gt;
        );
    }</code></pre>
<h3 id="이벤트-타입">이벤트 타입</h3>
<pre><code class="language-ts">    function onChange(e: React.ChangeEvent&lt;HTMLInputElement&gt;) {
        console.log(e.target.value);
    }</code></pre>
<h3 id="api-응답-타입">API 응답 타입</h3>
<pre><code class="language-ts">    type User = {
        id: string;
        name: string;
    };

    async function fetchUser(): Promise&lt;User&gt; {
        const res = await fetch(&quot;/api/user&quot;);
        if (!res.ok) throw new Error(&quot;Failed&quot;);
        return (await res.json()) as User;
    }</code></pre>
<h2 id="3-5-흔한-실수팁">3-5. 흔한 실수/팁</h2>
<ul>
<li><code>any</code> 남발 금지(가능하면 <code>unknown</code> + 타입가드)</li>
<li>API 응답을 무조건 <code>as Type</code>로 단언하면 런타임 오류를 놓칠 수 있음(필요 시 검증 레이어 고려)</li>
</ul>
<hr>
<h1 id="4-tailwind-css-v4-tailwindcssvite">4) Tailwind CSS v4 (<code>@tailwindcss/vite</code>)</h1>
<h2 id="4-1-tailwind가-뭔가">4-1. Tailwind가 뭔가</h2>
<ul>
<li>유틸리티 클래스를 조합해 UI를 만드는 <strong>유틸리티-퍼스트 CSS 프레임워크</strong>.</li>
<li>예: <code>bg-black text-white px-4 py-2 rounded</code></li>
</ul>
<h2 id="4-2-왜-쓰나">4-2. 왜 쓰나</h2>
<ul>
<li>스타일링 속도가 빠르고, 컴포넌트와 스타일이 가까워 유지보수가 쉬운 경우가 많다.</li>
<li>반응형/상태(hover/focus)/다크모드 패턴을 빠르게 적용 가능.</li>
<li>팀에서 규칙을 잡으면 UI 통일이 쉬움.</li>
</ul>
<h2 id="4-3-v4에서-알아둘-포인트">4-3. v4에서 알아둘 포인트</h2>
<ul>
<li>프로젝트 구성에 따라 다르지만, <code>src/index.css</code>에 아래처럼 단순하게 시작하는 형태가 많다.</li>
</ul>
<pre><code class="language-css">    @import &quot;tailwindcss&quot;;</code></pre>
<ul>
<li>Vite 통합은 <code>@tailwindcss/vite</code> 플러그인을 통해 이뤄진다.</li>
</ul>
<h2 id="4-4-핵심-사용-규칙">4-4. 핵심 사용 규칙</h2>
<h3 id="반응형">반응형</h3>
<pre><code class="language-tsx">    &lt;div className=&quot;p-4 md:p-8 lg:p-12&quot;&gt;...&lt;/div&gt;</code></pre>
<h3 id="상태">상태</h3>
<pre><code class="language-tsx">    &lt;button className=&quot;bg-black text-white hover:opacity-80 disabled:opacity-40&quot;&gt;
        Save
    &lt;/button&gt;</code></pre>
<h3 id="다크모드">다크모드</h3>
<pre><code class="language-tsx">    &lt;div className=&quot;bg-white text-black dark:bg-neutral-900 dark:text-white&quot;&gt;
        ...
    &lt;/div&gt;</code></pre>
<h2 id="4-5-흔한-실수팁">4-5. 흔한 실수/팁</h2>
<ul>
<li>className이 너무 길어짐 → 공용 UI로 추출하거나 <code>cn()</code> 유틸로 조건부 결합</li>
<li>디자인 토큰(간격/라운드/텍스트 크기)을 정하지 않으면 화면마다 제각각이 되기 쉬움</li>
</ul>
<hr>
<h1 id="5-react-router-createbrowserrouter">5) React Router (<code>createBrowserRouter</code>)</h1>
<h2 id="5-1-react-router가-뭔가">5-1. React Router가 뭔가</h2>
<ul>
<li>SPA에서 <strong>URL에 따라 컴포넌트를 렌더링</strong>하는 라우팅 라이브러리.</li>
<li><code>createBrowserRouter</code>는 라우트 트리를 객체로 선언하고 <code>RouterProvider</code>로 주입한다.</li>
</ul>
<h2 id="5-2-기본-구성-예시">5-2. 기본 구성 예시</h2>
<pre><code class="language-ts">    import { createBrowserRouter } from &quot;react-router-dom&quot;;
    import App from &quot;./App&quot;;

    export const router = createBrowserRouter([
        { path: &quot;/&quot;, element: &lt;App /&gt; },
        { path: &quot;/about&quot;, element: &lt;div&gt;안녕~&lt;/div&gt; },
    ]);</code></pre>
<pre><code class="language-tsx">    import { RouterProvider } from &quot;react-router-dom&quot;;
    import { router } from &quot;./routes&quot;;

    export function Root() {
        return &lt;RouterProvider router={router} /&gt;;
    }</code></pre>
<h2 id="5-3-기본적으로-알아야-할-개념">5-3. 기본적으로 알아야 할 개념</h2>
<ul>
<li>Route: <code>path</code>와 <code>element</code>로 매핑</li>
<li>Nested Routes(중첩 라우트): 레이아웃 공유 시 사용, <code>&lt;Outlet /&gt;</code>로 자식 렌더</li>
<li>Loader/Action(데이터 라우터 기능): 라우트 레벨 데이터 처리(팀 정책에 따라 사용 여부 결정)</li>
</ul>
<hr>
<h1 id="6-tanstackreact-query-tanstack-query">6) @tanstack/react-query (TanStack Query)</h1>
<h2 id="6-1-react-query가-뭔가">6-1. React Query가 뭔가</h2>
<ul>
<li>React에서 “서버 상태(server state)”를 관리하기 위한 라이브러리.</li>
<li><strong>패칭(fetch), 캐싱(cache), 동기화(sync), 재시도(retry), 백그라운드 갱신</strong>을 표준화한다.</li>
</ul>
<h2 id="6-2-왜-필요한가">6-2. 왜 필요한가</h2>
<p>React 기본 state로 서버 데이터를 관리하면:</p>
<ul>
<li>로딩/에러/성공 상태를 매번 수동 구현</li>
<li>캐싱/중복요청 방지/재시도/갱신 전략을 직접 구현</li>
<li>여러 화면에서 같은 데이터를 쓸 때 동기화가 어렵다</li>
</ul>
<p>React Query는 이걸 규칙으로 해결한다.</p>
<h2 id="6-3-가장-중요한-개념들필수">6-3. 가장 중요한 개념들(필수)</h2>
<ul>
<li>Query: 읽기 요청(조회)</li>
<li>Mutation: 쓰기 요청(생성/수정/삭제)</li>
<li>Query Key: 캐시 식별자(배열 형태 권장)</li>
<li>staleTime / gcTime(cacheTime): 신선도/캐시 유지 시간</li>
<li>refetch 옵션: mount/focus/reconnect 시 재요청 제어</li>
</ul>
<h2 id="6-4-기본-사용-패턴">6-4. 기본 사용 패턴</h2>
<h3 id="queryclientprovider">QueryClientProvider</h3>
<pre><code class="language-tsx">    import { QueryClient, QueryClientProvider } from &quot;@tanstack/react-query&quot;;

    const queryClient = new QueryClient();

    export function Root() {
        return (
            &lt;QueryClientProvider client={queryClient}&gt;
                {/* router 등 */}
            &lt;/QueryClientProvider&gt;
        );
    }</code></pre>
<h3 id="usequery">useQuery</h3>
<pre><code class="language-tsx">    import { useQuery } from &quot;@tanstack/react-query&quot;;

    type User = { id: string; name: string };

    async function fetchUsers(): Promise&lt;User[]&gt; {
        const res = await fetch(&quot;/api/users&quot;);
        if (!res.ok) throw new Error(&quot;Failed to fetch users&quot;);
        return (await res.json()) as User[];
    }

    export function Users() {
        const { data, isLoading, error } = useQuery({
            queryKey: [&quot;users&quot;],
            queryFn: fetchUsers,
            staleTime: 60_000,
        });

        if (isLoading) return &lt;div&gt;Loading...&lt;/div&gt;;
        if (error) return &lt;div&gt;Error&lt;/div&gt;;

        return (
            &lt;ul&gt;
                {data?.map((u) =&gt; (
                    &lt;li key={u.id}&gt;{u.name}&lt;/li&gt;
                ))}
            &lt;/ul&gt;
        );
    }</code></pre>
<h3 id="usemutation--invalidate">useMutation + invalidate</h3>
<pre><code class="language-tsx">    import { useMutation, useQueryClient } from &quot;@tanstack/react-query&quot;;

    async function createUser(name: string) {
        const res = await fetch(&quot;/api/users&quot;, {
            method: &quot;POST&quot;,
            headers: { &quot;Content-Type&quot;: &quot;application/json&quot; },
            body: JSON.stringify({ name }),
        });
        if (!res.ok) throw new Error(&quot;Failed to create user&quot;);
        return res.json();
    }

    export function CreateUser() {
        const qc = useQueryClient();

        const mutation = useMutation({
            mutationFn: createUser,
            onSuccess: async () =&gt; {
                await qc.invalidateQueries({ queryKey: [&quot;users&quot;] });
            },
        });

        return &lt;button onClick={() =&gt; mutation.mutate(&quot;Kim&quot;)}&gt;Add&lt;/button&gt;;
    }</code></pre>
<h2 id="6-5-실무에서-꼭-정해야-하는-규칙">6-5. 실무에서 꼭 정해야 하는 규칙</h2>
<ul>
<li>queryKey 네이밍/구조(예: <code>[&quot;liveReserve&quot;, &quot;list&quot;, params]</code>)</li>
<li>에러 처리 UX(토스트/페이지/재시도)</li>
<li>공통 fetch 래퍼(인증/에러 파싱/상태 코드 처리)</li>
</ul>
<hr>
<h1 id="7-react-compiler-babel-plugin-react-compiler">7) React Compiler (<code>babel-plugin-react-compiler</code>)</h1>
<h2 id="7-1-react-compiler가-뭔가">7-1. React Compiler가 뭔가</h2>
<ul>
<li>React 코드를 분석해 <strong>자동 memoization 최적화</strong>를 적용하려는 컴파일러.</li>
<li>목표: 개발자가 <code>useMemo</code>, <code>useCallback</code>, <code>React.memo</code>를 “언제 붙일지” 덜 고민해도 되게.</li>
</ul>
<h2 id="7-2-핵심-아이디어쉽게">7-2. 핵심 아이디어(쉽게)</h2>
<ul>
<li>컴포넌트는 렌더 때마다 함수가 실행되므로:<ul>
<li>렌더 안에서 만든 객체/배열/함수는 매번 새 참조가 생길 수 있고</li>
<li>props로 내려가면 자식 리렌더가 늘어날 수 있다</li>
</ul>
</li>
<li>컴파일러는 “이 값은 변하지 않는다”를 분석해 <strong>참조를 안정적으로 재사용</strong>하도록 변환한다(가능한 경우).</li>
</ul>
<h2 id="7-3-프로젝트에서-어떻게-적용되나">7-3. 프로젝트에서 어떻게 적용되나</h2>
<ul>
<li>Vite의 React 플러그인(Babel 단계)에 <code>babel-plugin-react-compiler</code>로 포함된다.</li>
<li>개발자는 별도 코드를 추가하지 않아도 <strong>빌드 단계에서 최적화 코드가 생성</strong>된다.</li>
</ul>
<h2 id="7-4-장점">7-4. 장점</h2>
<ul>
<li>수동 최적화(useMemo/useCallback)로 인한 복잡도를 줄일 수 있음</li>
<li>컴포넌트가 많아질수록 불필요한 리렌더를 줄일 가능성</li>
</ul>
<h2 id="7-5-주의할-점실무">7-5. 주의할 점(실무)</h2>
<ul>
<li>컴파일러는 “분석”을 하므로:<ul>
<li>일부 코드 패턴에서 제약/예상치 못한 동작이 있을 수 있음</li>
<li>빌드/디버깅 경험에 영향이 있을 수 있음</li>
</ul>
</li>
<li>“무조건 빨라진다”는 보장은 없음<br>→ 렌더 구조/데이터량/리스트 크기 같은 근본 병목이 더 중요함</li>
</ul>
<hr>
<h1 id="부록-a-이-스택으로-일할-때-기본-운영-원칙">부록 A) 이 스택으로 일할 때 기본 운영 원칙</h1>
<ul>
<li><strong>서버 데이터는 React Query로</strong>: 로딩/에러/캐싱/동기화를 표준화</li>
<li><strong>라우팅 경로는 상수화</strong>: 문자열 하드코딩 최소화</li>
<li><strong>Tailwind 토큰 규칙</strong>: 간격/라운드/텍스트 기본값만이라도 팀 합의</li>
<li><strong>Vite base/basename</strong>: 서브패스 배포 가능성 있으면 초기에 확정(운영 이슈 예방)</li>
<li><strong>타입은 억지로 엄격하게가 아니라 “핵심 경계(API/Props)”부터</strong> 잡기</li>
</ul>
<hr>
<h1 id="부록-b-체크리스트도입온보딩용">부록 B) 체크리스트(도입/온보딩용)</h1>
<ul>
<li><input disabled="" type="checkbox"> <code>bun install</code> / <code>bun run dev</code> 동작 확인</li>
<li><input disabled="" type="checkbox"> 라우팅 새로고침(직접 URL 진입) 시 404 여부 확인(서버 리라이트)</li>
<li><input disabled="" type="checkbox"> 환경변수 <code>VITE_</code> prefix 확인 + dev 서버 재시작</li>
<li><input disabled="" type="checkbox"> React Query 전역 Provider 주입 + queryKey 규칙 문서화</li>
<li><input disabled="" type="checkbox"> Tailwind 적용 확인 + 다크모드 정책(선택) 합의</li>
<li><input disabled="" type="checkbox"> 배포 경로(base/basename) 운영 환경과 일치 확인</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[정보처리기사 실기 파이썬 개념정리]]></title>
            <link>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC-fptba01h</link>
            <guid>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC-fptba01h</guid>
            <pubDate>Mon, 06 Oct 2025 03:10:11 GMT</pubDate>
            <description><![CDATA[<h2 id="✨-1-입력--출력과-형-변환">✨ 1. 입력 / 출력과 형 변환</h2>
<h3 id="📘-개념-설명">📘 개념 설명</h3>
<ul>
<li><code>input()</code>은 문자열을 입력받는다.</li>
<li>공백으로 구분된 여러 값을 받을 땐 <code>.split()</code>을 사용한다.</li>
<li>문자열을 숫자로 연산하려면 반드시 <code>int()</code> 또는 <code>float()</code>로 형 변환이 필요하다.</li>
<li>문자열 결합 시 <code>+</code>를 사용할 수 있지만, <strong>숫자는 반드시 str()로 변환해야 한다.</strong></li>
</ul>
<p><strong>🔹 기본 예시</strong></p>
<pre><code class="language-python">a, b = map(int, input().split())
print(f&quot;{a} + {b} = {a + b}&quot;)</code></pre>
<h3 id="📝-연습문제">📝 연습문제</h3>
<p>다음 코드를 실행했을 때의 출력 결과를 작성하시오.
(입력값은 <code>2 3</code>이다.)</p>
<pre><code class="language-python">print(&quot;파이썬 입출력에 대한 문제입니다.&quot;)
num1, num2 = input().split()
num1 = int(num1)
num2 = int(num2)
print(num1, num2)
print(f&quot;{num1} + {num2} = {num1 + num2}&quot;)</code></pre>
<p><strong>✅ 해설</strong></p>
<ol>
<li><code>input()</code> → <code>&quot;2 3&quot;</code></li>
<li><code>.split()</code> → <code>[&#39;2&#39;, &#39;3&#39;]</code></li>
<li><code>int()</code> 변환 → <code>num1=2</code>, <code>num2=3</code></li>
<li>출력 흐름:<pre><code>파이썬 입출력에 대한 문제입니다.
2 3
2 + 3 = 5</code></pre></li>
</ol>
<hr>
<h2 id="✨-2장-자료형과-type-함수">✨ 2장. 자료형과 type() 함수</h2>
<h3 id="📘-개념-설명-1">📘 개념 설명</h3>
<ul>
<li><code>type()</code>은 객체의 자료형을 반환한다.</li>
<li><code>int</code>, <code>float</code>, <code>str</code>, <code>tuple</code>, <code>set</code>, <code>dict</code> 등이 주요 자료형이다.</li>
<li><code>isinstance(x, int)</code>는 좀 더 권장되는 방식이다.</li>
</ul>
<p><strong>🔹 예시</strong></p>
<pre><code class="language-python">type(100)      # &lt;class &#39;int&#39;&gt;
type(&#39;100&#39;)    # &lt;class &#39;str&#39;&gt;
type(100.0)    # &lt;class &#39;float&#39;&gt;</code></pre>
<h3 id="📝-연습문제-1">📝 연습문제</h3>
<pre><code class="language-python">def func(value):
    if type(value) == type(100):
        return 100
    elif type(value) == type(&quot;&quot;):
        return len(value)
    else:
        return 20

a = &#39;100.0&#39;
b = 100.0
c = (100, 200)
print(func(a) + func(b) + func(c))</code></pre>
<p><strong>✅ 해설</strong></p>
<table>
<thead>
<tr>
<th>변수</th>
<th>자료형</th>
<th>반환값</th>
</tr>
</thead>
<tbody><tr>
<td><code>&#39;100.0&#39;</code></td>
<td>str</td>
<td>len(&#39;100.0&#39;) → 5</td>
</tr>
<tr>
<td><code>100.0</code></td>
<td>float</td>
<td>20</td>
</tr>
<tr>
<td><code>(100,200)</code></td>
<td>tuple</td>
<td>20</td>
</tr>
</tbody></table>
<ul>
<li>출력 결과:<pre><code>45</code></pre></li>
</ul>
<hr>
<h2 id="✨-3장-문자열-슬라이싱">✨ 3장. 문자열 슬라이싱</h2>
<h3 id="📘-개념-설명-2">📘 개념 설명</h3>
<ul>
<li>문자열은 <strong>불변 객체(immutable)</strong> 이며, 인덱스로 접근 가능하다.</li>
<li><code>문자열[start:end]</code> → <code>start</code>부터 <code>end-1</code>까지</li>
<li>부분 문자열을 잘라 결합할 수 있다.</li>
</ul>
<p><strong>🔹 예시</strong></p>
<pre><code class="language-python">a = &quot;REMEMBER NOVEMBER&quot;
print(a[:3])      # REM
print(a[12:16])   # EMBE</code></pre>
<h3 id="📝-연습문제-2">📝 연습문제</h3>
<pre><code class="language-python">a = &quot;REMEMBER NOVEMBER&quot;
b = a[:3] + a[12:16]
c = &quot;R AND %s&quot; % &quot;STR&quot;
print(b + c)</code></pre>
<p>✅ 해설</p>
<ul>
<li><p><code>a[:3]</code> → <code>&quot;REM&quot;</code></p>
</li>
<li><p><code>a[12:16]</code> → <code>&quot;EMBE&quot;</code></p>
</li>
<li><p><code>c</code> → <code>&quot;R AND STR&quot;</code></p>
</li>
<li><p><code>b + c</code> → <code>&quot;REMEMBE&quot; + &quot;R AND STR&quot;</code> = <code>REMEMBER AND STR</code></p>
</li>
<li><p>출력:</p>
<pre><code>REMEMBER AND STR</code></pre></li>
</ul>
<hr>
<h2 id="✨-4장-리스트와-슬라이싱">✨ 4장. 리스트와 슬라이싱</h2>
<h3 id="📘-개념-설명-3">📘 개념 설명</h3>
<ul>
<li>리스트는 <strong>가변 객체(mutable)</strong> 로 수정 가능하다.</li>
<li>인덱스: 0부터 시작.</li>
<li><code>lst[::2]</code> → 짝수 인덱스, <code>lst[1::2]</code> → 홀수 인덱스.</li>
</ul>
<p><strong>🔹 예시</strong></p>
<pre><code class="language-python">lst = [1,2,3,4,5,6]
print(lst[::2])  # [1,3,5]
print(lst[1::2]) # [2,4,6]</code></pre>
<h3 id="📝-연습문제-3">📝 연습문제</h3>
<pre><code class="language-python">def func(lst):
    for i in range(len(lst)//2):
        lst[i], lst[-i-1] = lst[-i-1], lst[i]

lst = [1,2,3,4,5,6]
func(lst)
print(sum(lst[::2]) - sum(lst[1::2]))</code></pre>
<p><strong>✅ 해설</strong></p>
<ul>
<li><p>리스트 뒤집기 후: <code>[6,5,4,3,2,1]</code></p>
</li>
<li><p>짝수 인덱스 합: 6 + 4 + 2 = 12</p>
</li>
<li><p>홀수 인덱스 합: 5 + 3 + 1 = 9</p>
</li>
<li><p>결과: <code>12 - 9 = 3</code></p>
</li>
<li><p>출력:</p>
<pre><code>3</code></pre></li>
</ul>
<hr>
<h2 id="✨-5장-딕셔너리-내포와-집합set">✨ 5장. 딕셔너리 내포와 집합(Set)</h2>
<h3 id="📘-개념-설명-4">📘 개념 설명</h3>
<ul>
<li><code>dict</code>는 <code>{key: value}</code> 형태.</li>
<li>집합(set)은 중복이 없고, 순서가 없다.</li>
<li><code>&amp;</code> 연산자는 교집합을 구한다.<pre><code class="language-python">dst = {i: i*2 for i in [1,2,3]}  # {1:2, 2:4, 3:6}
s = set(dst.values())             # {2,4,6}</code></pre>
</li>
</ul>
<h3 id="📝-연습문제-4">📝 연습문제</h3>
<pre><code class="language-python">lst = [1,2,3]
dst = {i: i*2 for i in lst}
s = set(dst.values())
dst[2] = 7
s.add(99)
print(len(s &amp; set(dst.values())))</code></pre>
<p><strong>✅ 해설</strong></p>
<ul>
<li><p><code>dst = {1:2, 2:7, 3:6}</code></p>
</li>
<li><p><code>s = {2,4,6,99}</code></p>
</li>
<li><p>교집합 <code>{2,6}</code> → 길이 <strong>2</strong></p>
</li>
<li><p>출력:</p>
<pre><code>2</code></pre></li>
</ul>
<hr>
<h2 id="✨-6장-함수의-기본값-인자">✨ 6장. 함수의 기본값 인자</h2>
<h3 id="📘-개념-설명-5">📘 개념 설명</h3>
<ul>
<li>함수 정의 시 인자에 기본값을 줄 수 있다.</li>
<li>호출 시 값을 생략하면 기본값이 사용된다.</li>
</ul>
<p><strong>🔹 예시</strong></p>
<pre><code class="language-python">def add(a, b=10):
    return a + b</code></pre>
<h3 id="📝-연습문제-5">📝 연습문제</h3>
<pre><code class="language-python">def exam(num1, num2=2):
    print(&#39;a=&#39;, num1, &#39;b=&#39;, num2)
exam(20)</code></pre>
<p><strong>✅ 해설</strong></p>
<ul>
<li><p><code>num1 = 20</code>, <code>num2</code>는 기본값 <code>2</code> 사용</p>
</li>
<li><p>출력:</p>
<pre><code>a= 20 b= 2</code></pre></li>
</ul>
<hr>
<h2 id="✨-7장-람다lambda와-map">✨ 7장. 람다(lambda)와 map()</h2>
<h3 id="📘-개념-설명-6">📘 개념 설명</h3>
<ul>
<li><code>lambda</code>는 간단한 익명 함수 정의 방법이다.</li>
<li><code>map()</code>은 리스트 요소 전체에 함수를 적용한다.</li>
</ul>
<p><strong>🔹 예시</strong></p>
<pre><code class="language-python">nums = [1,2,3]
print(list(map(lambda x: x+10, nums)))  # [11,12,13]</code></pre>
<h3 id="📝-연습문제-6">📝 연습문제</h3>
<pre><code class="language-python">TestList = [1,2,3,4,5]
TestList = list(map(lambda num : num + 100, TestList))
print(TestList)</code></pre>
<p><strong>✅ 해설</strong></p>
<ul>
<li>각 요소에 100을 더함 → <code>[101,102,103,104,105]</code></li>
</ul>
<hr>
<h2 id="✨-8장-중첩-리스트for문-2중-순회">✨ 8장. 중첩 리스트(for문 2중 순회)</h2>
<h3 id="📘-개념-설명-7">📘 개념 설명</h3>
<ul>
<li>리스트 안의 리스트를 순회할 때는 <strong>이중 for문</strong>을 사용한다.</li>
</ul>
<h3 id="📝-연습문제-7">📝 연습문제</h3>
<pre><code class="language-python">lol = [[1,2,3],[4,5],[6,7,8,9]]
print(lol[0])
print(lol[2][1])
for sub in lol:
    for item in sub:
        print(item, end = &#39;&#39;)
    print()</code></pre>
<p><strong>✅ 해설</strong></p>
<ol>
<li><code>lol[0]</code> → <code>[1, 2, 3]</code></li>
<li><code>lol[2][1]</code> → <code>7</code></li>
<li>반복문 출력:<pre><code>123
45
6789</code></pre></li>
</ol>
<hr>
<h2 id="✨-9장-부분-문자열-탐색">✨ 9장. 부분 문자열 탐색</h2>
<h3 id="📘-개념-설명-8">📘 개념 설명</h3>
<ul>
<li>문자열에서 특정 패턴이 등장하는 횟수를 구할 때, 슬라이싱으로 부분 문자열을 비교하는 기법이 자주 쓰인다.</li>
</ul>
<h3 id="📝-연습문제-8">📝 연습문제</h3>
<pre><code class="language-python">def fnCalculation(x,y):
    result = 0
    for i in range(len(x)):
        temp = x[i:i+len(y)]
        if temp == y:
            result += 1
    return result

a = &quot;abdcabcabca&quot;
p1 = &quot;ab&quot;
p2 = &quot;ca&quot;
print(f&quot;ab{fnCalculation(a,p1)}ca{fnCalculation(a,p2)}&quot;)</code></pre>
<p><strong>✅ 해설</strong></p>
<ul>
<li><p><code>&quot;ab&quot;</code> 3회</p>
</li>
<li><p><code>&quot;ca&quot;</code> 3회
→ <code>&quot;ab3ca3&quot;</code></p>
</li>
<li><p>출력:</p>
<pre><code>ab3ca3</code></pre></li>
</ul>
<hr>
<h2 id="✨-10장-트리-구조와-재귀">✨ 10장. 트리 구조와 재귀</h2>
<h3 id="📘-개념-설명-9">📘 개념 설명</h3>
<ul>
<li>재귀함수를 이용해 트리 탐색을 구현할 수 있다.</li>
<li>이진 트리의 부모 인덱스 = <code>(i-1)//2</code></li>
</ul>
<h3 id="📝-연습문제-9">📝 연습문제</h3>
<pre><code class="language-python">class Node:
    def __init__(self, value):
        self.value = value
        self.children = []

def tree(li):
    nodes = [Node(i) for i in li]
    for i in range(1, len(li)):
        nodes[(i - 1) // 2].children.append(nodes[i])
    return nodes[0]

def calc(node, level=0):
    if node is None:
        return 0
    return (node.value if level % 2 == 1 else 0) + sum(calc(n, level + 1) for n in node.children)

li = [3,5,8,12,15,18,21]
root = tree(li)
print(calc(root))</code></pre>
<p><strong>✅ 해설</strong></p>
<ul>
<li><p>트리 구조:</p>
<pre><code>      3
    /   \
   5     8
 /  \   / \
12  15 18 21</code></pre></li>
<li><p>홀수 레벨: 5 + 8 = 13</p>
</li>
<li><p>출력:</p>
<pre><code>13</code></pre></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[정보처리기사 실기 - 2025년 2회 파이썬 기출 풀이(딕셔너리 내포, set 연산, 교집합 문제)]]></title>
            <link>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-2025%EB%85%84-2%ED%9A%8C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B6%9C-%ED%92%80%EC%9D%B4%EB%94%95%EC%85%94%EB%84%88%EB%A6%AC-%EB%82%B4%ED%8F%AC-set-%EC%97%B0%EC%82%B0-%EA%B5%90%EC%A7%91%ED%95%A9-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-2025%EB%85%84-2%ED%9A%8C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B6%9C-%ED%92%80%EC%9D%B4%EB%94%95%EC%85%94%EB%84%88%EB%A6%AC-%EB%82%B4%ED%8F%AC-set-%EC%97%B0%EC%82%B0-%EA%B5%90%EC%A7%91%ED%95%A9-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Mon, 06 Oct 2025 01:05:47 GMT</pubDate>
            <description><![CDATA[<h2 id="✨-문제">✨ 문제</h2>
<pre><code class="language-python">lst = [1, 2, 3]
dst = {i: i * 2 for i in lst}
s = set(dst.values())
lst[0] = 99
dst[2] = 7
s.add(99)
print(len(s &amp; set(dst.values())))</code></pre>
<hr>
<h2 id="🎯-출제-의도">🎯 출제 의도</h2>
<ul>
<li><strong>딕셔너리 내포(Dictionary Comprehension)</strong> 문법 이해</li>
<li><strong>set(집합)</strong> 자료형의 특징과 연산자(<code>&amp;</code>) 이해</li>
<li><strong>객체 간 참조 변경</strong>과 <strong>자료 구조 간 독립성</strong> 확인</li>
<li><strong>len()</strong> 과 교집합 결과의 길이 계산</li>
</ul>
<hr>
<h2 id="📘-개념-정리">📘 개념 정리</h2>
<h3 id="1-딕셔너리-내포-dictionary-comprehension">1. 딕셔너리 내포 (Dictionary Comprehension)</h3>
<pre><code class="language-python">dst = {i: i * 2 for i in lst}</code></pre>
<ul>
<li><code>lst = [1, 2, 3]</code></li>
<li>각 <code>i</code>에 대해 <code>key=i</code>, <code>value=i*2</code></li>
</ul>
<p>➡ 결과:</p>
<pre><code class="language-python">dst = {1: 2, 2: 4, 3: 6}</code></pre>
<h3 id="2-집합-생성">2. 집합 생성</h3>
<pre><code class="language-python">s = set(dst.values())</code></pre>
<ul>
<li>딕셔너리의 value들 <code>{2, 4, 6}</code>을 set으로 변환
➡ <code>s = {2, 4, 6}</code></li>
</ul>
<h3 id="3-리스트-변경">3. 리스트 변경</h3>
<pre><code class="language-python">lst[0] = 99</code></pre>
<ul>
<li>리스트 첫 번째 값이 바뀌어도, 이미 생성된 <code>dst</code>는 리스트와 <strong>연결되지 않음 (깊은 복사 X)</strong>
➡ <code>dst</code>는 여전히 <code>{1: 2, 2: 4, 3: 6}</code> 유지됨.</li>
</ul>
<h3 id="4-딕셔너리-값-변경">4. 딕셔너리 값 변경</h3>
<pre><code class="language-python">dst[2] = 7</code></pre>
<p>➡ <code>dst</code>는 <code>{1: 2, 2: 7, 3: 6}</code>
➡ <code>dst.values()</code> = <code>[2, 7, 6]</code></p>
<h3 id="5-집합에-값-추가">5. 집합에 값 추가</h3>
<pre><code class="language-python">s.add(99)</code></pre>
<p>➡ <code>s = {2, 4, 6, 99}</code></p>
<h3 id="6-교집합-연산">6. 교집합 연산</h3>
<pre><code class="language-python">s &amp; set(dst.values())</code></pre>
<ul>
<li><code>s = {2, 4, 6, 99}</code></li>
<li><code>set(dst.values()) = {2, 7, 6}</code></li>
<li>교집합(<code>&amp;</code>) → <code>{2, 6}</code></li>
</ul>
<h3 id="7-길이-계산">7. 길이 계산</h3>
<pre><code class="language-python">len({2, 6}) = 2</code></pre>
<hr>
<h2 id="✅-최종-출력-결과">✅ 최종 출력 결과</h2>
<pre><code>2</code></pre><hr>
<h2 id="💡-정리">💡 정리</h2>
<p>이 문제에서 꼭 알아야 할 개념:</p>
<table>
<thead>
<tr>
<th>개념</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><strong>딕셔너리 내포</strong></td>
<td><code>{i: i*2 for i in lst}</code> 형태로 간결하게 딕셔너리 생성</td>
</tr>
<tr>
<td><strong>set()</strong></td>
<td>중복 없는 집합 구조, 순서 없음</td>
</tr>
<tr>
<td><strong>교집합(&amp;)</strong></td>
<td>두 집합의 공통 원소만 반환</td>
</tr>
<tr>
<td><strong>리스트 변경 vs 딕셔너리 독립성</strong></td>
<td><code>dst</code>는 <code>lst</code>의 이후 변경에 영향을 받지 않음</td>
</tr>
<tr>
<td><strong>len()</strong></td>
<td>집합의 원소 개수 반환</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[정보처리기사 실기 - 2025년 1회 파이썬 기출 풀이(집합 자료형 set의 특징과 중복 처리 문제)]]></title>
            <link>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-2025%EB%85%84-1%ED%9A%8C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B6%9C-%ED%92%80%EC%9D%B4%EC%A7%91%ED%95%A9-%EC%9E%90%EB%A3%8C%ED%98%95-set%EC%9D%98-%ED%8A%B9%EC%A7%95%EA%B3%BC-%EC%A4%91%EB%B3%B5-%EC%B2%98%EB%A6%AC-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-2025%EB%85%84-1%ED%9A%8C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B6%9C-%ED%92%80%EC%9D%B4%EC%A7%91%ED%95%A9-%EC%9E%90%EB%A3%8C%ED%98%95-set%EC%9D%98-%ED%8A%B9%EC%A7%95%EA%B3%BC-%EC%A4%91%EB%B3%B5-%EC%B2%98%EB%A6%AC-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Mon, 06 Oct 2025 00:59:38 GMT</pubDate>
            <description><![CDATA[<h2 id="✨-문제">✨ 문제</h2>
<pre><code class="language-python">class Node:
    def __init__(self, value):
        self.value = value
        self.children = []

def tree(li):
    nodes = [Node(i) for i in li]
    for i in range(1, len(li)):
        nodes[(i - 1) // 2].children.append(nodes[i])
    return nodes[0]

def calc(node, level=0):
    if node is None:
        return 0
    return (node.value if level % 2 == 1 else 0) + sum(calc(n, level + 1) for n in node.children)

li = [3, 5, 8, 12, 15, 18, 21]

root = tree(li)

print(calc(root))</code></pre>
<hr>
<h2 id="🎯-출제-의도">🎯 출제 의도</h2>
<ul>
<li>리스트로 <strong>이진 트리 구조를 구성하는 방식</strong> 이해</li>
<li><strong>(i - 1) // 2</strong> 로 부모-자식 관계 계산 원리 파악</li>
<li><strong>재귀함수와 level(깊이)</strong> 활용 구조 이해</li>
<li><strong>짝수/홀수 레벨 조건 처리</strong> (<code>level % 2 == 1</code>) 확인</li>
</ul>
<hr>
<h2 id="📘-개념-정리">📘 개념 정리</h2>
<h3 id="1-트리-구조-생성">1. 트리 구조 생성</h3>
<pre><code class="language-python">for i in range(1, len(li)):
    nodes[(i - 1) // 2].children.append(nodes[i])</code></pre>
<ul>
<li><code>(i - 1) // 2</code>는 <strong>이진 트리의 부모 인덱스 계산 공식</strong>이다.</li>
<li>예:</li>
</ul>
<table>
<thead>
<tr>
<th>i</th>
<th>부모 인덱스 ( (i-1)//2 )</th>
<th>부모값</th>
<th>자식값</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>0</td>
<td>3</td>
<td>5</td>
</tr>
<tr>
<td>2</td>
<td>0</td>
<td>3</td>
<td>8</td>
</tr>
<tr>
<td>3</td>
<td>1</td>
<td>5</td>
<td>12</td>
</tr>
<tr>
<td>4</td>
<td>1</td>
<td>5</td>
<td>15</td>
</tr>
<tr>
<td>5</td>
<td>2</td>
<td>8</td>
<td>18</td>
</tr>
<tr>
<td>6</td>
<td>2</td>
<td>8</td>
<td>21</td>
</tr>
</tbody></table>
<p>➡ 트리 구조를 그리면 아래와 같다:</p>
<pre><code>          3(level 0)
       /           \
     5(level 1)    8(level 1)
   /     \        /     \
12(2)   15(2)  18(2)   21(2)</code></pre><h3 id="2-calcnode-level-함수-분석">2. <code>calc(node, level)</code> 함수 분석</h3>
<pre><code class="language-python">return (node.value if level % 2 == 1 else 0) + sum(calc(n, level + 1) for n in node.children)</code></pre>
<ul>
<li><strong>홀수 레벨(level % 2 == 1)</strong>이면 해당 노드의 value를 더함</li>
<li>자식 노드가 있다면 재귀적으로 다음 레벨(<code>level+1</code>) 탐색</li>
<li>최종적으로 <strong>모든 노드를 돌며 홀수 레벨 노드들의 합을 계산</strong></li>
</ul>
<hr>
<h2 id="📝-풀이-과정">📝 풀이 과정</h2>
<table>
<thead>
<tr>
<th>레벨(level)</th>
<th>노드 값</th>
<th>포함 여부 (<code>level % 2 == 1</code>)</th>
<th>누적 합</th>
</tr>
</thead>
<tbody><tr>
<td>0</td>
<td>3</td>
<td>❌</td>
<td>0</td>
</tr>
<tr>
<td>1</td>
<td>5, 8</td>
<td>✅</td>
<td>5 + 8 = 13</td>
</tr>
<tr>
<td>2</td>
<td>12, 15, 18, 21</td>
<td>❌</td>
<td>+0</td>
</tr>
</tbody></table>
<p>따라서 최종 합은</p>
<pre><code>13</code></pre><hr>
<h2 id="✅-최종-출력-결과">✅ 최종 출력 결과</h2>
<pre><code>13</code></pre><hr>
<h2 id="💡-정리">💡 정리</h2>
<p>이 문제에서 꼭 알아야 할 개념:</p>
<ul>
<li><strong>이진 트리 부모 인덱스 계산식:</strong> <code>(i - 1) // 2</code></li>
<li><strong>홀수 레벨(level % 2 == 1)</strong> 노드만 더함</li>
<li><strong>재귀 구조:</strong>
<code>sum(calc(n, level + 1) for n in node.children)</code> 로 하위 노드 전체 탐색</li>
<li><strong>트리 깊이별 구조 시각화</strong>로 로직을 쉽게 이해할 수 있음.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[정보처리기사 실기 - 2024년 3회 파이썬 기출 풀이(리스트 원소 교환과 슬라이싱을 이용한 합계 계산 문제)]]></title>
            <link>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-2024%EB%85%84-3%ED%9A%8C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B6%9C-%ED%92%80%EC%9D%B4%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EC%9B%90%EC%86%8C-%EA%B5%90%ED%99%98%EA%B3%BC-%EC%8A%AC%EB%9D%BC%EC%9D%B4%EC%8B%B1%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%ED%95%A9%EA%B3%84-%EA%B3%84%EC%82%B0-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-2024%EB%85%84-3%ED%9A%8C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B6%9C-%ED%92%80%EC%9D%B4%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EC%9B%90%EC%86%8C-%EA%B5%90%ED%99%98%EA%B3%BC-%EC%8A%AC%EB%9D%BC%EC%9D%B4%EC%8B%B1%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%ED%95%A9%EA%B3%84-%EA%B3%84%EC%82%B0-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Mon, 06 Oct 2025 00:52:35 GMT</pubDate>
            <description><![CDATA[<h2 id="✨-문제">✨ 문제</h2>
<pre><code class="language-python">def func(lst):
    for i in range(len(lst)//2):
        lst[i], lst[-i-1] = lst[-i-1], lst[i]

lst = [1, 2, 3, 4, 5, 6]
func(lst)
print(sum(lst[::2]) - sum(lst[1::2]))</code></pre>
<hr>
<h2 id="🎯-출제-의도">🎯 출제 의도</h2>
<ul>
<li><strong>리스트 인덱스 음수 처리(<code>-i-1</code>)</strong> 개념 이해</li>
<li>리스트의 <strong>절반 교환 구조</strong>(역순) 파악</li>
<li><strong>슬라이싱</strong> <code>lst[::2]</code>, <code>lst[1::2]</code> 의미와 합계 비교</li>
</ul>
<hr>
<h2 id="📘-개념-정리">📘 개념 정리</h2>
<h3 id="1-리스트-교환-구조">1. 리스트 교환 구조</h3>
<pre><code class="language-python">for i in range(len(lst)//2):
    lst[i], lst[-i-1] = lst[-i-1], lst[i]</code></pre>
<ul>
<li><code>len(lst) // 2</code> → 리스트 길이의 절반만 반복 (대칭 교환)</li>
<li><code>lst[i]</code> ↔ <code>lst[-i-1]</code>
→ 맨 앞과 맨 뒤부터 차례로 자리 바꿈</li>
</ul>
<h3 id="2-초기-리스트-상태">2. 초기 리스트 상태</h3>
<pre><code class="language-python">lst = [1, 2, 3, 4, 5, 6]</code></pre>
<ul>
<li>길이 = 6 → <code>len(lst)//2 = 3</code> → <code>i = 0, 1, 2</code> 일 때만 반복</li>
</ul>
<hr>
<h2 id="📝-풀이-과정">📝 풀이 과정</h2>
<table>
<thead>
<tr>
<th align="center">i</th>
<th align="center">교환 위치</th>
<th align="center">교환 전</th>
<th align="center">교환 후</th>
</tr>
</thead>
<tbody><tr>
<td align="center">0</td>
<td align="center">[0] ↔ [-1]</td>
<td align="center"><code>[1,2,3,4,5,6]</code></td>
<td align="center"><code>[6,2,3,4,5,1]</code></td>
</tr>
<tr>
<td align="center">1</td>
<td align="center">[1] ↔ [-2]</td>
<td align="center"><code>[6,2,3,4,5,1]</code></td>
<td align="center"><code>[6,5,3,4,2,1]</code></td>
</tr>
<tr>
<td align="center">2</td>
<td align="center">[2] ↔ [-3]</td>
<td align="center"><code>[6,5,3,4,2,1]</code></td>
<td align="center"><code>[6,5,4,3,2,1]</code></td>
</tr>
</tbody></table>
<p><strong>✅ 최종 리스트:</strong></p>
<pre><code>[6, 5, 4, 3, 2, 1]</code></pre><ul>
<li><p><strong>슬라이싱 분석</strong></p>
<ul>
<li><p><code>lst[::2]</code> → 짝수 인덱스(0,2,4)</p>
<pre><code class="language-python">[6, 4, 2]
sum = 12</code></pre>
</li>
<li><p><code>lst[1::2]</code> → 홀수 인덱스(1,3,5)</p>
<pre><code class="language-python">[5, 3, 1]
sum = 9</code></pre>
</li>
</ul>
</li>
</ul>
<p><strong>🧮 최종 계산</strong></p>
<pre><code class="language-python">sum(lst[::2]) - sum(lst[1::2])
= 12 - 9
= 3</code></pre>
<hr>
<h2 id="✅-최종-출력-결과">✅ 최종 출력 결과</h2>
<pre><code>3</code></pre><hr>
<h2 id="💡-정리">💡 정리</h2>
<p>이 문제에서 꼭 알아야 할 개념:</p>
<ul>
<li><strong>음수 인덱스(-i-1)</strong> 는 뒤에서부터 접근한다.<ul>
<li><code>lst[-1]</code> → 마지막 원소</li>
<li><code>lst[-i-1]</code> → 뒤에서 (i+1)번째 원소</li>
</ul>
</li>
<li><strong>리스트 길이의 절반만 교환</strong>하면 전체가 뒤집힌다.</li>
<li><strong>슬라이싱</strong><ul>
<li><code>lst[::2]</code> → 0,2,4,… (짝수 인덱스)</li>
<li><code>lst[1::2]</code> → 1,3,5,… (홀수 인덱스)</li>
</ul>
</li>
<li><strong>합계 차이 계산</strong>: 짝수 인덱스 합 - 홀수 인덱스 합</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[정보처리기사 실기 - 2024년 2회 파이썬 기출 풀이(문자열 슬라이싱을 이용한 부분 문자열 탐색 문제)]]></title>
            <link>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-2024%EB%85%84-2%ED%9A%8C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B6%9C-%ED%92%80%EC%9D%B4%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%8A%AC%EB%9D%BC%EC%9D%B4%EC%8B%B1%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%B6%80%EB%B6%84-%EB%AC%B8%EC%9E%90%EC%97%B4-%ED%83%90%EC%83%89-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-2024%EB%85%84-2%ED%9A%8C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B6%9C-%ED%92%80%EC%9D%B4%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%8A%AC%EB%9D%BC%EC%9D%B4%EC%8B%B1%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%B6%80%EB%B6%84-%EB%AC%B8%EC%9E%90%EC%97%B4-%ED%83%90%EC%83%89-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Mon, 06 Oct 2025 00:45:33 GMT</pubDate>
            <description><![CDATA[<h2 id="✨-문제">✨ 문제</h2>
<pre><code class="language-python">def fnCalculation(x, y):
    result = 0
    for i in range(len(x)):
        temp = x[i:i+len(y)]
        if temp == y:
            result += 1
    return result

a = &quot;abdcabcabca&quot;
p1 = &quot;ab&quot;
p2 = &quot;ca&quot;

out = f&quot;ab{fnCalculation(a, p1)}ca{fnCalculation(a, p2)}&quot;
print(out)</code></pre>
<hr>
<h2 id="🎯-출제-의도">🎯 출제 의도</h2>
<ul>
<li><strong>문자열 슬라이싱(<code>x[i:i+len(y)]</code>)</strong> 의 범위 동작 이해</li>
<li><strong>부분 문자열(substring)</strong> 탐색 로직 파악</li>
<li><strong>포매팅 f-string</strong> 의 활용법 (<code>f&quot;문자열{값}&quot;</code>)</li>
<li><strong>for문 + if 조건문</strong> 을 이용한 카운트 알고리즘 이해</li>
</ul>
<hr>
<h2 id="📘-개념-정리">📘 개념 정리</h2>
<h3 id="1-함수-fncalculationx-y의-역할">1. 함수 <code>fnCalculation(x, y)</code>의 역할</h3>
<pre><code class="language-python">def fnCalculation(x, y):
    result = 0
    for i in range(len(x)):
        temp = x[i:i+len(y)]
        if temp == y:
            result += 1
    return result</code></pre>
<ul>
<li>문자열 <code>x</code> 안에서, 부분 문자열 <code>y</code>가 <strong>몇 번 등장하는지 세는 함수</strong></li>
<li><code>x[i:i+len(y)]</code> 로 슬라이싱하여 길이 <code>len(y)</code>인 부분 문자열을 순서대로 비교</li>
<li>일치할 때마다 <code>result</code> 값 1 증가</li>
</ul>
<h3 id="2-변수-값-확인">2. 변수 값 확인</h3>
<pre><code class="language-python">a = &quot;abdcabcabca&quot;
p1 = &quot;ab&quot;
p2 = &quot;ca&quot;</code></pre>
<hr>
<h2 id="📝-풀이-과정">📝 풀이 과정</h2>
<ol>
<li><code>fnCalculation(a, p1)</code> → <code>&quot;ab&quot;</code> 찾기</li>
</ol>
<table>
<thead>
<tr>
<th align="right">i</th>
<th align="center">슬라이싱 <code>x[i:i+2]</code></th>
<th align="center">비교</th>
<th align="center">결과</th>
</tr>
</thead>
<tbody><tr>
<td align="right">0</td>
<td align="center"><code>&quot;ab&quot;</code></td>
<td align="center">✅ 같음</td>
<td align="center">result = 1</td>
</tr>
<tr>
<td align="right">1</td>
<td align="center"><code>&quot;bd&quot;</code></td>
<td align="center">❌</td>
<td align="center">1</td>
</tr>
<tr>
<td align="right">2</td>
<td align="center"><code>&quot;dc&quot;</code></td>
<td align="center">❌</td>
<td align="center">1</td>
</tr>
<tr>
<td align="right">3</td>
<td align="center"><code>&quot;ca&quot;</code></td>
<td align="center">❌</td>
<td align="center">1</td>
</tr>
<tr>
<td align="right">4</td>
<td align="center"><code>&quot;ab&quot;</code></td>
<td align="center">✅ 같음</td>
<td align="center">result = 2</td>
</tr>
<tr>
<td align="right">5</td>
<td align="center"><code>&quot;bc&quot;</code></td>
<td align="center">❌</td>
<td align="center">2</td>
</tr>
<tr>
<td align="right">6</td>
<td align="center"><code>&quot;ca&quot;</code></td>
<td align="center">❌</td>
<td align="center">2</td>
</tr>
<tr>
<td align="right">7</td>
<td align="center"><code>&quot;ab&quot;</code></td>
<td align="center">✅ 같음</td>
<td align="center">result = 3</td>
</tr>
<tr>
<td align="right">8</td>
<td align="center"><code>&quot;bc&quot;</code></td>
<td align="center">❌</td>
<td align="center">3</td>
</tr>
<tr>
<td align="right">9</td>
<td align="center"><code>&quot;ca&quot;</code></td>
<td align="center">❌</td>
<td align="center">3</td>
</tr>
</tbody></table>
<p>✅ <code>&quot;ab&quot;</code>는 총 <strong>3회 등장</strong></p>
<ol start="2">
<li><code>fnCalculation(a, p2)</code> → <code>&quot;ca&quot;</code> 찾기</li>
</ol>
<table>
<thead>
<tr>
<th align="right">i</th>
<th align="center">슬라이싱 <code>x[i:i+2]</code></th>
<th align="center">비교</th>
<th align="center">결과</th>
</tr>
</thead>
<tbody><tr>
<td align="right">0</td>
<td align="center"><code>&quot;ab&quot;</code></td>
<td align="center">❌</td>
<td align="center">0</td>
</tr>
<tr>
<td align="right">1</td>
<td align="center"><code>&quot;bd&quot;</code></td>
<td align="center">❌</td>
<td align="center">0</td>
</tr>
<tr>
<td align="right">2</td>
<td align="center"><code>&quot;dc&quot;</code></td>
<td align="center">❌</td>
<td align="center">0</td>
</tr>
<tr>
<td align="right">3</td>
<td align="center"><code>&quot;ca&quot;</code></td>
<td align="center">✅ 같음</td>
<td align="center">result = 1</td>
</tr>
<tr>
<td align="right">4</td>
<td align="center"><code>&quot;ab&quot;</code></td>
<td align="center">❌</td>
<td align="center">1</td>
</tr>
<tr>
<td align="right">5</td>
<td align="center"><code>&quot;bc&quot;</code></td>
<td align="center">❌</td>
<td align="center">1</td>
</tr>
<tr>
<td align="right">6</td>
<td align="center"><code>&quot;ca&quot;</code></td>
<td align="center">✅ 같음</td>
<td align="center">result = 2</td>
</tr>
<tr>
<td align="right">7</td>
<td align="center"><code>&quot;ab&quot;</code></td>
<td align="center">❌</td>
<td align="center">2</td>
</tr>
<tr>
<td align="right">8</td>
<td align="center"><code>&quot;bc&quot;</code></td>
<td align="center">❌</td>
<td align="center">2</td>
</tr>
<tr>
<td align="right">9</td>
<td align="center"><code>&quot;ca&quot;</code></td>
<td align="center">✅ 같음</td>
<td align="center">result = 3</td>
</tr>
</tbody></table>
<p>✅ <code>&quot;ca&quot;</code>도 총 <strong>3회 등장</strong></p>
<ol start="3">
<li>최종 문자열 조합<pre><code class="language-python">out = f&quot;ab{fnCalculation(a, p1)}ca{fnCalculation(a, p2)}&quot;</code></pre>
</li>
</ol>
<ul>
<li><code>fnCalculation(a, p1)</code> → <code>3</code></li>
<li><code>fnCalculation(a, p2)</code> → <code>3</code>
➡ <code>&quot;ab&quot; + &quot;3&quot; + &quot;ca&quot; + &quot;3&quot;</code> → <code>&quot;ab3ca3&quot;</code></li>
</ul>
<hr>
<h2 id="✅-최종-출력-결과">✅ 최종 출력 결과</h2>
<pre><code>ab3ca3</code></pre><hr>
<h2 id="💡-정리">💡 정리</h2>
<p>이 문제에서 꼭 알아야 할 개념:</p>
<ul>
<li><strong>슬라이싱 규칙</strong>
<code>a[i:i+len(y)]</code> → 인덱스 i부터 <code>len(y)</code> 길이만큼의 부분 문자열 추출</li>
<li><strong>문자열 비교</strong>
<code>if temp == y:</code> → 부분 문자열이 같을 때만 카운트</li>
<li><strong>for문 범위</strong>
<code>range(len(x))</code> 으로 모든 시작 인덱스 순회</li>
<li><strong>f-string</strong>
<code>f&quot;ab{값}ca{값}&quot;</code> 형태로 문자열과 변수 결합 가능</li>
<li>문자열 <code>&quot;ab3ca3&quot;</code>은 <code>p1</code>, <code>p2</code> 각각 3회 등장 결과를 반영한 것이다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[정보처리기사 실기 - 2024년 1회 파이썬 기출 풀이(리스트 순회와 문자열 인덱싱 문제)]]></title>
            <link>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-2024%EB%85%84-1%ED%9A%8C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B6%9C-%ED%92%80%EC%9D%B4%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EC%88%9C%ED%9A%8C%EC%99%80-%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%9D%B8%EB%8D%B1%EC%8B%B1-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-2024%EB%85%84-1%ED%9A%8C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B6%9C-%ED%92%80%EC%9D%B4%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EC%88%9C%ED%9A%8C%EC%99%80-%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%9D%B8%EB%8D%B1%EC%8B%B1-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Mon, 06 Oct 2025 00:41:05 GMT</pubDate>
            <description><![CDATA[<h2 id="✨-문제">✨ 문제</h2>
<pre><code class="language-python">a = [&quot;Seoul&quot;, &quot;Kyeonggi&quot;, &quot;Incheon&quot;, &quot;Daejun&quot;, &quot;Daegu&quot;, &quot;Pusan&quot;]
str = &quot;S&quot;

for i in a:
    str = str + i[1]

print(str)</code></pre>
<hr>
<h2 id="🎯-출제-의도">🎯 출제 의도</h2>
<ul>
<li><strong>리스트 요소 접근과 반복문(<code>for</code>)</strong> 의 기본 구조 이해</li>
<li>문자열의 <strong>인덱싱(<code>i[1]</code>)</strong> 개념 확인</li>
<li>문자열 <strong>덧셈(연결)</strong> 동작 파악</li>
</ul>
<hr>
<h2 id="📘-개념-정리">📘 개념 정리</h2>
<h3 id="1-리스트-구조">1. 리스트 구조.</h3>
<pre><code class="language-python">a = [&quot;Seoul&quot;, &quot;Kyeonggi&quot;, &quot;Incheon&quot;, &quot;Daejun&quot;, &quot;Daegu&quot;, &quot;Pusan&quot;]</code></pre>
<table>
<thead>
<tr>
<th align="center">인덱스</th>
<th align="center">원소</th>
<th align="center">i[1] (두 번째 문자)</th>
</tr>
</thead>
<tbody><tr>
<td align="center">0</td>
<td align="center">&quot;Seoul&quot;</td>
<td align="center">&#39;e&#39;</td>
</tr>
<tr>
<td align="center">1</td>
<td align="center">&quot;Kyeonggi&quot;</td>
<td align="center">&#39;y&#39;</td>
</tr>
<tr>
<td align="center">2</td>
<td align="center">&quot;Incheon&quot;</td>
<td align="center">&#39;n&#39;</td>
</tr>
<tr>
<td align="center">3</td>
<td align="center">&quot;Daejun&quot;</td>
<td align="center">&#39;a&#39;</td>
</tr>
<tr>
<td align="center">4</td>
<td align="center">&quot;Daegu&quot;</td>
<td align="center">&#39;a&#39;</td>
</tr>
<tr>
<td align="center">5</td>
<td align="center">&quot;Pusan&quot;</td>
<td align="center">&#39;u&#39;</td>
</tr>
</tbody></table>
<h3 id="2-문자열-누적-구조">2. 문자열 누적 구조</h3>
<pre><code class="language-python">str = &quot;S&quot;
for i in a:
    str = str + i[1]</code></pre>
<ul>
<li>반복문이 돌 때마다, 각 도시 이름의 <strong>두 번째 글자(<code>i[1]</code>)</strong> 를 이어붙임.</li>
<li><code>str</code> 변수에 누적되어 문자열이 점점 길어짐.</li>
</ul>
<hr>
<h2 id="📝-풀이-과정">📝 풀이 과정</h2>
<table>
<thead>
<tr>
<th>단계</th>
<th>i</th>
<th>i[1]</th>
<th>str 누적 결과</th>
</tr>
</thead>
<tbody><tr>
<td>초기값</td>
<td>—</td>
<td>—</td>
<td><code>&quot;S&quot;</code></td>
</tr>
<tr>
<td>①</td>
<td>&quot;Seoul&quot;</td>
<td><code>&#39;e&#39;</code></td>
<td><code>&quot;Se&quot;</code></td>
</tr>
<tr>
<td>②</td>
<td>&quot;Kyeonggi&quot;</td>
<td><code>&#39;y&#39;</code></td>
<td><code>&quot;Sey&quot;</code></td>
</tr>
<tr>
<td>③</td>
<td>&quot;Incheon&quot;</td>
<td><code>&#39;n&#39;</code></td>
<td><code>&quot;Seyn&quot;</code></td>
</tr>
<tr>
<td>④</td>
<td>&quot;Daejun&quot;</td>
<td><code>&#39;a&#39;</code></td>
<td><code>&quot;Seyna&quot;</code></td>
</tr>
<tr>
<td>⑤</td>
<td>&quot;Daegu&quot;</td>
<td><code>&#39;a&#39;</code></td>
<td><code>&quot;Seynaa&quot;</code></td>
</tr>
<tr>
<td>⑥</td>
<td>&quot;Pusan&quot;</td>
<td><code>&#39;u&#39;</code></td>
<td><code>&quot;Seynaau&quot;</code></td>
</tr>
</tbody></table>
<hr>
<h2 id="✅-최종-출력-결과">✅ 최종 출력 결과</h2>
<pre><code>Seynaau</code></pre><hr>
<h2 id="💡-정리">💡 정리</h2>
<p>이 문제에서 꼭 알아야 할 개념:</p>
<ul>
<li><strong>리스트 순회</strong><ul>
<li><code>for i in a:</code> → 리스트의 각 요소를 차례로 가져옴.</li>
</ul>
</li>
<li><strong>문자열 인덱싱</strong><ul>
<li><code>i[1]</code> → 두 번째 문자(인덱스는 0부터 시작).</li>
</ul>
</li>
<li><strong>문자열 덧셈(<code>+</code>)</strong><ul>
<li>문자열은 연결(concatenation) 가능.</li>
<li><code>str = str + i[1]</code> → 누적 문자열 생성.</li>
</ul>
</li>
<li>문자열은 <strong>불변(immutable)</strong> 이지만, 덧셈 시 새 문자열이 계속 만들어진다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[정보처리기사 실기 - 2023년 3회 파이썬 기출 풀이(입력값 처리와 형 변환, 문자열 결합 오류 문제)]]></title>
            <link>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-2023%EB%85%84-3%ED%9A%8C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B6%9C-%ED%92%80%EC%9D%B4%EC%9E%85%EB%A0%A5%EA%B0%92-%EC%B2%98%EB%A6%AC%EC%99%80-%ED%98%95-%EB%B3%80%ED%99%98-%EB%AC%B8%EC%9E%90%EC%97%B4-%EA%B2%B0%ED%95%A9-%EC%98%A4%EB%A5%98-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-2023%EB%85%84-3%ED%9A%8C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B6%9C-%ED%92%80%EC%9D%B4%EC%9E%85%EB%A0%A5%EA%B0%92-%EC%B2%98%EB%A6%AC%EC%99%80-%ED%98%95-%EB%B3%80%ED%99%98-%EB%AC%B8%EC%9E%90%EC%97%B4-%EA%B2%B0%ED%95%A9-%EC%98%A4%EB%A5%98-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Mon, 06 Oct 2025 00:18:28 GMT</pubDate>
            <description><![CDATA[<h2 id="✨-문제">✨ 문제</h2>
<pre><code class="language-python">print(&quot;파이썬 입출력에 대한 문제입니다.&quot;)

num1, num2 = input()._____()
num1 = int(num1)
num2 = int(num2)
print(num1, num2)

num3 = num1 + num2
print(num1 + &quot; + &quot;  + num2 + &quot; = &quot; + num3)</code></pre>
<hr>
<h2 id="🎯-출제-의도">🎯 출제 의도</h2>
<ul>
<li><code>input()</code> 함수로 여러 값을 한 줄에 입력받는 방법 이해</li>
<li>문자열 분리 함수(<code>split()</code>)의 사용법</li>
<li><code>int()</code>를 이용한 정수 변환</li>
<li>문자열 결합 시 <strong>형 변환 필요성</strong> 이해</li>
</ul>
<hr>
<h2 id="📘-개념-정리">📘 개념 정리</h2>
<h3 id="1-input-함수">1. <code>input()</code> 함수</h3>
<ul>
<li>기본적으로 문자열 전체를 한 줄로 입력받는다.</li>
<li>예:<pre><code>input() → &#39;2 3&#39;</code></pre></li>
</ul>
<h3 id="2-문자열-분리split">2. 문자열 분리(<code>split()</code>)</h3>
<ul>
<li><code>input().split()</code>
→ 입력받은 문자열을 <strong>공백 기준으로 나누어 리스트로 반환</strong>한다.
예시:<pre><code class="language-python">num1, num2 = input().split()</code></pre>
</li>
</ul>
<h3 id="3-형-변환int">3. 형 변환(<code>int()</code>)</h3>
<ul>
<li>입력값은 문자열이므로, 정수 연산을 위해 <code>int()</code>로 변환해야 한다.<pre><code class="language-python">num1 = int(num1)
num2 = int(num2)</code></pre>
→ <code>num1 = 2</code>, <code>num2 = 3</code></li>
</ul>
<hr>
<h2 id="📝-풀이-과정">📝 풀이 과정</h2>
<table>
<thead>
<tr>
<th>단계</th>
<th>코드</th>
<th>결과</th>
</tr>
</thead>
<tbody><tr>
<td>①</td>
<td><code>print(&quot;파이썬 입출력에 대한 문제입니다.&quot;)</code></td>
<td><code>파이썬 입출력에 대한 문제입니다.</code></td>
</tr>
<tr>
<td>②</td>
<td>입력 <code>&quot;2 3&quot;</code></td>
<td>num1=&#39;2&#39;, num2=&#39;3&#39;</td>
</tr>
<tr>
<td>③</td>
<td>형변환 후</td>
<td>num1=2, num2=3</td>
</tr>
<tr>
<td>④</td>
<td><code>print(num1, num2)</code></td>
<td><code>2 3</code></td>
</tr>
<tr>
<td>⑤</td>
<td><code>num3 = num1 + num2</code></td>
<td><code>5</code></td>
</tr>
<tr>
<td>⑥</td>
<td><code>print(num1+&quot; + &quot;+num2+&quot; = &quot;+num3)</code></td>
<td><code>2 + 3 = 5</code></td>
</tr>
</tbody></table>
<hr>
<h2 id="✅-정답">✅ 정답</h2>
<pre><code>split</code></pre><hr>
<h2 id="💡-정리">💡 정리</h2>
<p>이 문제에서 꼭 알아야 할 개념:</p>
<ul>
<li><code>split()</code>은 문자열을 공백 기준으로 나눈다.</li>
<li>입력값은 기본적으로 <strong>문자열(str)</strong> 이므로, 숫자 연산을 위해 <strong>int() 변환</strong>이 필요하다.</li>
<li>문자열 결합 시에는 <strong>모든 항목을 str()로 변환</strong>해야 오류가 발생하지 않는다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[정보처리기사 실기 - 2023년 2회 파이썬 기출 풀이(문자열 슬라이싱과 인덱스 조합 문제)]]></title>
            <link>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-2023%EB%85%84-2%ED%9A%8C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B6%9C-%ED%92%80%EC%9D%B4%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%8A%AC%EB%9D%BC%EC%9D%B4%EC%8B%B1%EA%B3%BC-%EC%9D%B8%EB%8D%B1%EC%8A%A4-%EC%A1%B0%ED%95%A9-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-2023%EB%85%84-2%ED%9A%8C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B6%9C-%ED%92%80%EC%9D%B4%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%8A%AC%EB%9D%BC%EC%9D%B4%EC%8B%B1%EA%B3%BC-%EC%9D%B8%EB%8D%B1%EC%8A%A4-%EC%A1%B0%ED%95%A9-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Mon, 06 Oct 2025 00:07:20 GMT</pubDate>
            <description><![CDATA[<h2 id="✨-문제">✨ 문제</h2>
<pre><code class="language-python">a = &quot;engineer information processing&quot;
b = a[:3]
c = a[4:6]
d = a[28:]
e = b + c + d
print(e)</code></pre>
<hr>
<h2 id="🎯-출제-의도">🎯 출제 의도</h2>
<ul>
<li>문자열 <strong>슬라이싱(slice)</strong> 문법을 정확히 이해하는가</li>
<li>문자열 인덱스의 <strong>0부터 시작</strong> 규칙을 아는가</li>
<li><strong>끝 인덱스는 포함되지 않는다</strong>는 점을 구분할 수 있는가</li>
</ul>
<hr>
<h2 id="📘-개념-정리">📘 개념 정리</h2>
<h3 id="1-문자열-인덱스-구조">1. 문자열 인덱스 구조</h3>
<ul>
<li>문자열 <code>a = &quot;engineer information processing&quot;</code>
각 문자의 인덱스는 다음과 같다 👇</li>
</ul>
<table>
<thead>
<tr>
<th align="center">인덱스</th>
<th align="center">문자</th>
<th align="center">인덱스</th>
<th align="center">문자</th>
<th align="center">인덱스</th>
<th align="center">문자</th>
<th></th>
</tr>
</thead>
<tbody><tr>
<td align="center">0</td>
<td align="center">e</td>
<td align="center">10</td>
<td align="center">n</td>
<td align="center">20</td>
<td align="center">p</td>
<td></td>
</tr>
<tr>
<td align="center">1</td>
<td align="center">n</td>
<td align="center">11</td>
<td align="center"></td>
<td align="center">(공백)</td>
<td align="center">21</td>
<td>r</td>
</tr>
<tr>
<td align="center">2</td>
<td align="center">g</td>
<td align="center">12</td>
<td align="center">i</td>
<td align="center">22</td>
<td align="center">o</td>
<td></td>
</tr>
<tr>
<td align="center">3</td>
<td align="center">i</td>
<td align="center">13</td>
<td align="center">n</td>
<td align="center">23</td>
<td align="center">c</td>
<td></td>
</tr>
<tr>
<td align="center">4</td>
<td align="center">n</td>
<td align="center">14</td>
<td align="center">f</td>
<td align="center">24</td>
<td align="center">e</td>
<td></td>
</tr>
<tr>
<td align="center">5</td>
<td align="center">e</td>
<td align="center">15</td>
<td align="center">o</td>
<td align="center">25</td>
<td align="center">s</td>
<td></td>
</tr>
<tr>
<td align="center">6</td>
<td align="center">e</td>
<td align="center">16</td>
<td align="center">r</td>
<td align="center">26</td>
<td align="center">s</td>
<td></td>
</tr>
<tr>
<td align="center">7</td>
<td align="center">r</td>
<td align="center">17</td>
<td align="center">m</td>
<td align="center">27</td>
<td align="center">i</td>
<td></td>
</tr>
<tr>
<td align="center">8</td>
<td align="center"></td>
<td align="center">18</td>
<td align="center">a</td>
<td align="center">28</td>
<td align="center">n</td>
<td></td>
</tr>
<tr>
<td align="center">9</td>
<td align="center">i</td>
<td align="center">19</td>
<td align="center">t</td>
<td align="center">29</td>
<td align="center">g</td>
<td></td>
</tr>
</tbody></table>
<h3 id="2-슬라이싱-구문-분석">2. 슬라이싱 구문 분석</h3>
<pre><code class="language-python">b = a[:3]</code></pre>
<ul>
<li>인덱스 <code>0~2</code>까지
→ <code>&quot;eng&quot;</code></li>
</ul>
<pre><code class="language-python">c = a[4:6]</code></pre>
<ul>
<li>인덱스 <code>4~5</code>까지
→ <code>a[4]=&#39;n&#39;</code>, <code>a[5]=&#39;e&#39;</code> → <code>&quot;ne&quot;</code></li>
</ul>
<pre><code class="language-python">d = a[28:]</code></pre>
<ul>
<li>인덱스 <code>28</code>부터 문자열 끝까지
→ <code>a[28]=&#39;n&#39;</code>, <code>a[29]=&#39;g&#39;</code> → <code>&quot;ng&quot;</code></li>
</ul>
<h3 id="3-문자열-결합">3. 문자열 결합</h3>
<pre><code class="language-python">e = b + c + d</code></pre>
<ul>
<li><code>&quot;eng&quot;</code> + <code>&quot;ne&quot;</code> + <code>&quot;ng&quot;</code>
→ <code>&quot;engneng&quot;</code></li>
</ul>
<hr>
<h2 id="📝-풀이-과정">📝 풀이 과정</h2>
<table>
<thead>
<tr>
<th>단계</th>
<th>변수</th>
<th>값</th>
</tr>
</thead>
<tbody><tr>
<td>①</td>
<td>a</td>
<td><code>&quot;engineer information processing&quot;</code></td>
</tr>
<tr>
<td>②</td>
<td>b = a[:3]</td>
<td><code>&quot;eng&quot;</code></td>
</tr>
<tr>
<td>③</td>
<td>c = a[4:6]</td>
<td><code>&quot;ne&quot;</code></td>
</tr>
<tr>
<td>④</td>
<td>d = a[28:]</td>
<td><code>&quot;ng&quot;</code></td>
</tr>
<tr>
<td>⑤</td>
<td>e = b + c + d</td>
<td><code>&quot;engneng&quot;</code></td>
</tr>
</tbody></table>
<hr>
<h2 id="✅-최종-출력-결과">✅ 최종 출력 결과</h2>
<pre><code>engneng</code></pre><hr>
<h2 id="💡-정리">💡 정리</h2>
<p>이 문제에서 꼭 알아야 할 개념:</p>
<ul>
<li><strong>슬라이싱 구문</strong><ul>
<li><code>a[start:end]</code> → <code>start</code> 인덱스 포함, <code>end</code> 인덱스 <strong>직전까지</strong></li>
</ul>
</li>
<li>인덱스는 <strong>0부터 시작</strong></li>
<li><strong>끝 인덱스 생략(<code>a[28:]</code>)</strong> 시, 문자열의 끝까지 반환</li>
<li>문자열 덧셈(<code>+</code>)은 <strong>단순 연결(concatenation)</strong></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[정보처리기사 실기 - 2023년 1회 파이썬 기출 풀이(집합 자료형 set의 중복 제거와 메서드 동작 원리)]]></title>
            <link>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-2023%EB%85%84-1%ED%9A%8C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B6%9C-%ED%92%80%EC%9D%B4%EC%A7%91%ED%95%A9-%EC%9E%90%EB%A3%8C%ED%98%95-set%EC%9D%98-%EC%A4%91%EB%B3%B5-%EC%A0%9C%EA%B1%B0%EC%99%80-%EB%A9%94%EC%84%9C%EB%93%9C-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC</link>
            <guid>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-2023%EB%85%84-1%ED%9A%8C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B6%9C-%ED%92%80%EC%9D%B4%EC%A7%91%ED%95%A9-%EC%9E%90%EB%A3%8C%ED%98%95-set%EC%9D%98-%EC%A4%91%EB%B3%B5-%EC%A0%9C%EA%B1%B0%EC%99%80-%EB%A9%94%EC%84%9C%EB%93%9C-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC</guid>
            <pubDate>Mon, 06 Oct 2025 00:03:29 GMT</pubDate>
            <description><![CDATA[<h2 id="✨-문제">✨ 문제</h2>
<pre><code class="language-python">a = {&#39;한국&#39;, &#39;중국&#39;, &#39;일본&#39;}
a.add(&#39;베트남&#39;)
a.add(&#39;중국&#39;)
a.remove(&#39;일본&#39;)
a.update({&#39;홍콩&#39;, &#39;한국&#39;, &#39;태국&#39;})
print(a)</code></pre>
<hr>
<h2 id="🎯-출제-의도">🎯 출제 의도</h2>
<ul>
<li>파이썬 <strong>set(집합)</strong> 자료형의 특징 이해</li>
<li><strong>add(), remove(), update()</strong> 메서드의 동작 원리 확인</li>
<li><strong>중복 데이터 처리 방식</strong>과 <strong>출력 순서 비보장</strong> 개념 확인</li>
</ul>
<hr>
<h2 id="📘-개념-정리">📘 개념 정리</h2>
<h3 id="1-집합set의-기본-특징">1. 집합(set)의 기본 특징</h3>
<ul>
<li>중복을 허용하지 않는다.</li>
<li>순서가 없다 (즉, 인덱스로 접근 불가).</li>
<li>집합 내 동일한 요소를 여러 번 추가해도 한 번만 저장된다.<pre><code class="language-python">a = {&#39;한국&#39;, &#39;중국&#39;, &#39;일본&#39;}</code></pre>
➡ a에는 &quot;한국&quot;, &quot;중국&quot;, &quot;일본&quot; 3개의 원소가 들어 있음.</li>
</ul>
<h3 id="2-요소-추가-add">2. 요소 추가: add()</h3>
<pre><code class="language-python">a.add(&#39;베트남&#39;)
a.add(&#39;중국&#39;)</code></pre>
<ul>
<li><code>&#39;베트남&#39;</code>은 새로 추가됨.</li>
<li><code>&#39;중국&#39;</code>은 이미 존재하므로 <strong>중복으로 인한 변화 없음</strong>.</li>
</ul>
<h3 id="3-요소-삭제-remove">3. 요소 삭제: remove()</h3>
<pre><code class="language-python">a.remove(&#39;일본&#39;)</code></pre>
<ul>
<li><code>&#39;일본&#39;</code> 원소가 제거됨.</li>
<li>remove()는 존재하지 않는 원소를 삭제하면 <code>KeyError</code>가 발생하지만, 여기서는 <code>&#39;일본&#39;</code>이 존재하므로 정상 작동.</li>
</ul>
<h3 id="4-여러-요소-추가-update">4. 여러 요소 추가: update()</h3>
<pre><code class="language-python">a.update([&#39;홍콩&#39;, &#39;한국&#39;, &#39;태국&#39;])</code></pre>
<ul>
<li>리스트(<code>[]</code>)에 포함된 원소들을 집합에 한꺼번에 추가함.</li>
<li><code>&#39;한국&#39;</code>은 이미 존재하므로 중복으로 인해 추가되지 않음.</li>
</ul>
<hr>
<h2 id="📝-풀이-과정">📝 풀이 과정</h2>
<table>
<thead>
<tr>
<th>단계</th>
<th>실행 코드</th>
<th>집합 상태</th>
</tr>
</thead>
<tbody><tr>
<td>초기값</td>
<td><code>{&#39;한국&#39;, &#39;중국&#39;, &#39;일본&#39;}</code></td>
<td></td>
</tr>
<tr>
<td>① <code>a.add(&#39;베트남&#39;)</code></td>
<td><code>{&#39;한국&#39;, &#39;중국&#39;, &#39;일본&#39;, &#39;베트남&#39;}</code></td>
<td></td>
</tr>
<tr>
<td>② <code>a.add(&#39;중국&#39;)</code></td>
<td>변화 없음</td>
<td></td>
</tr>
<tr>
<td>③ <code>a.remove(&#39;일본&#39;)</code></td>
<td><code>{&#39;한국&#39;, &#39;중국&#39;, &#39;베트남&#39;}</code></td>
<td></td>
</tr>
<tr>
<td>④ <code>a.update({&#39;홍콩&#39;, &#39;한국&#39;, &#39;태국&#39;})</code></td>
<td><code>{&#39;한국&#39;, &#39;중국&#39;, &#39;베트남&#39;, &#39;홍콩&#39;, &#39;태국&#39;}</code></td>
<td></td>
</tr>
</tbody></table>
<ul>
<li>최종적으로 a에는 <strong>5개의 원소</strong>가 존재한다.
(<code>&#39;일본&#39;</code>은 제거, <code>&#39;중국&#39;</code>은 중복 제외)</li>
<li>set은 <strong>순서가 없기 때문에</strong>, 출력 순서는 달라질 수 있다.</li>
</ul>
<hr>
<h2 id="✅-최종-출력-결과">✅ 최종 출력 결과</h2>
<pre><code>{&#39;한국&#39;, &#39;중국&#39;, &#39;베트남&#39;, &#39;홍콩&#39;, &#39;태국&#39;}</code></pre><hr>
<h2 id="💡-정리">💡 정리</h2>
<p>이 문제에서 꼭 알아야 할 개념:</p>
<ul>
<li><strong>set은 중복을 허용하지 않는다.</strong></li>
<li><strong>add()</strong> → 한 개 원소 추가</li>
<li><strong>update()</strong> → 여러 개 원소 한꺼번에 추가</li>
<li><strong>remove()</strong> → 해당 원소를 삭제 (없으면 오류)</li>
<li><strong>출력 순서는 일정하지 않다. (비정렬 구조)</strong></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[정보처리기사 실기 - 2022년 3회 파이썬 기출 풀이(map() 함수와 lambda 익명함수의 동작 원리 문제)]]></title>
            <link>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-2022%EB%85%84-3%ED%9A%8C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B6%9C-%ED%92%80%EC%9D%B4map-%ED%95%A8%EC%88%98%EC%99%80-lambda-%EC%9D%B5%EB%AA%85%ED%95%A8%EC%88%98%EC%9D%98-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-2022%EB%85%84-3%ED%9A%8C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B6%9C-%ED%92%80%EC%9D%B4map-%ED%95%A8%EC%88%98%EC%99%80-lambda-%EC%9D%B5%EB%AA%85%ED%95%A8%EC%88%98%EC%9D%98-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Mon, 06 Oct 2025 00:00:54 GMT</pubDate>
            <description><![CDATA[<h2 id="✨-문제">✨ 문제</h2>
<pre><code class="language-python">TestList = [1, 2, 3, 4, 5]
TestList = list(map(lambda num: num + 100, TestList))

print(TestList)</code></pre>
<hr>
<h2 id="🎯-출제-의도">🎯 출제 의도</h2>
<ul>
<li><strong><code>map()</code> 함수</strong>와 <strong>람다 함수(lambda)</strong> 의 활용 이해</li>
<li>리스트 각 원소를 <strong>변환하여 새로운 리스트로 반환</strong>하는 흐름 파악</li>
<li><strong>함수형 프로그래밍 요소(map, lambda)</strong> 의 동작 구조 이해</li>
</ul>
<hr>
<h2 id="📘-개념-정리">📘 개념 정리</h2>
<h3 id="1-lambda-익명-함수">1. <code>lambda</code> 익명 함수</h3>
<pre><code class="language-python">lambda num: num + 100</code></pre>
<ul>
<li>이름이 없는 간단한 함수</li>
<li>입력값 <code>num</code>을 받아서 <code>num + 100</code>을 반환한다.</li>
<li>즉, <strong>리스트의 각 요소에 100을 더하는 함수</strong> 역할을 함.</li>
</ul>
<h3 id="2-map-함수">2. <code>map()</code> 함수</h3>
<pre><code class="language-python">map(lambda num: num + 100, TestList)</code></pre>
<ul>
<li>첫 번째 인자: 적용할 함수 (<code>lambda num: num + 100</code>)</li>
<li>두 번째 인자: 반복 가능한 객체 (<code>TestList</code>)</li>
<li>결과: 각 원소에 함수를 적용한 <strong>map 객체</strong>가 반환됨.
→ 리스트로 바꾸려면 <code>list()</code>로 감싸야 함.</li>
</ul>
<hr>
<h2 id="📝-풀이-과정">📝 풀이 과정</h2>
<table>
<thead>
<tr>
<th>단계</th>
<th>num 값</th>
<th>반환값</th>
<th>누적 결과</th>
</tr>
</thead>
<tbody><tr>
<td>①</td>
<td>1</td>
<td>101</td>
<td>[101]</td>
</tr>
<tr>
<td>②</td>
<td>2</td>
<td>102</td>
<td>[101, 102]</td>
</tr>
<tr>
<td>③</td>
<td>3</td>
<td>103</td>
<td>[101, 102, 103]</td>
</tr>
<tr>
<td>④</td>
<td>4</td>
<td>104</td>
<td>[101, 102, 103, 104]</td>
</tr>
<tr>
<td>⑤</td>
<td>5</td>
<td>105</td>
<td>[101, 102, 103, 104, 105]</td>
</tr>
</tbody></table>
<hr>
<h2 id="✅-최종-출력-결과">✅ 최종 출력 결과</h2>
<pre><code>[101, 102, 103, 104, 105]</code></pre><hr>
<h2 id="💡-정리">💡 정리</h2>
<p>이 문제에서 꼭 알아야 할 개념:</p>
<ul>
<li><strong><code>lambda</code> 함수</strong>는 한 줄짜리 익명 함수로, 간단한 연산에 자주 사용된다.</li>
<li><strong>map(function, iterable)</strong>은 iterable의 모든 요소에 함수를 적용한다.</li>
<li><strong>map 객체는 바로 출력되지 않으므로</strong> <code>list()</code>로 변환해야 리스트 형태로 보인다.</li>
<li>각 원소에 100을 더했기 때문에 최종 리스트는 <code>[101, 102, 103, 104, 105].</code></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[정보처리기사 실기 - 2022년 2회 파이썬 기출 풀이(문자열 슬라이싱과 문자열 포맷팅 % 연산자 문제)]]></title>
            <link>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-2022%EB%85%84-2%ED%9A%8C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B6%9C-%ED%92%80%EC%9D%B4%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%8A%AC%EB%9D%BC%EC%9D%B4%EC%8B%B1%EA%B3%BC-%EB%AC%B8%EC%9E%90%EC%97%B4-%ED%8F%AC%EB%A7%B7%ED%8C%85-%EC%97%B0%EC%82%B0%EC%9E%90-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-2022%EB%85%84-2%ED%9A%8C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B6%9C-%ED%92%80%EC%9D%B4%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%8A%AC%EB%9D%BC%EC%9D%B4%EC%8B%B1%EA%B3%BC-%EB%AC%B8%EC%9E%90%EC%97%B4-%ED%8F%AC%EB%A7%B7%ED%8C%85-%EC%97%B0%EC%82%B0%EC%9E%90-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Sun, 05 Oct 2025 23:57:36 GMT</pubDate>
            <description><![CDATA[<h2 id="✨-문제">✨ 문제</h2>
<pre><code class="language-python">a = &quot;REMEMBER NOVEMBER&quot;
b = a[:3] + a[12:16]
c = &quot;R AND %s&quot; % &quot;STR&quot;
print(b + c)</code></pre>
<hr>
<h2 id="🎯-출제-의도">🎯 출제 의도</h2>
<ul>
<li>문자열 <strong>슬라이싱(slice)</strong> 문법 이해</li>
<li>문자열 <strong>포맷팅(%s)</strong>의 사용법 확인</li>
<li><strong>문자열 덧셈(연결)</strong> 동작 원리 파악</li>
</ul>
<hr>
<h2 id="📘-개념-정리">📘 개념 정리</h2>
<h3 id="1-문자열-슬라이싱">1. 문자열 슬라이싱</h3>
<p>문자열 a = &quot;REMEMBER NOVEMBER&quot;
인덱스를 기준으로 나누면 👇</p>
<table>
<thead>
<tr>
<th align="center">인덱스</th>
<th align="center">문자</th>
<th align="center">인덱스</th>
<th align="center">문자</th>
</tr>
</thead>
<tbody><tr>
<td align="center">0</td>
<td align="center">R</td>
<td align="center">10</td>
<td align="center">O</td>
</tr>
<tr>
<td align="center">1</td>
<td align="center">E</td>
<td align="center">11</td>
<td align="center">V</td>
</tr>
<tr>
<td align="center">2</td>
<td align="center">M</td>
<td align="center">12</td>
<td align="center">E</td>
</tr>
<tr>
<td align="center">3</td>
<td align="center">E</td>
<td align="center">13</td>
<td align="center">M</td>
</tr>
<tr>
<td align="center">4</td>
<td align="center">M</td>
<td align="center">14</td>
<td align="center">B</td>
</tr>
<tr>
<td align="center">5</td>
<td align="center">B</td>
<td align="center">15</td>
<td align="center">E</td>
</tr>
<tr>
<td align="center">6</td>
<td align="center">E</td>
<td align="center">16</td>
<td align="center">R</td>
</tr>
<tr>
<td align="center">7</td>
<td align="center">R</td>
<td align="center"></td>
<td align="center"></td>
</tr>
</tbody></table>
<ul>
<li><code>a[:3]</code> → 0~2 인덱스까지 <code>&quot;REM&quot;</code></li>
<li><code>a[12:16]</code> → 12~15 인덱스까지 <code>&quot;EMBE&quot;</code></li>
</ul>
<p>따라서</p>
<pre><code class="language-python">b = &quot;REM&quot; + &quot;EMBE&quot;   # &quot;REMEMBE&quot;</code></pre>
<h3 id="2-문자열-포맷팅">2. 문자열 포맷팅</h3>
<pre><code class="language-python">c = &quot;R AND %s&quot; % &quot;STR&quot;</code></pre>
<ul>
<li><code>%s</code> → 문자열을 삽입하는 포맷 기호</li>
<li><code>&quot;R AND %s&quot;</code>에 <code>&quot;STR&quot;</code>을 넣으면 → <code>&quot;R AND STR&quot;</code></li>
</ul>
<p>즉,</p>
<pre><code class="language-python">c = &quot;R AND STR&quot;</code></pre>
<h3 id="3-문자열-결합">3. 문자열 결합</h3>
<pre><code class="language-python">print(b + c)</code></pre>
<ul>
<li><code>&quot;REMEMBE&quot;</code> + <code>&quot;R AND STR&quot;</code>
→ <code>&quot;REMEMBER AND STR&quot;</code></li>
</ul>
<hr>
<h2 id="📝-풀이-과정">📝 풀이 과정</h2>
<h3 id="4-여러-요소-추가-update">4. 여러 요소 추가: update()</h3>
<pre><code class="language-python">a.update([&#39;홍콩&#39;, &#39;한국&#39;, &#39;태국&#39;])</code></pre>
<ul>
<li>리스트(<code>[]</code>)에 포함된 원소들을 집합에 한꺼번에 추가함.</li>
<li><code>&#39;한국&#39;</code>은 이미 존재하므로 중복으로 인해 추가되지 않음.</li>
</ul>
<hr>
<h2 id="✅-최종-출력-결과">✅ 최종 출력 결과</h2>
<pre><code>REMEMBER AND STR</code></pre><hr>
<h2 id="💡-정리">💡 정리</h2>
<p>이 문제에서 꼭 알아야 할 개념:</p>
<ul>
<li><strong>슬라이싱</strong> <code>a[start:end]</code><ul>
<li><code>start</code> 인덱스 포함, <code>end</code> 인덱스 직전까지</li>
<li><code>a[:3]</code> → <code>&quot;REM&quot;</code>
<code>a[12:16]</code> → <code>&quot;EMBE&quot;</code></li>
</ul>
</li>
<li>문자열 포맷팅 <code>&quot;문자열 %s&quot; % 값</code> 은 <code>%s</code> 위치에 문자열을 삽입한다.</li>
<li>문자열 간 <code>+</code> 연산은 <strong>단순 연결(concatenation)</strong> 이다.</li>
<li>최종 결과: <code>&quot;REMEMBER AND STR&quot;</code></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[정보처리기사 실기 - 2022년 1회 파이썬 기출 풀이(기본 매개변수(default argument)와 함수 호출 원리 문제)]]></title>
            <link>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-2022%EB%85%84-1%ED%9A%8C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B6%9C-%ED%92%80%EC%9D%B4%EA%B8%B0%EB%B3%B8-%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98default-argument%EC%99%80-%ED%95%A8%EC%88%98-%ED%98%B8%EC%B6%9C-%EC%9B%90%EB%A6%AC-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-2022%EB%85%84-1%ED%9A%8C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B6%9C-%ED%92%80%EC%9D%B4%EA%B8%B0%EB%B3%B8-%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98default-argument%EC%99%80-%ED%95%A8%EC%88%98-%ED%98%B8%EC%B6%9C-%EC%9B%90%EB%A6%AC-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Sun, 05 Oct 2025 23:52:43 GMT</pubDate>
            <description><![CDATA[<h2 id="✨-문제">✨ 문제</h2>
<pre><code class="language-python">def exam(num1, num2=2):
    print(&#39;a=&#39;, num1, &#39;b=&#39;, num2)

exam(20)</code></pre>
<hr>
<h2 id="🎯-출제-의도">🎯 출제 의도</h2>
<ul>
<li>함수 <strong>매개변수 기본값(default parameter)</strong> 개념 이해</li>
<li>함수 호출 시 <strong>인자(argument) 개수</strong>에 따른 동작 방식 확인</li>
<li>출력 결과의 <strong>형식과 변수 대응 관계</strong> 파악</li>
</ul>
<hr>
<h2 id="📘-개념-정리">📘 개념 정리</h2>
<h3 id="1-함수-정의부">1. 함수 정의부</h3>
<pre><code class="language-python">def exam(num1, num2=2):</code></pre>
<ul>
<li><code>num1</code> : <strong>필수 매개변수</strong></li>
<li><code>num2=2</code> : <strong>기본값이 2로 지정된 선택적 매개변수</strong></li>
</ul>
<p>즉, <code>exam()</code> 호출 시</p>
<ul>
<li>첫 번째 인자 → <code>num1</code></li>
<li>두 번째 인자 생략 시 → <code>num2</code>는 자동으로 <code>2</code> 사용</li>
</ul>
<h3 id="2-함수-호출">2. 함수 호출</h3>
<pre><code class="language-python">exam(20)</code></pre>
<ul>
<li>인자를 하나만 전달했으므로<ul>
<li><code>num1 = 20</code></li>
<li><code>num2</code>는 생략되어 기본값 <code>2</code> 사용</li>
</ul>
</li>
</ul>
<h3 id="3-print-실행">3. print() 실행</h3>
<pre><code class="language-python">print(&#39;a=&#39;, num1, &#39;b=&#39;, num2)</code></pre>
<p>→ 실제 출력:</p>
<pre><code class="language-python">a= 20 b= 2</code></pre>
<hr>
<h2 id="📝-풀이-과정">📝 풀이 과정</h2>
<table>
<thead>
<tr>
<th>단계</th>
<th>코드</th>
<th>동작</th>
<th>결과</th>
</tr>
</thead>
<tbody><tr>
<td>①</td>
<td>함수 정의</td>
<td><code>exam()</code> 함수 등록</td>
<td>—</td>
</tr>
<tr>
<td>②</td>
<td><code>exam(20)</code> 호출</td>
<td><code>num1=20</code>, <code>num2=2(기본값)</code></td>
<td>—</td>
</tr>
<tr>
<td>③</td>
<td><code>print()</code> 실행</td>
<td><code>&#39;a=&#39;, 20, &#39;b=&#39;, 2</code></td>
<td><code>a= 20 b= 2</code> 출력</td>
</tr>
</tbody></table>
<hr>
<h2 id="✅-최종-출력-결과">✅ 최종 출력 결과</h2>
<pre><code>a= 20 b= 2</code></pre><hr>
<h2 id="💡-정리">💡 정리</h2>
<p>이 문제에서 꼭 알아야 할 개념:</p>
<ul>
<li><strong>기본 매개변수(default argument)</strong>
→ 함수 정의 시 <code>num2=2</code>처럼 미리 기본값을 지정할 수 있다.</li>
<li>인자를 하나만 전달하면, <strong>두 번째 매개변수는 기본값 사용</strong></li>
<li>함수 호출 시, 매개변수 개수가 일치하지 않아도 기본값 덕분에 오류 발생 X</li>
<li>출력 시 <code>&#39;a=&#39;</code>, <code>&#39;b=&#39;</code>는 문자열 그대로 출력되고, 뒤의 값과 쉼표로 구분됨.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[정보처리기사 실기 - 2021년 3회 파이썬 기출 풀이(비교 연산자 == 의 동작 원리)]]></title>
            <link>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-2020%EB%85%84-3%ED%9A%8C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B6%9C-%ED%92%80%EC%9D%B4%EB%B9%84%EA%B5%90-%EC%97%B0%EC%82%B0%EC%9E%90-%EC%9D%98-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC</link>
            <guid>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-2020%EB%85%84-3%ED%9A%8C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B6%9C-%ED%92%80%EC%9D%B4%EB%B9%84%EA%B5%90-%EC%97%B0%EC%82%B0%EC%9E%90-%EC%9D%98-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC</guid>
            <pubDate>Sun, 05 Oct 2025 23:49:23 GMT</pubDate>
            <description><![CDATA[<h2 id="✨-문제">✨ 문제</h2>
<pre><code class="language-python">a, b = 100, 200
print(a == b)</code></pre>
<hr>
<h2 id="🎯-출제-의도">🎯 출제 의도</h2>
<ul>
<li>파이썬의 <strong>비교 연산자(<code>==</code>)</strong> 동작 원리를 이해한다.</li>
<li><strong>두 변수의 값 비교</strong> 결과로 반환되는 <strong>논리값(boolean)</strong> 출력 확인.</li>
</ul>
<hr>
<h2 id="📘-개념-정리">📘 개념 정리</h2>
<h3 id="1-변수-선언-및-초기화">1. 변수 선언 및 초기화</h3>
<pre><code class="language-python">a, b = 100, 200</code></pre>
<ul>
<li>다중 대입문 (tuple unpacking 방식)</li>
<li>왼쪽 변수 a, b에 각각 오른쪽의 100, 200이 순서대로 할당된다.
→ <code>a = 100</code>, <code>b = 200</code></li>
</ul>
<h3 id="2-비교-연산자-">2. 비교 연산자 <code>==</code></h3>
<ul>
<li><code>==</code> : <strong>값이 같은지</strong> 비교하는 연산자</li>
<li>결과는 <strong>True(참)</strong> 또는 <strong>False(거짓)</strong> 중 하나로 반환된다.</li>
</ul>
<pre><code class="language-python">a == b</code></pre>
<p>➡ <code>100 == 200</code> → 두 값이 다르므로 False</p>
<hr>
<h2 id="📝-풀이-과정">📝 풀이 과정</h2>
<table>
<thead>
<tr>
<th>단계</th>
<th>코드</th>
<th>결과</th>
</tr>
</thead>
<tbody><tr>
<td>①</td>
<td><code>a, b = 100, 200</code></td>
<td>a=100, b=200</td>
</tr>
<tr>
<td>②</td>
<td><code>a == b</code></td>
<td>False</td>
</tr>
<tr>
<td>③</td>
<td><code>print(a == b)</code></td>
<td><code>False</code> 출력</td>
</tr>
</tbody></table>
<hr>
<h2 id="✅-최종-출력-결과">✅ 최종 출력 결과</h2>
<pre><code>False</code></pre><hr>
<h2 id="💡-정리">💡 정리</h2>
<p>이 문제에서 꼭 알아야 할 개념:</p>
<ul>
<li><code>a, b = 100, 200</code> 은 <strong>동시에 여러 변수에 값을 할당</strong>하는 문법이다.</li>
<li><code>==</code> 는 <strong>두 값의 동일성</strong>을 비교한다.</li>
<li>비교 결과는 항상 <strong>True 또는 False</strong> 형태의 <strong>bool 타입</strong>이다.</li>
<li><code>100 == 200</code> 은 같지 않으므로 결과는 <strong>False</strong>.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[정보처리기사 실기 - 2021년 2회 파이썬 기출 풀이(비트 연산자 >> 와 반복문 실행 흐름 문제)]]></title>
            <link>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-2021%EB%85%84-2%ED%9A%8C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B6%9C-%ED%92%80%EC%9D%B4%EB%B9%84%ED%8A%B8-%EC%97%B0%EC%82%B0%EC%9E%90-%EC%99%80-%EB%B0%98%EB%B3%B5%EB%AC%B8-%EC%8B%A4%ED%96%89-%ED%9D%90%EB%A6%84-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-2021%EB%85%84-2%ED%9A%8C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B6%9C-%ED%92%80%EC%9D%B4%EB%B9%84%ED%8A%B8-%EC%97%B0%EC%82%B0%EC%9E%90-%EC%99%80-%EB%B0%98%EB%B3%B5%EB%AC%B8-%EC%8B%A4%ED%96%89-%ED%9D%90%EB%A6%84-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Sun, 05 Oct 2025 23:45:37 GMT</pubDate>
            <description><![CDATA[<h2 id="✨-문제">✨ 문제</h2>
<pre><code class="language-python">a = 100
result = 0
for i in range(1, 3):
    result = a &gt;&gt; i
    result = result + 1
print(result)</code></pre>
<hr>
<h2 id="🎯-출제-의도">🎯 출제 의도</h2>
<ul>
<li>파이썬의 <strong>비트 연산자(shift)</strong> 개념 이해</li>
<li><code>&gt;&gt;</code> (오른쪽 시프트) 연산의 동작 원리 파악</li>
<li><code>for</code>문의 <strong>반복 범위</strong>(<code>range(1,3)</code>)와 마지막 값 추적</li>
<li>변수의 <strong>재할당 및 최종값 흐름</strong> 분석</li>
</ul>
<hr>
<h2 id="📘-개념-정리">📘 개념 정리</h2>
<h3 id="1-비트-시프트-연산자">1. 비트 시프트 연산자 <code>&gt;&gt;</code></h3>
<ul>
<li><code>a &gt;&gt;</code> n : a의 <strong>이진수를 오른쪽으로 n비트 이동</strong>
→ 즉, <strong>2ⁿ으로 나눈 정수 몫</strong>과 같음</li>
</ul>
<p>예를 들어,</p>
<pre><code class="language-python">a = 100
a &gt;&gt; 1 → 50  (100 ÷ 2¹)
a &gt;&gt; 2 → 25  (100 ÷ 2²)</code></pre>
<h3 id="2-for문-범위">2. for문 범위</h3>
<pre><code class="language-python">for i in range(1, 3):</code></pre>
<ul>
<li><code>range(1,3)</code> → <code>[1, 2]</code></li>
<li>즉, <code>i = 1</code> → <code>i = 2</code> 두 번 반복한다.</li>
</ul>
<hr>
<h2 id="📝-풀이-과정">📝 풀이 과정</h2>
<table>
<thead>
<tr>
<th>반복</th>
<th>i 값</th>
<th>a &gt;&gt; i 결과</th>
<th>result = a&gt;&gt;i + 1</th>
<th>result 최종 값</th>
</tr>
</thead>
<tbody><tr>
<td>①</td>
<td>1</td>
<td>100 &gt;&gt; 1 = 50</td>
<td>50 + 1 = 51</td>
<td>51</td>
</tr>
<tr>
<td>②</td>
<td>2</td>
<td>100 &gt;&gt; 2 = 25</td>
<td>25 + 1 = 26</td>
<td>26</td>
</tr>
</tbody></table>
<p>최종 반복이 끝난 뒤 <code>result</code>는 <code>26</code>.</p>
<hr>
<h2 id="✅-최종-출력-결과">✅ 최종 출력 결과</h2>
<pre><code>26</code></pre><hr>
<h2 id="💡-정리">💡 정리</h2>
<p>이 문제에서 꼭 알아야 할 개념:</p>
<ul>
<li><code>a &gt;&gt; n</code> 은 <strong>a를 2ⁿ으로 나눈 몫</strong>과 동일하다.
(즉, <code>100 &gt;&gt; 2</code> → <code>100 ÷ 4 = 25</code>)</li>
<li><code>range(1,3)</code> 은 <strong>1부터 2까지</strong> 반복된다.</li>
<li><code>result</code>는 반복마다 덮어써지므로 <strong>마지막 반복 결과</strong>가 출력된다.</li>
<li>최종 출력값은 <code>26</code>.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[정보처리기사 실기 - 2021년 1회 파이썬 기출 풀이(클래스 내 리스트와 문자열 인덱싱 문제)]]></title>
            <link>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-2021%EB%85%84-1%ED%9A%8C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B6%9C-%ED%92%80%EC%9D%B4%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%82%B4-%EB%A6%AC%EC%8A%A4%ED%8A%B8%EC%99%80-%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%9D%B8%EB%8D%B1%EC%8B%B1-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-2021%EB%85%84-1%ED%9A%8C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B6%9C-%ED%92%80%EC%9D%B4%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%82%B4-%EB%A6%AC%EC%8A%A4%ED%8A%B8%EC%99%80-%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%9D%B8%EB%8D%B1%EC%8B%B1-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Sun, 05 Oct 2025 23:42:19 GMT</pubDate>
            <description><![CDATA[<h2 id="✨-문제">✨ 문제</h2>
<pre><code class="language-python">class good:
    li = [&quot;seoul&quot;, &quot;kyeonggi&quot;, &quot;inchon&quot;, &quot;daejeon&quot;, &quot;daegu&quot;, &quot;pusan&quot;]

g = good()
str01 = &#39;&#39;
for i in g.li:
    str01 = str01 + i[0]

print(str01)</code></pre>
<hr>
<h2 id="🎯-출제-의도">🎯 출제 의도</h2>
<ul>
<li>클래스 내부의 <strong>리스트(class 변수)</strong> 접근 방법 이해</li>
<li><strong>문자열 인덱싱</strong>을 이용한 문자 추출</li>
<li><strong>for문을 이용한 누적 문자열 생성 로직</strong> 이해</li>
</ul>
<hr>
<h2 id="📘-개념-정리">📘 개념 정리</h2>
<h3 id="1-클래스-변수">1. 클래스 변수</h3>
<pre><code class="language-python">class good:
    li = [&quot;seoul&quot;, &quot;kyeonggi&quot;, &quot;inchon&quot;, &quot;daejeon&quot;, &quot;daegu&quot;, &quot;pusan&quot;]</code></pre>
<ul>
<li><code>li</code>는 <strong>클래스 변수</strong>로, <code>good</code> 클래스의 모든 인스턴스가 공유한다.</li>
<li>객체를 생성하지 않아도 <code>good.li</code>로 접근 가능하다.</li>
<li><code>g = good()</code>으로 인스턴스를 생성하면 <code>g.li</code>로도 접근 가능하다.</li>
</ul>
<h3 id="2-for문-순회">2. for문 순회</h3>
<pre><code class="language-python">for i in g.li:
    str01 = str01 + i[0]</code></pre>
<ul>
<li><code>g.li</code>는 <code>[&quot;seoul&quot;, &quot;kyeonggi&quot;, &quot;inchon&quot;, &quot;daejeon&quot;, &quot;daegu&quot;, &quot;pusan&quot;]</code></li>
<li><code>for i in g.li:</code> → 각 지역명을 순서대로 가져옴</li>
<li><code>i[0]</code> → 각 문자열의 첫 글자 추출</li>
<li><code>str01</code>에 하나씩 이어붙임 (<code>+=</code> 또는 <code>+</code> 사용)</li>
</ul>
<hr>
<h2 id="📝-풀이-과정">📝 풀이 과정</h2>
<table>
<thead>
<tr>
<th>순서</th>
<th>i (리스트 원소)</th>
<th>i[0] (첫 글자)</th>
<th>str01 누적 값</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td><code>&quot;seoul&quot;</code></td>
<td><code>&#39;s&#39;</code></td>
<td><code>&quot;s&quot;</code></td>
</tr>
<tr>
<td>2</td>
<td><code>&quot;kyeonggi&quot;</code></td>
<td><code>&#39;k&#39;</code></td>
<td><code>&quot;sk&quot;</code></td>
</tr>
<tr>
<td>3</td>
<td><code>&quot;inchon&quot;</code></td>
<td><code>&#39;i&#39;</code></td>
<td><code>&quot;ski&quot;</code></td>
</tr>
<tr>
<td>4</td>
<td><code>&quot;daejeon&quot;</code></td>
<td><code>&#39;d&#39;</code></td>
<td><code>&quot;skid&quot;</code></td>
</tr>
<tr>
<td>5</td>
<td><code>&quot;daegu&quot;</code></td>
<td><code>&#39;d&#39;</code></td>
<td><code>&quot;skidd&quot;</code></td>
</tr>
<tr>
<td>6</td>
<td><code>&quot;pusan&quot;</code></td>
<td><code>&#39;p&#39;</code></td>
<td><code>&quot;skiddp&quot;</code></td>
</tr>
</tbody></table>
<hr>
<h2 id="✅-최종-출력-결과">✅ 최종 출력 결과</h2>
<pre><code>skiddp</code></pre><hr>
<h2 id="💡-정리">💡 정리</h2>
<p>이 문제에서 꼭 알아야 할 개념:</p>
<ul>
<li><strong>클래스 변수</strong>는 모든 인스턴스가 공유하며, <code>클래스명.변수</code> 또는 <code>인스턴스명.변수</code>로 접근 가능하다.</li>
<li>문자열 인덱싱 <code>i[0]</code>은 <strong>첫 번째 문자</strong>를 의미한다.</li>
<li>문자열은 <strong>불변 객체(immutable)</strong>이므로, 누적 연결 시 새 문자열이 생성된다.</li>
<li>for문을 이용한 <strong>문자열 누적 패턴</strong>은 문자열 처리 문제에서 자주 등장한다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[정보처리기사 실기 - 2020년 4회 파이썬 기출 풀이(집합 자료형 set의 특징과 중복 처리 문제)]]></title>
            <link>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-2020%EB%85%84-4%ED%9A%8C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B6%9C-%ED%92%80%EC%9D%B4%EC%A7%91%ED%95%A9-%EC%9E%90%EB%A3%8C%ED%98%95-set%EC%9D%98-%ED%8A%B9%EC%A7%95%EA%B3%BC-%EC%A4%91%EB%B3%B5-%EC%B2%98%EB%A6%AC-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-2020%EB%85%84-4%ED%9A%8C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B6%9C-%ED%92%80%EC%9D%B4%EC%A7%91%ED%95%A9-%EC%9E%90%EB%A3%8C%ED%98%95-set%EC%9D%98-%ED%8A%B9%EC%A7%95%EA%B3%BC-%EC%A4%91%EB%B3%B5-%EC%B2%98%EB%A6%AC-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Sun, 05 Oct 2025 23:02:20 GMT</pubDate>
            <description><![CDATA[<h2 id="✨-문제">✨ 문제</h2>
<pre><code class="language-python">lol = [[1,2,3],[4,5],[6,7,8,9]]
print(lol[0])
print(lol[2][1])

for sub in lol:
    for item in sub:
        print(item, end = &#39;&#39;)
    print()</code></pre>
<hr>
<h2 id="🎯-출제-의도">🎯 출제 의도</h2>
<ul>
<li>파이썬 <strong>리스트(List)</strong>와 <strong>중첩 리스트(2차원 리스트)</strong> 구조 이해</li>
<li><strong>중첩 for문</strong>을 이용한 리스트 순회 로직 파악</li>
<li><strong>인덱싱</strong>과 <strong>end 인자</strong>의 동작 확인 (<code>print()</code>의 기본 줄바꿈 제어)</li>
</ul>
<hr>
<h2 id="📘-개념-정리">📘 개념 정리</h2>
<h3 id="1-이중-리스트의-구조">1. 이중 리스트의 구조</h3>
<pre><code class="language-python">lol = [[1,2,3], [4,5], [6,7,8,9]]</code></pre>
<ul>
<li>이 리스트는 3개의 하위 리스트로 구성되어 있다.</li>
</ul>
<table>
<thead>
<tr>
<th>인덱스</th>
<th>하위 리스트</th>
<th>요소 수</th>
</tr>
</thead>
<tbody><tr>
<td>lol[0]</td>
<td>[1, 2, 3]</td>
<td>3</td>
</tr>
<tr>
<td>lol[1]</td>
<td>[4, 5]</td>
<td>2</td>
</tr>
<tr>
<td>lol[2]</td>
<td>[6, 7, 8, 9]</td>
<td>4</td>
</tr>
</tbody></table>
<h3 id="2-인덱싱-출력">2. 인덱싱 출력</h3>
<pre><code class="language-python">print(lol[0])</code></pre>
<p>→ 첫 번째 하위 리스트 출력 → <code>[1, 2, 3]</code></p>
<pre><code class="language-python">print(lol[2][1])</code></pre>
<p>→ 세 번째 리스트(<code>lol[2] = [6,7,8,9]</code>)의 두 번째 값(<code>7</code>) 출력</p>
<h3 id="3-중첩-for문-순회">3. 중첩 for문 순회</h3>
<pre><code class="language-python">for sub in lol:          # sub = [1,2,3] → [4,5] → [6,7,8,9]
    for item in sub:     # 각 하위 리스트의 원소 하나씩
        print(item, end = &#39;&#39;)
    print()</code></pre>
<ul>
<li><code>end=&#39;&#39;</code> → 줄바꿈 없이 연속으로 출력</li>
<li><code>print()</code> → 한 하위 리스트가 끝날 때 줄바꿈</li>
</ul>
<hr>
<h2 id="📝-풀이-과정">📝 풀이 과정</h2>
<table>
<thead>
<tr>
<th>단계</th>
<th>변수 상태</th>
<th>출력 내용</th>
</tr>
</thead>
<tbody><tr>
<td>①</td>
<td><code>print(lol[0])</code></td>
<td><code>[1, 2, 3]</code></td>
</tr>
<tr>
<td>②</td>
<td><code>print(lol[2][1])</code></td>
<td><code>7</code></td>
</tr>
<tr>
<td>③</td>
<td><code>for sub in lol:</code> 반복 시작</td>
<td></td>
</tr>
<tr>
<td>③-1</td>
<td>sub = <code>[1,2,3]</code></td>
<td><code>123</code> 출력 후 줄바꿈</td>
</tr>
<tr>
<td>③-2</td>
<td>sub = <code>[4,5]</code></td>
<td><code>45</code> 출력 후 줄바꿈</td>
</tr>
<tr>
<td>③-3</td>
<td>sub = <code>[6,7,8,9]</code></td>
<td><code>6789</code> 출력 후 줄바꿈</td>
</tr>
</tbody></table>
<hr>
<h2 id="✅-최종-출력-결과">✅ 최종 출력 결과</h2>
<pre><code>[1, 2, 3]
7
123
45
6789</code></pre><hr>
<h2 id="💡-정리">💡 정리</h2>
<p>이 문제에서 꼭 알아야 할 개념:</p>
<ul>
<li><strong>이중 리스트</strong>는 리스트 안에 리스트가 포함된 구조이다.</li>
<li><code>lol[i][j]</code> 형태로 접근하면 <strong>i번째 리스트의 j번째 요소</strong>를 가리킨다.</li>
<li><code>end=&#39;&#39;</code> → print 시 줄바꿈을 하지 않음</li>
<li><strong>중첩 for문</strong>은 행렬, 표, 중첩 리스트 탐색에서 자주 사용됨</li>
<li>각 <code>sub</code>는 리스트 한 줄을 의미하고, <code>item</code>은 그 내부의 원소를 의미한다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[정보처리기사 실기 - 2020년 1회 파이썬 기출 풀이(집합 자료형 set의 특징과 중복 처리 문제)]]></title>
            <link>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-2020%EB%85%84-1%ED%9A%8C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B6%9C-%ED%92%80%EC%9D%B4%EC%A7%91%ED%95%A9-%EC%9E%90%EB%A3%8C%ED%98%95-set%EC%9D%98-%ED%8A%B9%EC%A7%95%EA%B3%BC-%EC%A4%91%EB%B3%B5-%EC%B2%98%EB%A6%AC-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-2020%EB%85%84-1%ED%9A%8C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B8%B0%EC%B6%9C-%ED%92%80%EC%9D%B4%EC%A7%91%ED%95%A9-%EC%9E%90%EB%A3%8C%ED%98%95-set%EC%9D%98-%ED%8A%B9%EC%A7%95%EA%B3%BC-%EC%A4%91%EB%B3%B5-%EC%B2%98%EB%A6%AC-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Sun, 05 Oct 2025 22:38:49 GMT</pubDate>
            <description><![CDATA[<h2 id="✨-문제">✨ 문제</h2>
<pre><code class="language-python">a = {&#39;일본&#39;, &#39;중국&#39;, &#39;한국&#39;}
a.add(&#39;베트남&#39;)
a.add(&#39;중국&#39;)
a.remove(&#39;일본&#39;)
a.update([&#39;홍콩&#39;, &#39;한국&#39;, &#39;태국&#39;])
print(a)</code></pre>
<hr>
<h2 id="🎯-출제-의도">🎯 출제 의도</h2>
<ul>
<li>파이썬 <strong>set(집합)</strong> 자료형의 특징 이해</li>
<li><strong>add(), remove(), update()</strong> 메서드의 동작 원리 확인</li>
<li><strong>중복 데이터 처리 방식</strong>과 <strong>출력 순서 비보장</strong> 개념 확인</li>
</ul>
<hr>
<h2 id="📘-개념-정리">📘 개념 정리</h2>
<h3 id="1-집합set의-기본-특징">1. 집합(set)의 기본 특징</h3>
<ul>
<li>중복을 허용하지 않는다.</li>
<li>순서가 없다 (즉, 인덱스로 접근 불가).</li>
<li>집합 내 동일한 요소를 여러 번 추가해도 한 번만 저장된다.<pre><code class="language-python">a = {&#39;일본&#39;, &#39;중국&#39;, &#39;한국&#39;}</code></pre>
➡ a에는 &quot;일본&quot;, &quot;중국&quot;, &quot;한국&quot; 3개의 원소가 들어 있음.</li>
</ul>
<h3 id="2-요소-추가-add">2. 요소 추가: add()</h3>
<pre><code class="language-python">a.add(&#39;베트남&#39;)
a.add(&#39;중국&#39;)</code></pre>
<ul>
<li><code>&#39;베트남&#39;</code>은 새로 추가됨.</li>
<li><code>&#39;중국&#39;</code>은 이미 존재하므로 <strong>중복으로 인한 변화 없음</strong>.</li>
</ul>
<h3 id="3-요소-삭제-remove">3. 요소 삭제: remove()</h3>
<pre><code class="language-python">a.remove(&#39;일본&#39;)</code></pre>
<ul>
<li><code>&#39;일본&#39;</code> 원소가 제거됨.</li>
<li>remove()는 존재하지 않는 원소를 삭제하면 <code>KeyError</code>가 발생하지만, 여기서는 <code>&#39;일본&#39;</code>이 존재하므로 정상 작동.</li>
</ul>
<h3 id="4-여러-요소-추가-update">4. 여러 요소 추가: update()</h3>
<pre><code class="language-python">a.update([&#39;홍콩&#39;, &#39;한국&#39;, &#39;태국&#39;])</code></pre>
<ul>
<li>리스트(<code>[]</code>)에 포함된 원소들을 집합에 한꺼번에 추가함.</li>
<li><code>&#39;한국&#39;</code>은 이미 존재하므로 중복으로 인해 추가되지 않음.</li>
</ul>
<hr>
<h2 id="📝-풀이-과정">📝 풀이 과정</h2>
<table>
<thead>
<tr>
<th>단계</th>
<th>실행 코드</th>
<th>집합 a의 상태</th>
</tr>
</thead>
<tbody><tr>
<td>초기값</td>
<td><code>{&#39;일본&#39;, &#39;중국&#39;, &#39;한국&#39;}</code></td>
<td>3개 원소</td>
</tr>
<tr>
<td>① add(&#39;베트남&#39;)</td>
<td><code>{&#39;일본&#39;, &#39;중국&#39;, &#39;한국&#39;, &#39;베트남&#39;}</code></td>
<td></td>
</tr>
<tr>
<td>② add(&#39;중국&#39;)</td>
<td>변화 없음 (중복 무시)</td>
<td></td>
</tr>
<tr>
<td>③ remove(&#39;일본&#39;)</td>
<td><code>{&#39;중국&#39;, &#39;한국&#39;, &#39;베트남&#39;}</code></td>
<td></td>
</tr>
<tr>
<td>④ update([...])</td>
<td><code>&#39;홍콩&#39;</code>, <code>&#39;태국&#39;</code> 추가 → <code>{&#39;중국&#39;, &#39;한국&#39;, &#39;베트남&#39;, &#39;홍콩&#39;, &#39;태국&#39;}</code></td>
<td></td>
</tr>
</tbody></table>
<ul>
<li>최종적으로 a에는 <strong>5개의 원소</strong>가 존재한다.
(<code>&#39;일본&#39;</code>은 제거, <code>&#39;중국&#39;</code>은 중복 제외)</li>
<li>set은 <strong>순서가 없기 때문에</strong>, 출력 순서는 달라질 수 있다.</li>
</ul>
<hr>
<h2 id="✅-최종-출력-결과">✅ 최종 출력 결과</h2>
<pre><code>{&#39;중국&#39;, &#39;한국&#39;, &#39;베트남&#39;, &#39;홍콩&#39;, &#39;태국&#39;}</code></pre><hr>
<h2 id="💡-정리">💡 정리</h2>
<p>이 문제에서 꼭 알아야 할 개념:</p>
<ul>
<li><strong>set은 중복을 허용하지 않는다.</strong></li>
<li><strong>add()</strong> → 한 개 원소 추가</li>
<li><strong>update()</strong> → 여러 개 원소 한꺼번에 추가</li>
<li><strong>remove()</strong> → 해당 원소를 삭제 (없으면 오류)</li>
<li><strong>출력 순서는 일정하지 않다. (비정렬 구조)</strong></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[정보처리기사 실기 자바 개념정리]]></title>
            <link>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-%EC%9E%90%EB%B0%94-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@dev_alchemist/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-%EC%9E%90%EB%B0%94-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sun, 05 Oct 2025 14:04:39 GMT</pubDate>
            <description><![CDATA[<h2 id="✨-1장-클래스class와-객체object">✨ 1장. 클래스(Class)와 객체(Object)</h2>
<h3 id="📘-개념-설명">📘 개념 설명</h3>
<ul>
<li>자바에서 클래스는 <strong>객체를 생성하기 위한 설계도</strong>, 객체는 이 설계도로 만들어진 <strong>실체(Instance)</strong>이다.</li>
</ul>
<pre><code class="language-java">class Car {
    String name;
    int speed;
    void run() { System.out.println(name + &quot;이 달립니다!&quot;); }
}

public class Main {
    public static void main(String[] args){
        Car c = new Car();
        c.name = &quot;소나타&quot;;
        c.run();
    }
}</code></pre>
<p><strong>출력:</strong></p>
<pre><code>소나타이 달립니다!</code></pre><ul>
<li><code>class</code> : 객체의 속성(필드)과 동작(메서드)을 정의.</li>
<li><code>new</code> : 객체를 메모리에 생성.</li>
<li><code>this</code> : 현재 객체 자신을 가리킴.</li>
<li>생성자는 클래스 이름과 같고 반환형이 없다.</li>
</ul>
<h3 id="📝-연습문제">📝 연습문제</h3>
<pre><code class="language-java">class A {
    int x;
    A(int x){ this.x = x; }
}

public class Main {
    public static void main(String[] args){
        A obj1 = new A(5);
        A obj2 = obj1;
        obj2.x = 10;
        System.out.println(obj1.x);
    }
}</code></pre>
<h3 id="✅-해설">✅ 해설</h3>
<ul>
<li><code>obj1</code>과 <code>obj2</code>는 같은 객체를 참조한다.</li>
<li><code>obj2.x = 10</code>은 <code>obj1.x</code>에도 반영된다.</li>
</ul>
<p><strong>정답:</strong></p>
<pre><code>10</code></pre><hr>
<h2 id="✨-2장-상속inheritance과-오버라이딩overriding">✨ 2장. 상속(Inheritance)과 오버라이딩(Overriding)</h2>
<h3 id="📘-개념-설명-1">📘 개념 설명</h3>
<ul>
<li>자바의 상속은 기존 클래스의 기능을 <strong>확장(extends)</strong> 하는 개념이다. 부모의 멤버를 자식이 물려받아 재사용할 수 있다.</li>
</ul>
<pre><code class="language-java">class Parent {
    void show() { System.out.println(&quot;Parent&quot;); }
}

class Child extends Parent {
    void show() { System.out.println(&quot;Child&quot;); }
}

public class Main {
    public static void main(String[] args){
        Parent p = new Child();
        p.show();
    }
}</code></pre>
<p><strong>출력:</strong></p>
<pre><code>Child</code></pre><ul>
<li><strong>오버라이딩</strong>: 상속받은 메서드를 <strong>같은 이름, 매개변수, 반환형으로 재정의</strong></li>
<li><strong>동적 바인딩</strong>: 실행 시점에 실제 객체 타입(<code>Child</code>) 기준으로 메서드 결정</li>
</ul>
<h3 id="📝-연습문제-1">📝 연습문제</h3>
<pre><code class="language-java">class Parent {
    int x = 100;
    int getX() { return x; }
}

class Child extends Parent {
    int x = 4000;
    int getX() { return x * 2; }
}

public class Main {
    public static void main(String[] args){
        Parent p = new Child();
        System.out.println(p.getX());
    }
}</code></pre>
<h3 id="✅-해설-1">✅ 해설</h3>
<ul>
<li><code>getX()</code>는 오버라이딩 → <strong>객체 타입(Child)</strong> 기준 호출</li>
<li><code>x</code>는 필드 숨김 → <strong>참조 타입(Parent)</strong> 기준 사용되지 않음</li>
</ul>
<p><strong>정답:</strong></p>
<pre><code>8000</code></pre><hr>
<h2 id="✨-3장-static정적-멤버과-singleton-패턴">✨ 3장. static(정적 멤버)과 Singleton 패턴</h2>
<h3 id="📘-개념-설명-2">📘 개념 설명</h3>
<ul>
<li><code>static</code>은 <strong>클래스 단위로 공유되는 영역</strong>이다. 모든 인스턴스가 같은 값을 본다.</li>
</ul>
<pre><code class="language-java">class Counter {
    static int count = 0;
    Counter() { count++; }
}

public class Main {
    public static void main(String[] args){
        new Counter();
        new Counter();
        System.out.println(Counter.count);
    }
}</code></pre>
<p><strong>출력:</strong></p>
<pre><code>2</code></pre><h3 id="📝-연습문제-2">📝 연습문제</h3>
<pre><code class="language-java">class Connection {
    private static Connection _inst = null;
    private int count = 0;

    static Connection get() {
        if(_inst == null)
            _inst = new Connection();
        return _inst;
    }

    void count(){ count++; }
    int getCount(){ return count; }
}

public class Main {
    public static void main(String[] args){
        Connection c1 = Connection.get();
        c1.count();
        Connection c2 = Connection.get();
        c2.count();
        System.out.println(c1.getCount());
    }
}</code></pre>
<h3 id="✅-해설-2">✅ 해설</h3>
<ul>
<li><code>static</code>은 클래스 단위로 단 하나만 존재한다.</li>
<li><code>Connection.get()</code>은 항상 동일 객체 반환.</li>
<li><code>count</code>가 누적되어 2가 된다.</li>
</ul>
<p><strong>정답:</strong></p>
<pre><code>2</code></pre><hr>
<h2 id="✨-4장-추상-클래스--인터페이스">✨ 4장. 추상 클래스 &amp; 인터페이스</h2>
<h3 id="📘-개념-설명-3">📘 개념 설명</h3>
<ul>
<li><code>abstract</code> 클래스는 <strong>상속을 위한 틀</strong></li>
<li><strong>인터페이스(interface)</strong>는 모든 메서드가 추상(abstract)</li>
</ul>
<pre><code class="language-java">abstract class Vehicle {
    abstract String getName(String val);
    void start(){ System.out.println(&quot;출발!&quot;); }
}

class Car extends Vehicle {
    String getName(String val){ return &quot;Car name : &quot; + val; }
}</code></pre>
<h3 id="📝-연습문제-3">📝 연습문제</h3>
<pre><code class="language-java">abstract class Vehicle {
    private String name;
    abstract String getName(String val);
    public String getName() { return &quot;vehicle name:&quot; + name; }
    public void setName(String val){ name = val; }
}

class Car extends Vehicle {
    public Car(String val){ setName(val); }
    public String getName(String val){ return &quot;Car name : &quot; + val; }
}

public class Main {
    public static void main(String[] args){
        Vehicle obj = new Car(&quot;Spark&quot;);
        System.out.println(obj.getName());
    }
}</code></pre>
<h3 id="✅-해설-3">✅ 해설</h3>
<ul>
<li><code>obj.getName()</code>은 <strong>매개변수 없는 오버로딩 메서드</strong> 호출</li>
<li><code>name</code> 필드는 <code>&quot;Spark&quot;</code>로 설정되어 있다.</li>
</ul>
<p><strong>정답:</strong></p>
<pre><code>vehicle name:Spark</code></pre><hr>
<h2 id="✨-5장-예외-처리exception-handling">✨ 5장. 예외 처리(Exception Handling)</h2>
<h3 id="📘-개념-설명-4">📘 개념 설명</h3>
<pre><code class="language-java">try {
    int x = 5 / 0;
} catch (ArithmeticException e) {
    System.out.println(&quot;0으로 나눌 수 없습니다&quot;);
} finally {
    System.out.println(&quot;항상 실행&quot;);
}</code></pre>
<h3 id="📝-연습문제-4">📝 연습문제</h3>
<pre><code class="language-java">public class Main {
    public static void main(String[] args){
        int a = 5, b = 0;
        try {
            System.out.print(a / b);
        } catch (ArithmeticException e) {
            System.out.print(&quot;출력1&quot;);
        } finally {
            System.out.print(&quot;출력2&quot;);
        }
    }
}</code></pre>
<h3 id="✅-해설-4">✅ 해설</h3>
<ul>
<li><code>5 / 0</code> → <code>ArithmeticException</code> 발생</li>
<li><code>catch</code>로 <code>&quot;출력1&quot;</code> 출력, finally는 항상 실행</li>
</ul>
<p><strong>정답:</strong></p>
<pre><code>출력1출력2</code></pre><hr>
<h2 id="✨-6장-배열array과-참조reference">✨ 6장. 배열(Array)과 참조(Reference)</h2>
<h3 id="📘-개념-설명-5">📘 개념 설명</h3>
<ul>
<li>배열은 <strong>참조형 객체</strong>이다.</li>
<li>배열 원소로 객체를 저장하면, 각 칸에는 <strong>객체 주소값</strong>이 저장된다.<pre><code class="language-java">int[] arr = {1, 2, 3};
String[] s = {&quot;A&quot;, &quot;B&quot;};</code></pre>
</li>
</ul>
<h3 id="📝-연습문제-5">📝 연습문제</h3>
<pre><code class="language-java">public class Main {
    public static void change(String[] data, String s){
        data[0] = s;
        s = &quot;Z&quot;;
    }

    public static void main(String[] args){
        String data[] = {&quot;A&quot;};
        String s = &quot;B&quot;;
        change(data, s);
        System.out.println(data[0] + s);
    }
}</code></pre>
<h3 id="✅-해설-5">✅ 해설</h3>
<ul>
<li>배열(<code>data</code>)은 참조형이라 원소 변경이 반영됨.</li>
<li>문자열(<code>s</code>)은 값 복사이므로 지역 변경은 영향 없음.</li>
</ul>
<p><strong>정답:</strong></p>
<pre><code>BB</code></pre><hr>
<h2 id="✨-7장-람다lambda와-함수형-인터페이스">✨ 7장. 람다(Lambda)와 함수형 인터페이스</h2>
<h3 id="📘-개념-설명-6">📘 개념 설명</h3>
<pre><code class="language-java">interface F { int apply(int x) throws Exception; }

public class Main {
    static int run(F f){
        try { return f.apply(3); }
        catch(Exception e){ return 7; }
    }
}</code></pre>
<ul>
<li>람다는 <strong>함수형 인터페이스(메서드 1개)</strong>에서 사용 가능하며, <strong>익명 함수</strong>처럼 작성된다.</li>
</ul>
<h3 id="📝-연습문제-6">📝 연습문제</h3>
<pre><code class="language-java">public class Main {
    static interface F { int apply(int x) throws Exception; }
    static int run(F f){
        try { return f.apply(3); }
        catch(Exception e){ return 7; }
    }
    public static void main(String[] args){
        F f = (x) -&gt; {
            if(x &gt; 2) throw new Exception();
            return x * 2;
        };
        System.out.println(run(f) + run((int n) -&gt; n + 9));
    }
}</code></pre>
<h3 id="✅-해설-6">✅ 해설</h3>
<ul>
<li><code>run(f)</code> → 예외 발생 → <code>7</code></li>
<li><code>run((n)-&gt;n+9)</code> → <code>3+9=12</code></li>
<li>최종 <code>7+12=19</code></li>
</ul>
<p><strong>정답:</strong></p>
<pre><code>19</code></pre><hr>
<h2 id="✨-8장-문자열string-비교">✨ 8장. 문자열(String) 비교</h2>
<h3 id="📘-개념-설명-7">📘 개념 설명</h3>
<table>
<thead>
<tr>
<th>비교 방식</th>
<th>의미</th>
</tr>
</thead>
<tbody><tr>
<td><code>==</code></td>
<td>참조 주소 비교</td>
</tr>
<tr>
<td><code>.equals()</code></td>
<td>실제 내용 비교</td>
</tr>
</tbody></table>
<h3 id="📝-연습문제-7">📝 연습문제</h3>
<pre><code class="language-java">String str1 = &quot;Programming&quot;;
String str2 = &quot;Programming&quot;;
String str3 = new String(&quot;Programming&quot;);

System.out.println(str1==str2);
System.out.println(str1==str3);
System.out.println(str1.equals(str3));</code></pre>
<h3 id="✅-해설-7">✅ 해설</h3>
<ul>
<li><code>str1 == str2</code> → true (리터럴 동일 참조)</li>
<li><code>str1 == str3</code> → false (new로 별도 객체)</li>
<li><code>.equals()</code> → true (내용 동일)</li>
</ul>
<p><strong>정답:</strong></p>
<pre><code>true
false
true</code></pre><hr>
<h2 id="✨-9장-재귀recursion">✨ 9장. 재귀(Recursion)</h2>
<h3 id="📘-개념-설명-8">📘 개념 설명</h3>
<ul>
<li>재귀는 메서드가 <strong>자기 자신을 호출</strong>하는 구조이다. 항상 종료 조건을 포함해야 한다.</li>
</ul>
<h3 id="📝-연습문제-8">📝 연습문제</h3>
<pre><code class="language-java">static int func(int[] a, int st, int end) {
    if (st &gt;= end) return 0;
    int mid = (st + end) / 2;
    return a[mid] + Math.max(func(a, st, mid), func(a, mid + 1, end));
}

public static void main(String[] args){
    int[] data = {3,5,8,12,17};
    System.out.println(func(data,0,data.length-1));
}</code></pre>
<h3 id="✅-해설-8">✅ 해설</h3>
<ul>
<li>중앙값 8 + 오른쪽의 최대 합 12 → 20</li>
</ul>
<p><strong>정답:</strong></p>
<pre><code>20</code></pre><hr>
<h2 id="✨-10장-오버로딩overloading과-오버라이딩overriding-심화">✨ 10장. 오버로딩(Overloading)과 오버라이딩(Overriding) 심화</h2>
<h3 id="📘-개념-설명-9">📘 개념 설명</h3>
<p><strong>오버로딩(Overloading)</strong>
: 같은 이름, 다른 매개변수로 여러 메서드를 정의하는 것
→ 컴파일 시점에 결정됨 (정적 바인딩)</p>
<p><strong>오버라이딩(Overriding)</strong>
: 상속 관계에서 부모 메서드를 재정의하는 것
→ 실행 시점에 결정됨 (동적 바인딩)</p>
<pre><code class="language-java">class Parent {
    void show(){ System.out.println(&quot;Parent&quot;); }
}

class Child extends Parent {
    void show(){ System.out.println(&quot;Child&quot;); }
}</code></pre>
<h3 id="📝-연습문제-9">📝 연습문제</h3>
<pre><code class="language-java">public class Main {
    public static class Parent {
        public int x(int i){ return i + 2; }
        public static String id(){ return &quot;P&quot;; }
    }

    public static class Child extends Parent {
        public int x(int i){ return i + 3; }
        public String x(String s){ return s + &quot;R&quot;; }
        public static String id(){ return &quot;C&quot;; }
    }

    public static void main(String[] args){
        Parent ref = new Child();
        System.out.println(ref.x(2) + ref.id());
    }
}</code></pre>
<h3 id="✅-해설-9">✅ 해설</h3>
<ul>
<li><code>x(2)</code> → 동적 바인딩으로 Child.x(int) 호출 → 5</li>
<li><code>id()</code> → 정적 메서드, 참조 타입 기준 → Parent.id() = “P”</li>
</ul>
<p><strong>정답:</strong></p>
<pre><code>5P</code></pre><hr>
<h2 id="✨-11장-static-변수와-메모리-공유-구조">✨ 11장. static 변수와 메모리 공유 구조</h2>
<h3 id="📘-개념-설명-10">📘 개념 설명</h3>
<p><code>static</code>은 클래스 전체에서 공유되는 변수이다.
인스턴스와 무관하게 하나만 존재한다.</p>
<pre><code class="language-java">class Counter {
    static int count = 0;
    Counter(){ count++; }
}</code></pre>
<p>모든 객체가 <strong>하나의 count</strong>를 공유한다.</p>
<h3 id="📝-연습문제-10">📝 연습문제</h3>
<pre><code class="language-java">class Connection {
    private static Connection inst = null;
    private int count = 0;

    static Connection get(){
        if(inst == null) inst = new Connection();
        return inst;
    }

    void count(){ count++; }
    int getCount(){ return count; }
}

public class Main {
    public static void main(String[] args){
        Connection c1 = Connection.get();
        c1.count();
        Connection c2 = Connection.get();
        c2.count();
        Connection c3 = Connection.get();
        c3.count();
        System.out.println(c1.getCount());
    }
}</code></pre>
<h3 id="✅-해설-10">✅ 해설</h3>
<ul>
<li>모든 호출은 동일 객체를 참조</li>
<li><code>count()</code> 총 3회 실행 → <code>count = 3</code></li>
</ul>
<p><strong>정답:</strong></p>
<pre><code>3</code></pre><hr>
<h2 id="✨-12장-추상-클래스abstract와-다형성">✨ 12장. 추상 클래스(abstract)와 다형성</h2>
<h3 id="📘-개념-설명-11">📘 개념 설명</h3>
<p><strong>추상 클래스:</strong></p>
<ul>
<li>공통 구조를 정의하고 구체적 구현은 자식이 담당</li>
<li><code>abstract</code> 메서드는 몸체가 없음</li>
</ul>
<h3 id="📝-연습문제-11">📝 연습문제</h3>
<pre><code class="language-java">abstract class Vehicle {
    String name;
    abstract String getName(String val);
    public String getName(){ return &quot;Vehicle name: &quot; + name; }
}

class Car extends Vehicle {
    public Car(String val){ name = val; }
    public String getName(String val){ return &quot;Car name: &quot; + val; }
}

public class Main {
    public static void main(String[] args){
        Vehicle obj = new Car(&quot;Spark&quot;);
        System.out.println(obj.getName());
    }
}</code></pre>
<h3 id="✅-해설-11">✅ 해설</h3>
<ul>
<li>호출된 메서드는 매개변수 없는 버전</li>
<li><code>&quot;Vehicle name: Spark&quot;</code></li>
</ul>
<p><strong>정답:</strong></p>
<pre><code>Vehicle name: Spark</code></pre><hr>
<h2 id="✨-13장-예외-처리exception-handling">✨ 13장. 예외 처리(Exception Handling)</h2>
<h3 id="📘-개념-설명-12">📘 개념 설명</h3>
<ul>
<li><strong>try ~ catch ~ finally 구조</strong></li>
</ul>
<pre><code class="language-java">try {
   int x = 10 / 0;
} catch (ArithmeticException e) {
   System.out.println(&quot;0으로 나눌 수 없습니다&quot;);
} finally {
   System.out.println(&quot;항상 실행&quot;);
}</code></pre>
<h3 id="📝-연습문제-12">📝 연습문제</h3>
<pre><code class="language-java">public class Main {
    public static void main(String[] args){
        int a = 5, b = 0;
        try {
            System.out.println(a/b);
        } catch(ArithmeticException e) {
            System.out.print(&quot;출력1&quot;);
        } finally {
            System.out.print(&quot;출력5&quot;);
        }
    }
}</code></pre>
<h3 id="✅-해설-12">✅ 해설</h3>
<ul>
<li><code>a/b</code> → 0으로 나눔 → <code>ArithmeticException</code> 발생</li>
<li>catch 실행 → <code>&quot;출력1&quot;</code></li>
<li>finally 항상 실행 → <code>&quot;출력5&quot;</code></li>
</ul>
<p><strong>정답:</strong></p>
<pre><code>출력1출력5</code></pre><hr>
<h2 id="✨-14장-문자열string-비교">✨ 14장. 문자열(String) 비교</h2>
<h3 id="📘-개념-설명-13">📘 개념 설명</h3>
<ul>
<li><code>==</code> : 참조 주소 비교</li>
<li><code>.equals()</code> : 문자열 내용 비교</li>
</ul>
<h3 id="📝-연습문제-13">📝 연습문제</h3>
<p>String str1 = &quot;Programming&quot;;
String str2 = &quot;Programming&quot;;
String str3 = new String(&quot;Programming&quot;);</p>
<p>System.out.println(str1 == str2);
System.out.println(str1 == str3);
System.out.println(str1.equals(str3));</p>
<h3 id="✅-해설-13">✅ 해설</h3>
<ul>
<li>리터럴은 String Pool 공유 → <code>str1 == str2</code> → true</li>
<li>new로 만든 객체는 별도 → <code>str1 == str3</code> → false</li>
<li>내용은 동일 → <code>.equals()</code> → true</li>
</ul>
<p><strong>정답:</strong></p>
<pre><code>true
false
true</code></pre><hr>
<h2 id="✨-15장-배열-참조reference와-스왑">✨ 15장. 배열 참조(Reference)와 스왑</h2>
<h3 id="📘-개념-설명-14">📘 개념 설명</h3>
<ul>
<li>배열은 참조형이므로, 스왑 시 주소가 교환된다.</li>
</ul>
<h3 id="📝-연습문제-14">📝 연습문제</h3>
<pre><code class="language-java">public class Main {
    static class BO {
        public int v;
        public BO(int v){ this.v = v; }
    }
    public static void main(String[] args){
        BO a = new BO(1);
        BO b = new BO(2);
        BO c = new BO(3);
        BO[] arr = {a,b,c};
        BO t = arr[0];
        arr[0] = arr[2];
        arr[2] = t;
        arr[1].v = arr[0].v;
        System.out.println(a.v + &quot;a&quot; + b.v + &quot;b&quot; + c.v);
    }
}</code></pre>
<h3 id="✅-해설-14">✅ 해설</h3>
<ul>
<li><code>arr = {c,b,a}</code></li>
<li><code>b.v = c.v</code> → 3</li>
<li>최종 <code>a=1, b=3, c=3</code></li>
</ul>
<p><strong>정답:</strong></p>
<pre><code>1a3b3</code></pre><hr>
<h2 id="✨-16장-재귀-함수recursion와-분할정복">✨ 16장. 재귀 함수(Recursion)와 분할정복</h2>
<h3 id="📘-개념-설명-15">📘 개념 설명</h3>
<ul>
<li>재귀 함수는 자기 자신을 호출하며, <strong>분할 → 정복 → 합침</strong> 패턴을 갖는다.</li>
</ul>
<h3 id="📝-연습문제-15">📝 연습문제</h3>
<pre><code class="language-java">int func(int[] a, int st, int end){
    if(st &gt;= end) return 0;
    int mid = (st + end) / 2;
    return a[mid] + Math.max(func(a, st, mid), func(a, mid+1, end));
}</code></pre>
<p>배열 <code>{3,5,8,12,17}</code> 입력 시</p>
<h3 id="✅-해설-15">✅ 해설</h3>
<ul>
<li>중심값 8 + 오른쪽 최대 12 → 20</li>
</ul>
<p><strong>정답:</strong></p>
<pre><code>20</code></pre><hr>
<h2 id="✨-17장-람다lambda와-함수형-인터페이스">✨ 17장. 람다(Lambda)와 함수형 인터페이스</h2>
<h3 id="📘-개념-설명-16">📘 개념 설명</h3>
<ul>
<li>람다는 <strong>익명 함수</strong>로, 인터페이스의 단 하나의 메서드를 구현할 때 사용.<pre><code class="language-java">@FunctionalInterface
interface F { int apply(int x) throws Exception; }</code></pre>
</li>
</ul>
<h3 id="📝-연습문제-16">📝 연습문제</h3>
<pre><code class="language-java">F f = (x) -&gt; {
    if(x &gt; 2) throw new Exception();
    return x * 2;
};
System.out.print(run(f) + run((int n) -&gt; n + 9));</code></pre>
<h3 id="✅-해설-16">✅ 해설</h3>
<ul>
<li>첫 run은 예외 → 7</li>
<li>두 번째 run → 12</li>
<li>합 → 19</li>
</ul>
<p><strong>정답:</strong></p>
<pre><code>19</code></pre><hr>
<h2 id="✨-18장-예외--throws--throw-심화">✨ 18장. 예외 + throws / throw 심화</h2>
<h3 id="📘-개념-설명-17">📘 개념 설명</h3>
<ul>
<li><code>throws</code> : 메서드가 예외를 호출자에게 던짐</li>
<li><code>throw</code> : 예외를 실제 발생시킴</li>
</ul>
<h3 id="📝-연습문제-17">📝 연습문제</h3>
<pre><code class="language-java">public class ExceptionHandling {
    public static void main(String[] args){
        int sum = 0;
        try {
            func();
        } catch (NullPointerException e) {
            sum += 1;
        } catch (Exception e) {
            sum += 10;
        } finally {
            sum += 100;
        }
        System.out.print(sum);
    }

    static void func() throws Exception {
        throw new NullPointerException();
    }
}</code></pre>
<h3 id="✅-해설-17">✅ 해설</h3>
<ul>
<li><code>func()</code> → <code>NullPointerException</code> 발생 → 첫 번째 catch 실행 → +1</li>
<li>finally는 항상 실행 → +100</li>
<li>총합 101</li>
</ul>
<p><strong>정답:</strong></p>
<pre><code>101</code></pre><hr>
<h2 id="✨-19장-제네릭generics과-오버로딩-선택">✨ 19장. 제네릭(Generics)과 오버로딩 선택</h2>
<h3 id="📘-개념-설명-18">📘 개념 설명</h3>
<ul>
<li>오버로딩 시 가장 <strong>정확히 일치하는 타입</strong>의 메서드가 우선된다.</li>
</ul>
<h3 id="📝-연습문제-18">📝 연습문제</h3>
<pre><code class="language-java">class Main {
  public static class Collection&lt;T&gt;{
    T value;
    Collection(T t){ value = t; }

    void print(){
       new Printer().print(value);
    }

    class Printer {
      void print(Integer a){ System.out.print(&quot;A&quot; + a); }
      void print(Object a){ System.out.print(&quot;B&quot; + a); }
      void print(Number a){ System.out.print(&quot;C&quot; + a); }
    }
  }

  public static void main(String[] args){
      new Collection&lt;&gt;(0).print();
  }
}</code></pre>
<h3 id="✅-해설-18">✅ 해설</h3>
<ul>
<li><code>T = Integer</code></li>
<li>가장 구체적인 <code>print(Integer)</code> 선택 → <code>&quot;A0&quot;</code></li>
</ul>
<p><strong>정답:</strong></p>
<pre><code>A0</code></pre><h2 id="✨-20장-다형성과-메서드-호출-순서">✨ 20장. 다형성과 메서드 호출 순서</h2>
<h3 id="📘-개념-설명-19">📘 개념 설명</h3>
<ul>
<li>자바의 다형성은 <strong>상속 + 오버라이딩 + 참조형 변환</strong>으로 이루어진다.</li>
<li>부모 타입 변수로 자식 객체를 참조할 수 있고, 호출되는 메서드는 <strong>객체의 실제 타입</strong> 기준으로 결정된다.</li>
</ul>
<h3 id="📝-연습문제-19">📝 연습문제</h3>
<pre><code class="language-java">public class Main {
    public static void main(String[] args){
        new Child();
        System.out.println(Parent.total);
    }
}

class Parent {
    static int total = 0;
    int v = 1;
    Parent(){
        total += (++v);
        show();
    }
    public void show(){ total += total; }
}

class Child extends Parent {
    int v = 10;
    Child(){
        v += 2;
        total += v++;
        show();
    }
    public void show(){ total += total * 2; }
}</code></pre>
<h3 id="✅-해설-19">✅ 해설</h3>
<ul>
<li>부모 생성자 → <code>total=2</code>, <code>show()</code>(자식 버전 호출) → 6</li>
<li>자식 생성자 → <code>v=10→12</code>, <code>total+=12→18</code>, <code>show()</code>(자식) → <code>18+36=54</code></li>
</ul>
<p><strong>정답:</strong></p>
<pre><code>54</code></pre>]]></description>
        </item>
    </channel>
</rss>