<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>JANNOISHI</title>
        <link>https://velog.io/</link>
        <description>비전공자가 AI 엔지니어가 되는 과정</description>
        <lastBuildDate>Mon, 20 Apr 2026 06:18:07 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>JANNOISHI</title>
            <url>https://velog.velcdn.com/images/aiprompt9908-max/profile/25541b96-085e-4d3b-b7fe-3eb12a4ea648/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. JANNOISHI. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/aiprompt9908-max" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Project #1] inventory management_bot - 6 week]]></title>
            <link>https://velog.io/@aiprompt9908-max/Project-1-inventory-managementbot-6-week</link>
            <guid>https://velog.io/@aiprompt9908-max/Project-1-inventory-managementbot-6-week</guid>
            <pubDate>Mon, 20 Apr 2026 06:18:07 GMT</pubDate>
            <description><![CDATA[<h2 id="🛠️-주요-구현-내용">🛠️ 주요 구현 내용</h2>
<h3 id="1-api-토큰-보안-설정-python-dotenv">1. API 토큰 보안 설정 (<code>python-dotenv</code>)</h3>
<p>소스 코드에 직접 노출되어 있던 텔레그램 API 토큰을 <code>.env</code> 파일로 격리했습니다. GitHub 등 외부 저장소에 코드를 공유할 때 보안 사고를 방지하기 위한 필수 조치로, 환경 변수를 로드하여 토큰을 호출하는 안전한 구조를 설계했습니다.</p>
<h3 id="2-재고-부족-자동-알림-시스템">2. 재고 부족 자동 알림 시스템</h3>
<p>단순히 재고를 보여주는 것에 그치지 않고, 수량이 특정 임계치(10개) 미만으로 떨어질 경우 사용자에게 <strong>⚠️ 재고 부족 알림</strong>을 리스트로 묶어 전송하는 로직을 구현했습니다. 이를 통해 사용자가 재입고 시점을 직관적으로 파악할 수 있도록 했습니다.</p>
<h3 id="3-사용자-가이드-start-명령어-구축">3. 사용자 가이드 <code>/start</code> 명령어 구축</h3>
<p>봇을 처음 사용하는 사용자나 기능이 생소한 사용자를 위해 봇의 용도와 사용 가능한 명령어 리스트를 안내하는 <code>/start</code> 기능을 추가했습니다. 서비스의 첫인상을 결정하는 UX(사용자 경험) 측면을 고려하여 마크다운 형식을 적용해 가독성을 높였습니다.</p>
<h2 id="⚠️-트러블슈팅-troubleshooting">⚠️ 트러블슈팅 (Troubleshooting)</h2>
<h3 id="이슈-indentationerror와-env-확장자-인식-문제">이슈: <code>IndentationError</code>와 <code>.env</code> 확장자 인식 문제</h3>
<ul>
<li><strong>현상:</strong> 코드 수정 중 들여쓰기가 꼬여 실행이 안 되거나, <code>.env</code> 파일을 만들었는데 시스템이 읽지 못함.</li>
<li><strong>원인:</strong> 파이썬의 엄격한 들여쓰기 규칙 위반 및 맥 텍스트 편집기에서 숨겨진 <code>.txt</code> 확장자가 붙어 파일명이 <code>.env.txt</code>가 됨.</li>
<li><strong>해결:</strong> IDLE의 인덴트 조정 기능을 활용해 코드 구조를 재정렬하고, 터미널을 통해 파일 확장자를 정확히 수정하여 해결했습니다.</li>
</ul>
<h2 id="결과">결과</h2>
<p><img src="https://velog.velcdn.com/images/aiprompt9908-max/post/a6f58535-e273-4eff-8b0f-2843eb2be3c8/image.png" alt=""></p>
<hr>
<h2 id="🇯🇵-japanese-version">🇯🇵 Japanese Version</h2>
<h1 id="【週次報告】テレグラム在庫管理bot開発---第6週：セキュリティ設定およびuxの改善">【週次報告】テレグラム在庫管理BOT開発 - 第6週：セキュリティ設定およびUXの改善</h1>
<hr>
<h2 id="🛠️-主な実装内容">🛠️ 主な実装内容</h2>
<h3 id="1-apiトークンのセキュリティ設定">1. APIトークンのセキュリティ設定</h3>
<p>コード内に直接記述されていたトークンを <code>.env</code> ファイルに分離しました。GitHub などの公開リポジトリへの漏洩を防ぐための必須処置であり、環境変数をロードして呼び出す安全な設計を適用しました。</p>
<h3 id="2-在庫不足自動アラートシステム">2. 在庫不足自動アラートシステム</h3>
<p>在庫が特定のしきい値（10個）を下回った際、自動的に <strong>⚠️ 在庫不足アラート</strong> をリスト形式で通知するロジックを実装しました。これにより、ユーザーが再発注のタイミングを即座に判断できるよう利便性を高めました。</p>
<h3 id="3-ユーザーガイド-start-コマンドの構築">3. ユーザーガイド <code>/start</code> コマンドの構築</h3>
<p>初めてのユーザーでもスムーズに利用できるよう、BOTの用途と使用可能なコマンド一覧を案内する <code>/start</code>機能を実装しました。UX（ユーザーエクスペリエンス）を考慮し、マークダウン形式を活用して視認性の高いインターフェースを提供しました。</p>
<h2 id="⚠️-トラブルシューティング">⚠️ トラブルシューティング</h2>
<h3 id="課題-1：macosにおける-env-ファイルの拡張子認識エラー">課題 1：macOSにおける <code>.env</code> ファイルの拡張子認識エラー</h3>
<ul>
<li><strong>事象：</strong> 環境変数のロードに失敗し、トークンが読み込めない。</li>
<li><strong>原因：</strong> テキストエディタの仕様により、不可視の <code>.txt</code> 拡張子が付与され、実ファイル名が <code>.env.txt</code> になっていた。</li>
<li><strong>解決：</strong> ターミナルでファイル構造を確認し、拡張子を強制的に削除することで正常に読み込みを完了。</li>
</ul>
<h3 id="課題-2：例外処理実装時のインデント（indentationerror）">課題 2：例外処理実装時のインデント（IndentationError）</h3>
<ul>
<li><strong>事象：</strong> <code>try-except</code> 構文の挿入中に文法エラーが発生し、プログラムが停止。</li>
<li><strong>原因：</strong> エディタ上でタブとスペースが混在し、Python特有のインデントルールが崩れたため。</li>
<li><strong>解決：</strong> IDLE のインデント調整機能を活用し、コードブロックの間隔をスペース4つに統一して解決。</li>
</ul>
<h2 id="結果">結果</h2>
<p><img src="https://velog.velcdn.com/images/aiprompt9908-max/post/28a80056-2bed-4861-bc9d-8705d6924603/image.png" alt=""></p>
<hr>
<h2 id="🇺🇸-english-version">🇺🇸 English Version</h2>
<h1 id="weekly-report-telegram-inventory-bot---week-6-security--ux-optimization">[Weekly Report] Telegram Inventory Bot - Week 6: Security &amp; UX Optimization</h1>
<hr>
<h2 id="🛠️-implementation-details">🛠️ Implementation Details</h2>
<h3 id="1-api-token-security-management">1. API Token Security Management</h3>
<p>To prevent credential leaks, I migrated the Telegram API token from the source code to a separate <code>.env</code> file. This ensures security when sharing code on platforms like GitHub by using the <code>python-dotenv</code> library to load sensitive data.</p>
<h3 id="2-automated-low-stock-alert-system">2. Automated Low-Stock Alert System</h3>
<p>I implemented a proactive monitoring logic that triggers a <strong>⚠️ Low Stock Notification</strong> when an item&#39;s quantity falls below a defined threshold (10 units). This feature enables efficient inventory management by highlighting items that require immediate restocking.</p>
<h3 id="3-user-onboarding-via-start-command">3. User Onboarding via <code>/start</code> Command</h3>
<p>To improve the user experience (UX), I designed a <code>/start</code> command that provides a comprehensive guide on how to use the bot. By using Markdown formatting, I ensured that the command list and instructions are clear and easy for new users to follow.</p>
<h2 id="⚠️-troubleshooting">⚠️ Troubleshooting</h2>
<h3 id="issue-1-hidden-file-extension-conflict-on-macos">Issue 1: Hidden File Extension Conflict on macOS</h3>
<ul>
<li><strong>Symptoms:</strong> Failed to load environment variables from the <code>.env</code> file.</li>
<li><strong>Root Cause:</strong> macOS TextEdit appended a hidden <code>.txt</code> extension, resulting in a filename of <code>.env.txt</code>.</li>
<li><strong>Resolution:</strong> Used terminal commands to identify the hidden extension and renamed the file correctly.</li>
</ul>
<h3 id="issue-2-indentationerror-during-exception-handling">Issue 2: <code>IndentationError</code> during Exception Handling</h3>
<ul>
<li><strong>Symptoms:</strong> Syntax error triggered when adding <code>try-except</code> blocks.</li>
<li><strong>Root Cause:</strong> Inconsistency between Tabs and Spaces in the IDLE editor, breaking Python&#39;s structural rules.</li>
<li><strong>Resolution:</strong> Standardized the code indentation (4 spaces) using IDLE&#39;s &quot;Indent Region&quot; tool to ensure structural integrity.</li>
</ul>
<h2 id="result">Result</h2>
<p><img src="https://velog.velcdn.com/images/aiprompt9908-max/post/7d0c0383-abc3-4aca-a32c-78ee24971e6a/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Project #1] inventory management_bot - 5 week]]></title>
            <link>https://velog.io/@aiprompt9908-max/Project-1-inventory-managementbot-5-week</link>
            <guid>https://velog.io/@aiprompt9908-max/Project-1-inventory-managementbot-5-week</guid>
            <pubDate>Mon, 13 Apr 2026 04:13:33 GMT</pubDate>
            <description><![CDATA[<h3 id="1-korean-개발-일지"><strong>1. [KOREAN] 개발 일지</strong></h3>
<p><strong>📅 오늘의 목표</strong></p>
<ul>
<li><strong>데이터 추가 기능:</strong> 새로운 품목을 단위(Unit)와 함께 등록하는 <code>/add</code> 명령어 구현</li>
<li><strong>데이터 시각화:</strong> <code>matplotlib</code>을 활용해 재고 현황을 한눈에 파악할 수 있는 가로 막대 그래프 생성</li>
<li><strong>가독성 개선:</strong> 항목이 겹치지 않게 레이아웃을 조정하고 눈금을 10 단위로 고정</li>
</ul>
<p><strong>🧠 주요 학습 내용</strong></p>
<ul>
<li><strong>동적 인자 처리:</strong> <code>context.args</code>를 활용해 이름, 수량, 단위를 동시에 입력받는 방식 습득</li>
<li><strong>시각화 최적화:</strong> <code>plt.barh</code>와 <code>np.arange</code>를 사용하여 대량의 데이터를 효과적으로 시각화하는 법 이해</li>
<li><strong>데이터 무결성:</strong> 저장(<code>to_csv</code>) 로직의 순서를 조정하여 에러 시 데이터 유실을 방지하는 설계 학습</li>
</ul>
<p><strong>🛠️ 트러블슈팅 (Troubleshooting)</strong></p>
<table>
<thead>
<tr>
<th>상황</th>
<th>원인</th>
<th>해결 방법</th>
</tr>
</thead>
<tbody><tr>
<td><strong>AttributeError 발생</strong></td>
<td><code>ylabel</code>을 <code>ylable</code>로 오타 입력</td>
<td><code>plt.ylabel()</code>로 철자 수정 후 정상 작동 확인</td>
</tr>
<tr>
<td><strong>NameError (item_name)</strong></td>
<td>변수명(<code>new_item</code>)과 호출명(<code>item_name</code>) 불일치</td>
<td>변수명을 <code>new_item</code>으로 통일하여 해결</td>
</tr>
<tr>
<td><strong>데이터 미반영 현상</strong></td>
<td>저장 전 단계에서 에러 발생 시 파일 저장이 안 됨</td>
<td>불필요한 로직 제거 및 저장 코드 실행 순서 안정화</td>
</tr>
<tr>
<td><strong>눈금 가독성 저하</strong></td>
<td>자동 눈금 설정으로 인해 수량 파악이 어려움</td>
<td>눈금을 10 단위로 고정하고 격자(Grid) 추가</td>
</tr>
</tbody></table>
<hr>
<h3 id="2-english-development-log"><strong>2. [ENGLISH] Development Log</strong></h3>
<p><strong>📅 Today&#39;s Goals</strong></p>
<ul>
<li><strong>Create Feature:</strong> Implement the <code>/add</code> command to register new items with units</li>
<li><strong>Visualization:</strong> Develop a horizontal bar chart to display inventory levels clearly</li>
</ul>
<p><strong>🧠 Key Concepts Learned</strong></p>
<ul>
<li><strong>Parameter Handling:</strong> Improved skills in processing multiple arguments using <code>context.args</code></li>
<li><strong>Data Presentation:</strong> Learned to control axis intervals and layouts for professional charts</li>
</ul>
<p><strong>🛠️ Troubleshooting</strong></p>
<table>
<thead>
<tr>
<th>ssue</th>
<th>Cause</th>
<th>Solution</th>
</tr>
</thead>
<tbody><tr>
<td><strong>Typo in Matplotlib</strong></td>
<td>Misspelled <code>ylabel</code> as <code>ylable</code></td>
<td>Corrected to <code>plt.ylabel()</code></td>
</tr>
<tr>
<td><strong>Variable Mismatch</strong></td>
<td>Confusion between <code>new_item</code> and <code>item_name</code>variables</td>
<td>Unified all references to <code>new_item</code></td>
</tr>
<tr>
<td><strong>Data Sync Issue</strong></td>
<td>Code crashed before saving to CSV</td>
<td>Removed conflicting logic and ensured <code>to_csv()</code>executes correctly</td>
</tr>
<tr>
<td><strong>Scale Readability</strong></td>
<td>Irregular axis intervals made data hard to read</td>
<td>Fixed intervals to units of 10 for better clarity</td>
</tr>
</tbody></table>
<hr>
<h3 id="3-japanese-開発記録-日本語版"><strong>3. [JAPANESE] 開発記録 (日本語版)</strong></h3>
<p><strong>📅 今日の目標</strong></p>
<ul>
<li><strong>データ追加機能：</strong> 新規アイテムを単位と共に登録する <code>/add</code> コマンドの実装</li>
<li><strong>データの可視化：</strong> 在庫状況を一目で把握できる横棒グラフの生成</li>
</ul>
<p><strong>🧠 主な学習内容</strong></p>
<ul>
<li><strong>動的引数の処理：</strong> <code>context.args</code> を活用し、名前・数量・単位を同時に受け取る処理を習득</li>
<li><strong>可視化の最適化：</strong> <code>plt.barh</code> と <code>np.arange</code> を使い、大量のデータを効果的に視覚化する方法を理解</li>
<li><strong>データの整合性：</strong> 保存（<code>to_csv</code>）ロジックの順序を調整し、エラー時のデータ紛失を防ぐ設計を学習</li>
</ul>
<p><strong>🛠️ トラブルシューティング</strong></p>
<table>
<thead>
<tr>
<th>状況</th>
<th>原因</th>
<th>解決方法</th>
</tr>
</thead>
<tbody><tr>
<td><strong>AttributeError 発生</strong></td>
<td><code>ylabel</code> を <code>ylable</code> と綴り間違い</td>
<td><code>plt.ylabel()</code> に修正し正常動作を確認</td>
</tr>
<tr>
<td><strong>NameError 発生</strong></td>
<td>変수名(<code>new_item</code>)と呼び出し名(<code>item_name</code>)の不一致</td>
<td>変数名を <code>new_item</code> に統一して解決</td>
</tr>
<tr>
<td><strong>データが反映されない</strong></td>
<td>保存直前のエラーによりファイル更新が失敗</td>
<td>不要なロジックを削除し保存処理を安定化</td>
</tr>
<tr>
<td><strong>目盛りの視認性低下</strong></td>
<td>自動設定による目盛りの間隔が不明確</td>
<td>目盛りを10単位に固定しグリッドを追加</td>
</tr>
</tbody></table>
<hr>
<p><strong>📸 실행 결과 (Result Photos,結果)</strong>
<img src="https://velog.velcdn.com/images/aiprompt9908-max/post/f9e0365b-3c84-43cd-ab2a-4a5ae0bc27f2/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Project #1] inventory management_bot - 4 week]]></title>
            <link>https://velog.io/@aiprompt9908-max/Project-1-inventory-managementbot-4-week</link>
            <guid>https://velog.io/@aiprompt9908-max/Project-1-inventory-managementbot-4-week</guid>
            <pubDate>Mon, 06 Apr 2026 02:04:40 GMT</pubDate>
            <description><![CDATA[<h3 id="1-오늘의-목표"><strong>1. 오늘의 목표</strong></h3>
<ul>
<li><strong>예외 처리(Exception Handling):</strong> 사용자의 잘못된 입력(문자 입력 등)에도 봇이 죽지 않게 방어 코드 작성.</li>
<li><strong>데이터 삭제 기능:</strong> 더 이상 필요 없는 품목을 장부에서 지우는 <code>/del</code> 명령어 구현.</li>
</ul>
<h3 id="2-주요-학습-내용"><strong>2. 주요 학습 내용</strong></h3>
<ul>
<li><strong>Try-Except 문</strong>: <code>int()</code> 변환 시 숫자가 아닌 값이 들어오면 발생하는 <code>ValueError</code>를 포착하여 프로그램의 비정상 종료 방지.</li>
<li><strong>Early Exit (return)</strong>: 에러 발생 지점에서 <code>return</code>을 사용하여 로직을 즉시 종료하고 데이터 오염 방지.</li>
<li><strong>데이터 필터링 삭제</strong>: <code>df = df[df[&#39;item&#39;] != item_name]</code> 공식을 사용하여 특정 항목만 제외한 새로운 데이터프레임 구성.</li>
</ul>
<h3 id="3-트러블슈팅-troubleshooting"><strong>3. 트러블슈팅 (Troubleshooting)</strong></h3>
<table>
<thead>
<tr>
<th>상황</th>
<th>원인</th>
<th>해결 방법</th>
</tr>
</thead>
<tbody><tr>
<td><strong>정상 입력인데 반응 없음</strong></td>
<td><code>df</code> 로직이 <code>except</code> 블록 안으로 잘못 들여쓰기 됨</td>
<td>들여쓰기(Indentation)를 한 칸 밖으로 빼서 논리 구조 수정</td>
</tr>
<tr>
<td><strong>대소문자 불일치</strong></td>
<td><code>.capitalize()</code> 사용 시 <code>JavaChip</code>이 <code>Javachip</code>으로 변환됨</td>
<td>장부 데이터의 이름을 첫 글자만 대문자로 통일</td>
</tr>
</tbody></table>
<h3 id="4-실행-결과-result-photos"><strong>4. 실행 결과 (Result Photos)</strong></h3>
<p><img src="https://velog.velcdn.com/images/aiprompt9908-max/post/5dc94fb4-93df-4f99-92b6-4f30b91b5510/image.png" alt=""></p>
<hr>
<h3 id="1-todays-goals"><strong>1. Today&#39;s Goals</strong></h3>
<ul>
<li><strong>Service Stabilization:</strong> Implement &quot;defensive coding&quot; to prevent crashes from invalid user inputs.</li>
<li><strong>Deletion Feature:</strong> Add a <code>/del</code> command to remove items from the inventory.</li>
</ul>
<h3 id="2-key-concepts-learned"><strong>2. Key Concepts Learned</strong></h3>
<ul>
<li><strong>Exception Handling</strong>: Used <code>Try-Except</code> blocks to catch <code>ValueError</code> during string-to-integer conversion.</li>
<li><strong>Logic Flow (Early Exit)</strong>: Applied <code>return</code> within the exception block to stop the function immediately if an error occurs.</li>
<li><strong>Pandas Deletion</strong>: Mastered row deletion by reassigning the DataFrame with filtered data.</li>
</ul>
<h3 id="3-troubleshooting"><strong>3. Troubleshooting</strong></h3>
<table>
<thead>
<tr>
<th>Issue</th>
<th>Cause</th>
<th>Solution</th>
</tr>
</thead>
<tbody><tr>
<td><strong>No response on valid input</strong></td>
<td>Main logic was misplaced inside the <code>except</code>block scope</td>
<td>Adjusted indentation to align the main logic with the <code>try-except</code> block</td>
</tr>
<tr>
<td><strong>Case Sensitivity Issue</strong></td>
<td><code>.capitalize()</code> caused mid-word capital letters to be lowercased</td>
<td>Recognized the need for data normalization (e.g., JavaChip to Javachip)</td>
</tr>
</tbody></table>
<h3 id="4-execution-results"><strong>4. Execution Results</strong></h3>
<p><img src="https://velog.velcdn.com/images/aiprompt9908-max/post/3b490a33-2d3f-417a-a756-d2cbc724d0df/image.png" alt=""></p>
<hr>
<h3 id="1-今日の目標"><strong>1. 今日の目標</strong></h3>
<ul>
<li><strong>サービスの安定化：</strong> ユーザーの誤入力によるエラーを防ぐための「例外処理」の実装。</li>
<li><strong>削除機能の実装：</strong> 不要な項目をリストから削除する <code>/del</code> コマンドの追加。</li>
</ul>
<h3 id="2-主な学習内容"><strong>2. 主な学習内容</strong></h3>
<ul>
<li><strong>例外処理 (Try-Except)</strong>: 文字列を数値に変換する際の <code>ValueError</code> をキャッチし、プログラムの停止を回避。</li>
<li><strong>早期リターン (return)</strong>: エラー発生時に <code>return</code> を実行し、不正なデータが保存されるのを論理的に防止。</li>
<li><strong>データの削除</strong>: 条件指定によるフィルタリングを用いて、特定の行を除外したデータフレームを再構成。</li>
</ul>
<h3 id="3-トラブルシューティング-troubleshooting"><strong>3. トラブルシューティング (Troubleshooting)</strong></h3>
<table>
<thead>
<tr>
<th>状況</th>
<th>原因</th>
<th>解決方法</th>
</tr>
</thead>
<tbody><tr>
<td><strong>正常入力でも無反応</strong></td>
<td>メインロジックが <code>except</code> ブロック内のインデントに含まれていた</td>
<td>インデントを修正し、論理構造を正しく配置</td>
</tr>
<tr>
<td><strong>大文字・小文字の不一致</strong></td>
<td><code>.capitalize()</code> により単語内の大文字が小文字に変換された</td>
<td>データの正規化（JavaChip → Javachipなど）の必要性を確認</td>
</tr>
</tbody></table>
<h3 id="４。-実行結果-result-photos"><strong>４。 実行結果 (Result Photos)</strong></h3>
<p><img src="https://velog.velcdn.com/images/aiprompt9908-max/post/af66191b-4523-4407-a4d5-6d9a80224ad5/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트] 입문 Day. 16 ]]></title>
            <link>https://velog.io/@aiprompt9908-max/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%9E%85%EB%AC%B8-Day.-16</link>
            <guid>https://velog.io/@aiprompt9908-max/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%9E%85%EB%AC%B8-Day.-16</guid>
            <pubDate>Wed, 01 Apr 2026 10:21:44 GMT</pubDate>
            <description><![CDATA[<h1 id="문제-1-편지">문제 1) 편지</h1>
<h2 id="문제">[문제]</h2>
<p>머쓱이는 할머니께 생신 축하 편지를 쓰려고 합니다. 할머니가 보시기 편하도록 글자 한 자 한 자를 가로 2cm 크기로 적으려고 하며, 편지를 가로로만 적을 때, 축하 문구 <code>message</code>를 적기 위해 필요한 편지지의 최소 가로길이를 return 하도록 solution 함수를 완성해주세요.</p>
<h3 id="1-내-정답">1. 내 정답</h3>
<pre><code class="language-python">def solution(message)
    return len(message)*2</code></pre>
<h3 id="2-풀이">2. 풀이</h3>
<ul>
<li>len(message)*2 : message 글자 길이에 2를 곱하기</li>
</ul>
<hr>
<h1 id="문제-2-가장-큰-수-찾기">문제 2) 가장 큰 수 찾기</h1>
<h2 id="문제-1">[문제]</h2>
<p>정수 배열 <code>array</code>가 매개변수로 주어질 때, 가장 큰 수와 그 수의 인덱스를 담은 배열을 return 하도록 solution 함수를 완성해보세요.</p>
<h3 id="1-내-정답-1">1. 내 정답</h3>
<pre><code class="language-python">def solution(array)
    big = max(array)
    num = array.index(big)
    return [big,num]</code></pre>
<h3 id="2-풀이-1">2. 풀이</h3>
<ul>
<li>big = max(array): big에다가 array에서 가장 큰 수 넣기</li>
<li>num = array.index(big): num에다가 big의 index 번호 넣기</li>
</ul>
<hr>
<h1 id="문제-3-문자열-계산하기">문제 3) 문자열 계산하기</h1>
<h2 id="문제-2">[문제]</h2>
<p><code>my_string</code>은 &quot;3 + 5&quot;처럼 문자열로 된 수식입니다. 문자열 <code>my_string</code>이 매개변수로 주어질 때, 수식을 계산한 값을 return 하는 solution 함수를 완성해주세요.</p>
<h3 id="1-내-정답-2">1. 내 정답</h3>
<pre><code class="language-python">def solution(my_string):
    s = my_string.split()
    answer = int(s[0])

    for i in range(1,len(s),2):
        if s[i] == &quot;+&quot;:
            answer += int(s[i + 1])
        else:
            answer -= int(s[i + 1])

    return answer</code></pre>
<h3 id="2-풀이-2">2. 풀이</h3>
<ul>
<li>s = my_string.split(): my_string을 공백 기준으로 잘라서 s에 저장</li>
<li>answer = int(s[0]): 첫 번째 숫자를 꺼내서 정수로 바꾼 뒤 answer에 넣기</li>
<li>for i in range(1, len(s), 2): s에서 연산자가 있는 자리만 골라서 반복</li>
<li>if s[i] == “+”: i가 +와 같다면</li>
<li>answer += int(s[i + 1]): 현재 답에다가 다음 숫자를 더하기</li>
<li>else, answer -= int(s[i+1]): 아니라면 현재 답에다가 다음 숫자 빼기</li>
</ul>
<hr>
<h1 id="문제-4-배열의-유사도">문제 4) 배열의 유사도</h1>
<h2 id="문제-3">[문제]</h2>
<p>두 배열이 얼마나 유사한지 확인해보려고 합니다. 문자열 배열 <code>s1</code>과 <code>s2</code>가 주어질 때 같은 원소의 개수를 return하도록 solution 함수를 완성해주세요.</p>
<h3 id="1-내-정답-3">1. 내 정답</h3>
<pre><code class="language-python">def solution(s1,s2):
    answer = 0

    for i in s1:
        if i in s2:
            answer += 1
    return answer</code></pre>
<h3 id="2-풀이-3">2. 풀이</h3>
<ul>
<li>answer = 0: 동일한 값이 있다면 카운트 해서 숫자를 넣어줄 변수 생성</li>
<li>for i in s1: i에 순서대로 s1에 있는 데이터들을 대입한다.</li>
<li>if i in s2: 만약 s2에 i가 있다면</li>
<li>answer += 1: answer에 1씩 더해준다</li>
</ul>
<hr>
<h2 id="✨-마무리">✨ 마무리</h2>
<p>이번 문제들은 다소 쉽다고? 느껴졌었다. </p>
<p>그동안 사용해왔던 것들에서 문제에서 사용 가능한 것들을 꺼내오기만 하면 되는 수준이었다고 생각한다. </p>
<p>이렇게 한 번 더 개념을 정리하고 어느 상황에서 사용할 수 있는지를 계속해서 적립해 나가야겠다고 생각한다.</p>
<p>今回の問題は、比較的簡単だと感じました。</p>
<p>これまで使ってきたものの中から、問題で使えるものを取り出して使えばよいレベルだったと思います。</p>
<p>このように、もう一度概念を整理して、どのような場面で使えるのかを引き続き積み重ねていきたいと思います。</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Project #1] inventory management_bot - 3 week]]></title>
            <link>https://velog.io/@aiprompt9908-max/Project-1-inventory-managementbot-3-week</link>
            <guid>https://velog.io/@aiprompt9908-max/Project-1-inventory-managementbot-3-week</guid>
            <pubDate>Wed, 01 Apr 2026 10:04:24 GMT</pubDate>
            <description><![CDATA[<h3 id="1-오늘의-목표"><strong>1. 오늘의 목표</strong></h3>
<ul>
<li>단순 조회를 넘어, 데이터를 직접 수정하는 기능 추가하기</li>
<li><code>/in [아이템] [수량]</code>, <code>/out [아이템] [수량]</code> 명령어로 재고 증감 구현</li>
</ul>
<h3 id="2-주요-학습-내용"><strong>2. 주요 학습 내용</strong></h3>
<ol>
<li><strong>context.args 활용:</strong> 사용자가 명령어 뒤에 입력한 추가 정보(아이템명, 수량)를 리스트 형태로 받아오는 법을 학습.</li>
<li><strong>데이터 타입 변환 (int):</strong> 텔레그램에서 들어온 &#39;글자&#39; 형태의 숫자를 계산이 가능한 &#39;정수&#39; 형태로 바꾸는 과정의 중요성 체감.</li>
<li><strong>데이터 전처리 (capitalize, strip):</strong> 사용자가 소문자로 입력해도 장부의 대문자 데이터와 매칭될 수 있도록 글자를 다듬는 법 학습.</li>
<li><strong>들여쓰기의 논리:</strong> 파이썬에서 들여쓰기 한 칸이 코드의 실행 순서와 조건에 얼마나 큰 영향을 미치는지 직접 디버깅하며 확인.</li>
</ol>
<h3 id="3-오늘-만난-에러와-해결법-troubleshooting"><strong>3. 오늘 만난 에러와 해결법 (Troubleshooting)</strong></h3>
<table>
<thead>
<tr>
<th>에러 메시지 / 상황</th>
<th>원인</th>
<th>해결 방법</th>
</tr>
</thead>
<tbody><tr>
<td><code>AttributeError: module &#39;pandas&#39; has no attribute &#39;read&#39;</code></td>
<td><code>read_csv</code>를 <code>read.csv</code>로 잘못 기입</td>
<td>점(<code>.</code>)을 언더바(<code>_</code>)로 수정</td>
</tr>
<tr>
<td><code>ufunc &#39;add&#39; did not contain a loop...</code></td>
<td>숫자와 글자를 더하려고 함</td>
<td><code>int(context.args[1])</code>로 숫자 변환 처리</td>
</tr>
<tr>
<td>실행은 되는데 숫자가 안 바뀜</td>
<td><code>to_csv</code> 저장 로직이 특정 조건문 안에 갇혀 있음</td>
<td>저장 코드를 <code>if-else</code> 문 밖으로 빼서 공통 실행되게 수정</td>
</tr>
</tbody></table>
<h3 id="4-결과"><strong>4. 결과</strong></h3>
<ul>
<li><code>/in Milk 5</code> 입력 시 재고가 즉시 반영됨 (파일 데이터 수정 완료!)</li>
</ul>
<p><img src="https://velog.velcdn.com/images/aiprompt9908-max/post/8733590f-1a45-4e5b-83e0-a15d0d329860/image.png" alt=""></p>
<hr>
<h3 id="english-version"><strong>[English Version]</strong></h3>
<h3 id="1-todays-goals"><strong>1. Today&#39;s Goals</strong></h3>
<ul>
<li>Move beyond data retrieval and implement data modification.</li>
<li>Create <code>/in</code> and <code>/out</code> commands to manage inventory levels in real-time.</li>
</ul>
<h3 id="2-key-concepts-learned"><strong>2. Key Concepts Learned</strong></h3>
<ul>
<li><strong>Handling <code>context.args</code>:</strong> Learned how to extract extra information (arguments) provided by users after a command.</li>
<li><strong>Type Casting (<code>int</code>):</strong> Understood that user input is always a string, and converting it to an integer is essential for calculations.</li>
<li><strong>Data Sanitization:</strong> Used <code>.strip()</code> and <code>.capitalize()</code> to ensure user input matches the format in the CSV file regardless of case or spacing.</li>
<li><strong>Logic Flow &amp; Indentation:</strong> Realized how crucial indentation is in Python for determining when a specific block of code (like saving a file) executes.</li>
</ul>
<h3 id="3-troubleshooting"><strong>3. Troubleshooting</strong></h3>
<table>
<thead>
<tr>
<th>Error / Situation</th>
<th>Cause</th>
<th>Solution</th>
</tr>
</thead>
<tbody><tr>
<td><code>AttributeError: ... no attribute &#39;read&#39;</code></td>
<td>Used <code>read.csv</code> instead of <code>read_csv</code></td>
<td>Corrected the syntax to <code>read_csv</code></td>
</tr>
<tr>
<td><code>ufunc &#39;add&#39; ... dtype(&#39;int64&#39;), dtype(&#39;&lt;U1&#39;)</code></td>
<td>Attempted to add a string to an integer</td>
<td>Applied <code>int()</code> to the user input</td>
</tr>
<tr>
<td>No errors, but no data change</td>
<td>The save function (<code>to_csv</code>) was misplaced</td>
<td>Moved the save logic outside the conditional blocks</td>
</tr>
</tbody></table>
<hr>
<h3 id="japanese-version"><strong>[Japanese Version]</strong></h3>
<h3 id="1-今日の目標"><strong>1. 今日の目標</strong></h3>
<ul>
<li>単なるデータ照会を超え、データを直接修正する機能を実装する。</li>
<li><code>/in</code> および <code>/out</code> コマンドで在庫の増減をリアルタイムで反映させる。</li>
</ul>
<h3 id="2-主な学習内容"><strong>2. 主な学習内容</strong></h3>
<ul>
<li><strong>context.args の活用：</strong> コマンドの後に入力された引数（アイテム名、数量）をリスト形式で取得する方法を習得。</li>
<li><strong>データ型の変換 (int)：</strong> テレグラムから届く「文字列」としての数字を、計算可能な「整数」に変換する重要性を実感。</li>
<li><strong>データの前処理：</strong> ユーザーが小文字で入力しても、CSVのデータと一致するように <code>.capitalize()</code> や <code>.strip()</code> でデータを整える方法を学習。</li>
<li><strong>インデントの論理：</strong> Pythonにおけるインデントが、コードの実行順序や条件にどれほど大きな影響を与えるかをデバッグを通じて確認。</li>
</ul>
<h3 id="3-トラブルシューティング"><strong>3. トラブルシューティング</strong></h3>
<table>
<thead>
<tr>
<th>エラーメッセージ / 状況</th>
<th>原因</th>
<th>解決方法</th>
</tr>
</thead>
<tbody><tr>
<td><code>AttributeError: ... no attribute &#39;read&#39;</code></td>
<td><code>read_csv</code> を <code>read.csv</code> と誤記</td>
<td><code>read_csv</code> に修正</td>
</tr>
<tr>
<td><code>ufunc &#39;add&#39; ... (dtype(&#39;int64&#39;), dtype(&#39;&lt;U1&#39;))</code></td>
<td>数値と文字列を加算しようとした</td>
<td><code>int()</code> を使用して数値に変換</td>
</tr>
<tr>
<td>エラーはないが数値が変わらない</td>
<td>保存処理 (<code>to_csv</code>) の位置ミス</td>
<td>保存コードを <code>if-else</code> 文の外に出して共通実行に変更</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트] 입문 Day. 15]]></title>
            <link>https://velog.io/@aiprompt9908-max/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%9E%85%EB%AC%B8-Day.-15</link>
            <guid>https://velog.io/@aiprompt9908-max/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%9E%85%EB%AC%B8-Day.-15</guid>
            <pubDate>Sun, 29 Mar 2026 09:53:50 GMT</pubDate>
            <description><![CDATA[<h1 id="문제-1-영어가-싫어요">문제 1) 영어가 싫어요</h1>
<h2 id="문제">[문제]</h2>
<p>영어가 싫은 머쓱이는 영어로 표기되어있는 숫자를 수로 바꾸려고 합니다. 문자열 <code>numbers</code>가 매개변수로 주어질 때, <code>numbers</code>를 정수로 바꿔 return 하도록 solution 함수를 완성해 주세요.</p>
<h3 id="1-내-정답">1. 내 정답</h3>
<pre><code class="language-python">def solution(numbers)
    num_dict = {
        &quot;zero&quot;: &quot;0&quot;,
        &quot;one&quot;: &quot;1&quot;,
        &quot;two&quot;: &quot;2&quot;,
        &quot;three&quot;: &quot;3&quot;,
        &quot;four&quot;: &quot;4&quot;,
        &quot;five&quot;: &quot;5&quot;,
        &quot;six&quot;: &quot;6&quot;,
        &quot;seven&quot;: &quot;7&quot;,
        &quot;eight&quot;: &quot;8&quot;,
        &quot;nine&quot;: &quot;9&quot;
    }

    for word, num in num_dict.items():
        numbers = numbers.replace(word,num)

    return int(numbers)</code></pre>
<h3 id="2-풀이">2. 풀이</h3>
<ul>
<li>num_dict = { “zero” : “0” ~ “nine” : “9”}: 딕셔너리로 짝꿍을 저장하는 상자이다. zero가 나오면 0으로 바꾸겠다는 뜻</li>
<li>for word, num in num_dict.items(): num_dict.items() 는 딕셔너리에 들어 있는 내용을 하나씩 꺼내라는 뜻으로 word에는 영어 단어가 들어가고 num에는 숫자 문자열이 들어간다.</li>
<li>numbers = numbers.replace(word,num): numbers 안에 있는 word를 찾아서 그걸 num으로 바꿔라</li>
<li>return int(numbers): 문자열로 된 numbers를 숫자 타입으로 바꿔준다</li>
</ul>
<hr>
<h1 id="문제-2-인덱스-바꾸기">문제 2) 인덱스 바꾸기</h1>
<h2 id="문제-1">[문제]</h2>
<p>문자열 <code>my_string</code>과 정수 <code>num1</code>, <code>num2</code>가 매개변수로 주어질 때, <code>my_string</code>에서 인덱스 <code>num1</code>과 인덱스 <code>num2</code>에 해당하는 문자를 바꾼 문자열을 return 하도록 solution 함수를 완성해보세요.</p>
<h3 id="1-내-정답-1">1. 내 정답</h3>
<pre><code class="language-python">def solution(my_string, num1, num2):
    x = list(my_string)
    x[num1],x[num2] = x[num2],x[num1]
    return &#39;&#39;.join(x)
    print(x)</code></pre>
<h3 id="2-풀이-1">2. 풀이</h3>
<ul>
<li>x = list (my_string): my_string을 list로 변환하여 x에 넣는다</li>
<li>x[num1], x[num2] = x[num2], x[num1]: num 1과 num2의 위치를 바꾼다.</li>
<li>return ‘’.join(x): x를 공백없이 합쳐서 값을 리턴한다.</li>
</ul>
<hr>
<h1 id="문제-3-한-번만-등장한-문자">문제 3) 한 번만 등장한 문자</h1>
<h2 id="문제-2">[문제]</h2>
<p>문자열 <code>s</code>가 매개변수로 주어집니다. <code>s</code>에서 한 번만 등장하는 문자를 사전 순으로 정렬한 문자열을 return 하도록 solution 함수를 완성해보세요. 한 번만 등장하는 문자가 없을 경우 빈 문자열을 return 합니다.</p>
<h3 id="1-내-정답-2">1. 내 정답</h3>
<pre><code class="language-python">def solution(s):
    answer = &#39;&#39;
    for i in s:
        if s.count == 1:
            answer += i
    return &#39;&#39;.join(sorted(answer)</code></pre>
<h3 id="2-풀이-2">2. 풀이</h3>
<ul>
<li>answer = ‘ ‘ : 문자열을 반환하라 했기 때문에, 빈 문자열 생성</li>
<li>for i in s: i에다가 s에 있는 문자들을 하나씩 대입한다.</li>
<li>if s.count ==1: 우리가 알고 싶은건 글자 i가 문자열 전체 s 안에서 몇 번 나왔는가 이기 때문에 s에서 count 된 수가 1과 같다면</li>
<li>answer += i: answer에 i를 추가해라</li>
<li>return ‘’.join (sorted(answer): 정렬한 anwer을 합쳐서 리턴하라</li>
</ul>
<hr>
<h1 id="문제-4-약수-구하기">문제 4) 약수 구하기</h1>
<h2 id="문제-3">[문제]</h2>
<p>정수 <code>n</code>이 매개변수로 주어질 때, <code>n</code>의 약수를 오름차순으로 담은 배열을 return하도록 solution 함수를 완성해주세요.</p>
<h3 id="1-내-정답-3">1. 내 정답</h3>
<pre><code class="language-python">def solution(n):
    answer = []
    for i in range(1,n+1):
        if n % i == 0;
            answer.append(i)
    return answer</code></pre>
<h3 id="2-풀이-3">2. 풀이</h3>
<ul>
<li>for i in range(1,n+1): 1부터 n까지의 범위에 있는 수들을 차례대로 i에 대입한다.</li>
<li>if n % i == 0;: 만약 n을 i로 나눈 값의 나머지가 0이라면</li>
<li>answer.append(i): i를 리스트 answer에 추가하라.</li>
</ul>
<hr>
<h2 id="✨-마무리">✨ 마무리</h2>
<p>뭔가 코딩적 사고방식에 익숙해지는 느낌! </p>
<p>전에는 애매했던 개념들이 조금씩 자리를 잡고 있는 것 같다</p>
<p>예를 들어 += 와 append의 사용 방법의 차이라던가, 언제 빈 리스트를 만들고 빈 변수를 만들어야 하는지를 구분하여 사용할 수 있게 되었다.</p>
<p>지금은 입문 문제니까 간단하게 생각해서도 풀 수 있겠지만, 앞으로 만날 더 어렵고 복잡한 문제들을 풀 생각에 벌써부터 두려워지기 시작하면서 한 편으로는 두근거리기도 한다. </p>
<p>그런 문제들도 스스로 풀 수 있을 때까지 화이팅! </p>
<p>コーディング的な考え方に少しずつ慣れてきた気がする！</p>
<p>前はあいまいだった概念が、少しずつ自分の中で形になってきている気がする。</p>
<p>例えば、+= と append の使い方の違いや、どんなときに空のリストを作って、どんなときに空の変数を作るのかを区別して使えるようになってきた。</p>
<p>今はまだ入門レベルの問題だから、シンプルに考えて解けることも多いと思う。けれど、これから出会うもっと難しくて複雑な問題を思うと、今から少し怖くもなるし、その一方でわくわくもしている。</p>
<p>そんな問題も自分の力で解けるようになるまで、頑張ろう！</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Project #1] inventory management_bot - 2 week(by. kr, eng, jp)]]></title>
            <link>https://velog.io/@aiprompt9908-max/Project-1-inventory-managementbot-2-week</link>
            <guid>https://velog.io/@aiprompt9908-max/Project-1-inventory-managementbot-2-week</guid>
            <pubDate>Mon, 23 Mar 2026 03:47:16 GMT</pubDate>
            <description><![CDATA[<p>[🇰🇷Korean Version]</p>
<h2 id="📍오늘의-목표">📍오늘의 목표</h2>
<ul>
<li>단순 응답을 넘어, 외부 데이터를 읽어오는 기능 추가하기</li>
<li>/check 명령어를 통해 실시간 재고 현황 출력하기</li>
</ul>
<hr>
<h2 id="📍주요-학습-내용핵심-키워드">📍주요 학습 내용(핵심 키워드)</h2>
<h3 id="1-pandas-라이브러리aka-데이터-분석의-기본-도구">1) pandas 라이브러리(a.k.a 데이터 분석의 기본 도구)</h3>
<ul>
<li>파이썬에서 표 형태의 ㄷ이터를 다루기 쉽게 해주는 라이브러리</li>
<li>리스트보다 훨씬 쉽게 데이터 다루기가 가능하고 엑셀 작업을 파이썬으로 자동화하는 느낌</li>
<li>series: 한 줄짜리 데이터로 엑셀의 한 열과 같다</li>
<li>DataFrame: 표 전체 데이터로 행과 열이 있는 구조, 제일 많이 스이는 형태이다.</li>
</ul>
<h3 id="2-commandhandler">2) CommandHandler</h3>
<ul>
<li>사용자가 어떤 명령어를 입력하면 그 명령어를 보고 어떤 함수를 실행할지 연결해주는 역할</li>
</ul>
<h3 id="3-파일-경로와-확장자">3) 파일 경로와 확장자</h3>
<ul>
<li>프로그램이 파일을 찾을 때 확장자가 얼마나 중요한지 체감</li>
</ul>
<h3 id="4-터미널-명령어">4) 터미널 명령어</h3>
<ul>
<li>ls: 현재 폴더 파일 목록 확인</li>
<li>mv: 파일 이름 및 확장자 변경</li>
<li>sudo: 관리자 권한으로 명령 실행(비밀번호 입력 시 글자가 보이지 않는 보안 특성을 학습)</li>
</ul>
<hr>
<h2 id="📍-오늘-만난-에러와-해결법troubleshooting">📍 오늘 만난 에러와 해결법(Troubleshooting)</h2>
<table>
<thead>
<tr>
<th><strong>에러 메시지 / 상황</strong></th>
<th><strong>원인</strong></th>
<th><strong>해결 방법</strong></th>
</tr>
</thead>
<tbody><tr>
<td><code>NameError: CommandHandler...</code></td>
<td><code>import</code>에 등록 안 함</td>
<td>맨 윗줄 <code>from telegram.ext import ...</code>에 추가</td>
</tr>
<tr>
<td><code>AttributeError: ... no attribute &#39;read&#39;</code></td>
<td>오타 발생</td>
<td><code>read()</code> 대신 <code>read_csv()</code>로 수정</td>
</tr>
<tr>
<td><code>File Not Found</code> / <code>.rtf</code> 문제</td>
<td>맥 텍스트 편집기 설정 오류</td>
<td>터미널 <code>mv</code> 명령어로 확장자를 <code>.csv</code>로 강제 변경</td>
</tr>
<tr>
<td><code>Permission denied</code></td>
<td>파일 수정 권한 부족</td>
<td><code>sudo</code> 명령어를 사용해 관리자 권한으로 실행</td>
</tr>
</tbody></table>
<hr>
<h2 id="📍결과">📍결과</h2>
<p><img src="https://velog.velcdn.com/images/aiprompt9908-max/post/72f3c608-5f6f-47a4-8b8e-2b40d21503db/image.png" alt=""></p>
<h2 id="📍-다음-주-예고">📍 다음 주 예고</h2>
<p><strong>단순히 읽기만 하는 봇에서, 텔레그램으로 재고 수량을 직접 수정하는 ‘데이터 쓰기’ 기능 구현하기</strong></p>
<hr>
<p><strong>[</strong> 🇺🇸<strong>English Version]</strong></p>
<h2 id="📍todays-goals">📍<strong>Today&#39;s Goals</strong></h2>
<ul>
<li>Extend beyond simple echo responses to implement external data fetching.</li>
<li>Display real-time inventory status using the <code>/check</code> command.</li>
</ul>
<h2 id="📍key-concepts">📍<strong>Key Concepts</strong></h2>
<ul>
<li><strong>Pandas Library:</strong> The go-to tool for data analysis. It allows for seamless handling of tabular data, similar to automating Excel tasks with Python.</li>
<li><strong>Series &amp; DataFrame:</strong> A <code>Series</code> represents a single column, while a <code>DataFrame</code> is the entire table structure (rows and columns).</li>
<li><strong>CommandHandler:</strong> A bridge that connects user commands (starting with <code>/</code>) to specific functions.</li>
<li><strong>File Paths &amp; Extensions:</strong> A lesson on how critical file extensions are for a program to locate a specific file.</li>
<li><strong>Terminal Commands:</strong> <code>ls</code> (list files), <code>mv</code> (rename/move), and <code>sudo</code> (admin privileges with hidden password entry).</li>
</ul>
<h2 id="📍troubleshooting">📍<strong>Troubleshooting</strong></h2>
<table>
<thead>
<tr>
<th>Error / Situation</th>
<th>Cause</th>
<th>Solution</th>
</tr>
</thead>
<tbody><tr>
<td><code>NameError: CommandHandler...</code></td>
<td>Not registered in <code>import</code></td>
<td>Add to <code>from telegram.ext import ...</code></td>
</tr>
<tr>
<td><code>AttributeError: ... no attribute &#39;read&#39;</code></td>
<td>Typo</td>
<td>Change <code>read()</code> to <code>read_csv()</code></td>
</tr>
<tr>
<td><code>File Not Found</code> / <code>.rtf</code> issue</td>
<td>TextEdit formatting error</td>
<td>Use <code>mv</code> command to force change extension to <code>.csv</code></td>
</tr>
<tr>
<td><code>Permission denied</code></td>
<td>Lack of file modification permissions</td>
<td>Use <code>sudo</code> to run the command as an admin</td>
</tr>
</tbody></table>
<h2 id="📍-result">📍 Result</h2>
<p><img src="https://velog.velcdn.com/images/aiprompt9908-max/post/affea9f3-fe70-4138-afe9-aa101e249415/image.png" alt=""></p>
<h2 id="📍-next-weeks-preview">📍 <strong>Next Week&#39;s Preview</strong></h2>
<ul>
<li>Upgrade to a &quot;data-writing&quot; bot that can modify inventory quantities directly through Telegram!</li>
</ul>
<hr>
<h3 id="-🇯🇵japanese-version-日本語版"><strong>[</strong> 🇯🇵<strong>Japanese Version] (日本語版)</strong></h3>
<h2 id="📍-今日の目標">📍 <strong>今日の目標</strong></h2>
<ul>
<li>単純な応答(Echo)機能から一歩進み、外部データの読み込み機能を実装する。</li>
<li><code>/check</code> コマンドで、リアルタイムの在庫状況を表示させる。</li>
</ul>
<h2 id="📍主な学習内容">📍<strong>主な学習内容</strong></h2>
<ul>
<li><strong>Pandasライブラリ：</strong> データ分析の必須ツール。Excelのような表形式データをPythonで効率的に扱うためのライブラリ。</li>
<li><strong>Series &amp; DataFrame：</strong> <code>Series</code> は1列のデータを、<code>DataFrame</code> は行と列を持つ表全体のデータを指し、最も汎用的な形式である。</li>
<li><strong>CommandHandler：</strong> 特定のコマンドと実行関数を紐付ける役割。</li>
<li><strong>ファイルパスと拡張子：</strong> プログラムがファイルを認識する際、拡張子の正確さがどれほど重要かを実感。</li>
<li><strong>ターミナルコマンド：</strong> <code>ls</code> (一覧表示), <code>mv</code> (名前変更), <code>sudo</code> (管理者権限での実行、非表示パスワードの特性)。</li>
</ul>
<h2 id="📍トラブルシューティング">📍<strong>トラブルシューティング</strong></h2>
<table>
<thead>
<tr>
<th>エラーメッセージ / 状況</th>
<th>原因</th>
<th>解決方法</th>
</tr>
</thead>
<tbody><tr>
<td><code>NameError: CommandHandler...</code></td>
<td><code>import</code> に登録漏れ</td>
<td><code>from telegram.ext import ...</code> に追加</td>
</tr>
<tr>
<td><code>AttributeError: ... no attribute &#39;read&#39;</code></td>
<td>スペルミス (Typo)</td>
<td><code>read()</code> を <code>read_csv()</code> に修正</td>
</tr>
<tr>
<td><code>File Not Found</code> / <code>.rtf</code> 問題</td>
<td>テキストエディタの設定ミス</td>
<td>ターミナルの <code>mv</code> コマンドで拡張子を <code>.csv</code> に強制変更</td>
</tr>
<tr>
<td><code>Permission denied</code></td>
<td>ファイル修正権限の不足</td>
<td><code>sudo</code> コマンドを使用して管理者権限で実行</td>
</tr>
</tbody></table>
<h2 id="📍-結果">📍 結果</h2>
<p><img src="https://velog.velcdn.com/images/aiprompt9908-max/post/aa466d3c-9297-4c30-bcec-15ed24532e15/image.png" alt=""></p>
<h2 id="📍-来週の予定">📍 <strong>来週の予定</strong></h2>
<ul>
<li>読み取り専用のボットから、テレグラムで在庫数を直接修正できる「データ書き込み」機能を実装する予定！</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트] 입문 - Day. 14]]></title>
            <link>https://velog.io/@aiprompt9908-max/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%9E%85%EB%AC%B8-Day.-14</link>
            <guid>https://velog.io/@aiprompt9908-max/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%9E%85%EB%AC%B8-Day.-14</guid>
            <pubDate>Tue, 17 Mar 2026 11:50:20 GMT</pubDate>
            <description><![CDATA[<h1 id="문제-1-가까운-수">문제 1) 가까운 수</h1>
<h2 id="문제">[문제]</h2>
<p>정수 배열 <code>array</code>와 정수 <code>n</code>이 매개변수로 주어질 때, <code>array</code>에 들어있는 정수 중 <code>n</code>과 가장 가까운 수를 return 하도록 solution 함수를 완성해주세요.</p>
<h3 id="1-내-정답">1. 내 정답</h3>
<pre><code class="language-python">def solution(array,n):
    array.sort()
    return min(array, key=lambda x: abs(x-n))</code></pre>
<h3 id="2-풀이">2. 풀이</h3>
<ul>
<li>array.sort(): 배열을 작은 숫자부터 정렬</li>
<li>return min(array, key = lambda x: abs(x-n)): array 안의 숫자들 중에서 n과의 거리가 가장 작은 값을 골라라는 뜻</li>
</ul>
<hr>
<h1 id="문제-2-369-게임">문제 2) 369 게임</h1>
<h2 id="문제-1">[문제]</h2>
<p>머쓱이는 친구들과 369게임을 하고 있습니다. 369게임은 1부터 숫자를 하나씩 대며 3, 6, 9가 들어가는 숫자는 숫자 대신 3, 6, 9의 개수만큼 박수를 치는 게임입니다. 머쓱이가 말해야하는 숫자 <code>order</code>가 매개변수로 주어질 때, 머쓱이가 쳐야할 박수 횟수를 return 하도록 solution 함수를 완성해보세요.</p>
<h3 id="1-내-정답-1">1. 내 정답</h3>
<pre><code class="language-python">def solution(order):
    count = 0
    for x in str(order):
        if x in &quot;369&quot;:
            count += 1
        return count</code></pre>
<h3 id="2-풀이-1">2. 풀이</h3>
<ul>
<li>count = 0 : 박수 횟수를 더해줄 변수 생성</li>
<li>for x in str(order):  order의 숫자덩어리를 하나하나 뜯어보기 위해 문자타입으로 변경하여 하나씩 대입</li>
<li>if x in “369”: 369 중 한 개라도 x에 들어있다면</li>
<li>count += 1: count에 1씩을 더해라</li>
</ul>
<hr>
<h1 id="문제-3-암호-해독">문제 3) 암호 해독</h1>
<h2 id="문제-2">[문제]</h2>
<p>군 전략가 머쓱이는 전쟁 중 적군이 다음과 같은 암호 체계를 사용한다는 것을 알아냈습니다.</p>
<ul>
<li>암호화된 문자열 <code>cipher</code>를 주고받습니다.</li>
<li>그 문자열에서 <code>code</code>의 배수 번째 글자만 진짜 암호입니다.</li>
</ul>
<p>문자열 <code>cipher</code>와 정수 <code>code</code>가 매개변수로 주어질 때 해독된 암호 문자열을 return하도록 solution 함수를 완성해주세요.</p>
<h3 id="1-내-정답-2">1. 내 정답</h3>
<pre><code class="language-python">def solution(cipher, code):
    result = [ ]
    for i in range(code, len(cipher) + 1, code):
        result.append(cipher[i-1])
    return &#39;&#39;.join(result)</code></pre>
<h3 id="2-풀이-2">2. 풀이</h3>
<ul>
<li>result = [ ]: 뽑은 글자들을 담아둘 빈 상자를 만들기</li>
<li>for i in range(code, len(cipher) + 1, code): code번째 부터 cipher의 길이만큼 code 간격으로 뽑아 i에 대입하겠다는 뜻</li>
<li>result.append (cipher [ i - 1 ]): 해당 인덱스 위치의 글자를 result에 넣겠다는 뜻, 인덱스는 0부터 시작하게 때문에 i에 -1을 해줘야 한다.</li>
<li>return ‘ ‘ . join (result): 리스트 안의 글자들을 하나의 문자열로 붙여서 돌려달라는 뜻</li>
</ul>
<hr>
<h1 id="문제-4-대문자와-소분자">문제 4) 대문자와 소분자</h1>
<h2 id="문제-3">[문제]</h2>
<p>문자열 <code>my_string</code>이 매개변수로 주어질 때, 대문자는 소문자로 소문자는 대문자로 변환한 문자열을 return하도록 solution 함수를 완성해주세요.</p>
<h3 id="1-내-정답-3">1. 내 정답</h3>
<pre><code class="language-python">def solution(my_string):
    answer = []
    for x in my_string:
        if x in &quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ&quot;:
            answer.append(x.lower())
        else:
            answer.append(x.upper())
    return &#39;&#39;.join(answer)</code></pre>
<h3 id="2-풀이-3">2. 풀이</h3>
<ul>
<li>answer = [ ] : 변환한 문자를 넣기 위한 리스트 생성</li>
<li>for x in my_string: x에 my_string 원소들을 한 개씩 차례대로 대입</li>
<li>if x in “ABCDEFGHIJKLMNOPQRSTUVWXYZ”: x가 이 대문자 중에 있다면</li>
<li>answer.append(x.lower()): 소문자로 바꿔 answer에 추가</li>
<li>else: answer.append(x.upper()): 아니라면 대문자로 바꿔 리스트에 추가</li>
<li>return ‘ ‘ . join (answer): 하나의 문자열로 만들어 제출</li>
</ul>
<hr>
<h2 id="✨-마무리">✨ 마무리</h2>
<p>머리가 멍청하면 손과 발이 고생한다는 것을 정확히 보여주는 문제가 4번이었다. 저걸 간단하게 나타내는 방법을 몰라 저렇게 무식한 방법으로 풀 수밖에 없었다는 것이 통탄스럽다. 그래도 풀었다는 것에 의의를 둬야할까 라는 긍정적인 사고회로를 돌려보려고 하지만 쉽지는 않다.</p>
<p>아직 한참 아래인 입문 문제를 풀고 있지만 뭔가 이 코딩테스트의 풀이? 에 익숙해지고 있다는 느낌을 받았다.</p>
<p>스스로 생각하는 사고능력을 기르는 것! 매일 거르지 않고 하는 것! 조금씩 성장하는 것!에 집중하여 좌절하지 않고 나아가자. </p>
<p>4番の問題では、より簡潔な表現方法をすぐに思いつけず、結果として遠回りな解き方になった。
しかし、その過程を通じて、自分にはまだ発想の引き出しや実装の慣れが不足していることを認識できた。
現在はまだ入門レベルの問題に取り組んでいるが、少しずつコーディングテストの考え方や解法のパターンに慣れてきていると感じている。
これからも、思考力を養うこと、毎日継続すること、そして一歩ずつ成長を積み重ねることを意識しながら、着実に取り組んでいきたい。</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Project #1] inventory management_bot - 1 week]]></title>
            <link>https://velog.io/@aiprompt9908-max/Project-1-inventory-managementbot-1-week</link>
            <guid>https://velog.io/@aiprompt9908-max/Project-1-inventory-managementbot-1-week</guid>
            <pubDate>Mon, 16 Mar 2026 02:32:19 GMT</pubDate>
            <description><![CDATA[<ol>
<li>Motivation (프로젝트 동기 / プロジェクトの動機)</li>
</ol>
<p>KR: 스타벅스 수퍼바이저로서 매일 반복되는 수동 재고 관리의 비효율성을 개선하고자 프로젝트를 시작했습니다.</p>
<p>EN: As a Starbucks supervisor, I started this project to improve the inefficiency of daily manual inventory management through automation.</p>
<p>JP: スタバのスーパーバイザーとして、毎日手作業で行っている在庫管理の非効率さを改善するため、自動化プロジェクトを開始しました。</p>
<ol start="2">
<li>Tech Stack (기술 스택 / 技術スタック)</li>
</ol>
<p>Language: Python 3.x (파이썬)</p>
<p>Library: python-telegram-bot (텔레그램 라이브러리)</p>
<p>OS: Mac OS (Apple Silicon)</p>
<ol start="3">
<li>Troubleshooting (트러블슈팅 / 解決した問題)</li>
</ol>
<p>① Syntax Error &amp; Security (문법 오류와 보안 / 構文エラーとセキュリティ)</p>
<p>KR: API 토큰 입력 시 따옴표를 누락하여 문법 오류가 발생했습니다. 또한, 토큰 노출을 인지한 즉시 재발급(Revoke)하여 보안 조치를 취했습니다.</p>
<p>EN: I encountered a syntax error by missing quotes for the API Token. After noticing the token was exposed, I immediately revoked it to ensure security.</p>
<p>JP: APIトークンの引用符漏れによる構文エラーが発生しました。また、トークンの露出に気づき、即座に再発行（Revoke）してセキュリティ対策を講じました。</p>
<p>② Module Not Found (모듈 경로 문제 / ライブラリのパス問題)</p>
<p>KR: Mac 환경에서 파이썬 경로 불일치로 라이브러리를 찾지 못하는 에러가 발생했습니다. python3 -m pip install을 통해 실행 환경에 직접 설치하여 해결했습니다.</p>
<p>EN: A ModuleNotFoundError occurred due to a Python path mismatch on Mac. I solved it by using python3 -m pip install to install the library directly to the active environment.</p>
<p>JP: Mac内のPythonパスの不一致によるモジュールエラーが発生しました。python3 -m pip install を使用して、実行環境に直接ライブラリをインストールし解決しました。</p>
<p>③ Directory Path (실행 경로 오류 / 実行パスの認識エラー)</p>
<p>KR: 터미널의 현재 위치가 파일 위치와 달라 실행되지 않았습니다. 파일을 터미널로 드래그 앤 드롭하여 절대 경로로 실행하는 법을 익혔습니다.</p>
<p>EN: The file didn&#39;t execute because the terminal&#39;s directory was different from the file&#39;s location. I learned to execute it using the absolute path by dragging and dropping the file into the terminal.</p>
<p>JP: 実行ディレクトリの不一致によりファイルが開けませんでした。ターミナルのドラッグ＆ドロップ機能を活用し、絶対パスで実行することで解決しました。</p>
<ol start="4">
<li>Result (실행 결과 / 実行結果)</li>
</ol>
<p>KR: 봇이 &quot;수퍼바이저님!&quot;이라며 첫 응답을 보냈을 때의 희열을 잊을 수 없습니다.</p>
<p>EN: I&#39;ll never forget the thrill when the bot first replied, &quot;Supervisor!&quot;</p>
<p>JP: Botが「スーパーバイザー様！」と初めて返信をくれた時の感動は忘れられません。</p>
<p>Bot Name: Starbucks Inventory Guardian (在庫守護者)
Result: First echo message success! (첫 응답 성공 / 初の応答に成功)</p>
<ol start="5">
<li>Future Plans (향후 계획 / 今後の計画)</li>
</ol>
<p>KR: 다음 주에는 우유, 원두, 시럽 등 품목별 재고 데이터 구조를 설계할 예정입니다.</p>
<p>EN: Next week, I will design the data structure for inventory items like milk, beans, and syrups.</p>
<p>JP: 次週は、ミルクや豆、シロップなどの在庫データの構造設計を行う予定です。</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트] 입문 - Day. 13]]></title>
            <link>https://velog.io/@aiprompt9908-max/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%9E%85%EB%AC%B8-Day.-13</link>
            <guid>https://velog.io/@aiprompt9908-max/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%9E%85%EB%AC%B8-Day.-13</guid>
            <pubDate>Mon, 16 Mar 2026 01:03:02 GMT</pubDate>
            <description><![CDATA[<h1 id="문제-1-컨트롤-제트">문제 1) 컨트롤 제트</h1>
<h2 id="문제">[문제]</h2>
<p>숫자와 &quot;Z&quot;가 공백으로 구분되어 담긴 문자열이 주어집니다. 문자열에 있는 숫자를 차례대로 더하려고 합니다. 이 때 &quot;Z&quot;가 나오면 바로 전에 더했던 숫자를 뺀다는 뜻입니다. 숫자와 &quot;Z&quot;로 이루어진 문자열 <code>s</code>가 주어질 때, 머쓱이가 구한 값을 return 하도록 solution 함수를 완성해보세요.</p>
<h3 id="1-내-정답">1. 내 정답</h3>
<pre><code class="language-python">def solution(s):
    stack = [ ]

    for x in s.split():
        if x == &quot;Z&quot;:
            stack.pop()
        else:
            stack.append(int(x))

    return sum(stack)
</code></pre>
<h3 id="2-풀이">2. 풀이</h3>
<ul>
<li>stack = [ ] : 빈 리스트를 하나 만들어서 Z 앞에 있는 숫자를 뺀 나머지를 저장하기</li>
<li><a href="https://www.notion.so/3249eafa02cb80f3938ffa44d7d8a1f7?pvs=21">for x in s.split ( ) : s.split() 은 문자열을 공백 기준으로 잘라주는 것으로 공백을 기준으로 x에 한 글자씩 대입시키겠다는 뜻</a></li>
<li>if x == “Z” : 만약 x가 Z와 똑같다면</li>
<li><a href="https://www.notion.so/3249eafa02cb806dbb01e8754485836a?pvs=21">stack.pop ( ): 리스트의 맨 마지막 값 하나를 꺼내서 없애는 것으로 즉 Z가 나오면 방금 전에 넣었던 숫자를 취소</a></li>
<li>else: stack.append(int(x)): 그게 아니라면 x를 stack에 추가한다.</li>
</ul>
<hr>
<h1 id="문제-2-배열-원소의-길이">문제 2) 배열 원소의 길이</h1>
<h2 id="문제-1">[문제]</h2>
<p>문자열 배열 <code>strlist</code>가 매개변수로 주어집니다. <code>strlist</code> 각 원소의 길이를 담은 배열을 return하도록 solution 함수를 완성해주세요.</p>
<h3 id="1-내-정답-1">1. 내 정답</h3>
<pre><code class="language-python">def solution(strlist):
    answer = [ ]

    for s in strlist:
        answer.append(len(s))

    return answer</code></pre>
<h3 id="2-풀이-1">2. 풀이</h3>
<ul>
<li>answer = [ ] : 계산한 길이를 넣어줄 빈 리스트 생성</li>
<li>for s in strlist : strlist에 있는 원소들을 하나씩 s에 대입해준다</li>
<li>answer.append(len(s)): s의 길이를 구해서 answer 리스트에 추가해준다.</li>
</ul>
<hr>
<h1 id="문제-3-중복된-문자-제거">문제 3) 중복된 문자 제거</h1>
<h2 id="문제-2">[문제]</h2>
<p>문자열 <code>my_string</code>이 매개변수로 주어집니다. <code>my_string</code>에서 중복된 문자를 제거하고 하나의 문자만 남긴 문자열을 return하도록 solution 함수를 완성해주세요.</p>
<h3 id="1-내-정답-2">1. 내 정답</h3>
<pre><code class="language-python">def solution(my_string):
    answer = &quot;&quot;

    for s in my_string:
        if s not in my_string:
            answer += s 

    return answer</code></pre>
<h3 id="2-풀이-2">2. 풀이</h3>
<ul>
<li>answer = “”: 중복 문자를 뺀 문자들을 넣어줄 빈 리스트 생성</li>
<li>for s in my_string: my_string에 들어있는 문자들을 하나씩 s에 대입시켜준다</li>
<li>if s not in my_string: 만약 s가 my_string에 없다면</li>
<li>answer += s: answer에 추가해라</li>
</ul>
<hr>
<h1 id="문제-4-삼각형의-완성조건">문제 4) 삼각형의 완성조건</h1>
<h2 id="문제-3">[문제]</h2>
<p>선분 세 개로 삼각형을 만들기 위해서는 다음과 같은 조건을 만족해야 합니다.</p>
<p>[가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 합니다.]</p>
<p>삼각형의 세 변의 길이가 담긴 배열 <code>sides</code>이 매개변수로 주어집니다. 세 변으로 삼각형을 만들 수 있다면 1, 만들 수 없다면 2를 return하도록 solution 함수를 완성해주세요.</p>
<h3 id="1-내-정답-3">1. 내 정답</h3>
<pre><code class="language-python">def solution(sides):
    sides.sort()
    if sides[0]+sides[1]&gt;sides[2]
        return 1
  else:
      return 2</code></pre>
<h3 id="2-풀이-3">2. 풀이</h3>
<ul>
<li>sides.sort(): sides를 작은 숫자부터 정렬해준다.</li>
<li>if sides[0]+sides[1]&gt;sides[2]: 인덱스 0+ 인덱스 1의 값이 인덱스 2의 값보다 크면</li>
<li>return 1: 조건 만족으로 1 출력</li>
<li>else return 2: 그게 아니라면 2 출력</li>
</ul>
<hr>
<h2 id="✨-마무리">✨ 마무리</h2>
<p>나는 무언가 글을 쓰거나 정리를 할 떄 구조를 깔끔하고 보기 좋게 일관성을 유지하는 것을 좋아하는데, 처음에는 그게 잡히기가 어려워 많은 고심을 한다. 하지만 하면 할수록 나만의 정리방법과 공부방법을 체득하고, 정립되어가는 과정을 보니 마음이 편안하고 뿌듯하다.</p>
<p>파이썬의 문법을 이해하는 과정 또한 마찬가지이다. 처음에는 어디에 사용 해야할 지 기본 문법조차 외우기 어렵다고 생각이 드는 순간들이 많은데, 많은 문제를 풀어보고 스스로 생각해내어 적용해보며 맞고 틀리는 순간에서 많은걸 배운다. </p>
<p>앞으로 내가 일본취업을 준비하면서도 스스로 완벽하지 못하다고 자책하는 경우가 많이 발생하겠지만, 실패하는 순간 또는 좌절하는 순간에서 오는 가르침을 감사하게 받아들이고 한 단계 더 성장하는 밑거름으로 삼아야겠다.</p>
<p>私は文章を書いたり、何かを整理したりする時、構成をすっきり整えて、見やすく一貫性を持たせることが好きだ。
ただ、最初からその形をうまく作るのは難しく、いつもたくさん悩んでしまう。
それでも続けていくうちに、自分なりの整理の仕方や勉強法が少しずつ身についていき、形になっていく過程を見ると、心が落ち着き、とても満たされた気持ちになる。
Pythonの文法を理解していく過程も、それと同じだ。
最初は、どこでどのように使えばよいのか分からず、基本的な文法さえ覚えるのが難しいと感じることが多い。
しかし、たくさんの問題を解き、自分で考えながら実際に使ってみて、うまくいった時も間違えた時も、その一つひとつの経験から多くのことを学んでいる。
これから日本就職の準備を進めていく中でも、自分がまだ完璧ではないと責めてしまうことが何度もあると思う。
それでも、失敗する瞬間や挫折する瞬間から得られる学びをありがたく受け止め、それを自分がさらに一歩成長するための土台にしていきたい。</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트] 입문 - Day. 12]]></title>
            <link>https://velog.io/@aiprompt9908-max/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%9E%85%EB%AC%B8-Day.-12</link>
            <guid>https://velog.io/@aiprompt9908-max/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%9E%85%EB%AC%B8-Day.-12</guid>
            <pubDate>Sun, 15 Mar 2026 01:14:59 GMT</pubDate>
            <description><![CDATA[<h1 id="문제-1-모음-제거">문제 1) 모음 제거</h1>
<h2 id="문제">[문제]</h2>
<p>영어에선 a, e, i, o, u 다섯 가지 알파벳을 모음으로 분류합니다. 문자열 <code>my_string</code>이 매개변수로 주어질 때 모음을 제거한 문자열을 return하도록 solution 함수를 완성해주세요.</p>
<h3 id="1-내-정답">1. 내 정답</h3>
<pre><code class="language-python">def solution(my_string):
    for vowel in &quot;aeiou&quot;:
        my_string = my_string.replace(vowel, &quot;&quot;)
    return my_string</code></pre>
<h3 id="2-풀이">2. 풀이</h3>
<ul>
<li>for vowel in “aeiou”:  vowel 이라는 상자 안에 aeiou를 넣기</li>
<li>my_string = my_string.replace(vowel, “”): replace(바꿀문자, 새문자)로 문자열 안에서 바꿀문자를 찾아서 새문자로 바꾸기</li>
</ul>
<h2 id="✨-마무리">✨ 마무리</h2>
<p>replace 명령어를 사용하면 되는 간단한 문제였지만 숫자가 아니라 문자를 공백으로 만드는 거라 복잡하게 생각했었다. 수많은 명령어들 중 자주 사용하는 것들은 무조건 내 것으로 만들어야하는데..라는 생각에 마음이 초조해지지만 나만의 페이스를 유지하며 천천히 꾸준히 해나가자!</p>
<p>replaceを使えば解けるシンプルな問題だったのに、数字ではなく文字を空文字にするという点で、少し複雑に考えてしまった。</p>
<p>たくさんある命令文の中でも、よく使うものは必ず自分のものにしなければならないと思うと焦る気持ちもあるけれど、自分のペースを保ちながら、ゆっくりでも着実に続けていこうと思う。</p>
<hr>
<h1 id="문제-2-문자열-정렬하기">문제 2) 문자열 정렬하기</h1>
<h2 id="문제-1">[문제]</h2>
<p>문자열 <code>my_string</code>이 매개변수로 주어질 때, <code>my_string</code> 안에 있는 숫자만 골라 오름차순 정렬한 리스트를 return 하도록 solution 함수를 작성해보세요.</p>
<h3 id="1-내-정답-1">1. 내 정답</h3>
<pre><code class="language-python">def solution(my_string):
    result = [int(ch) for ch in my_string if ch.isdigit()]
    result.sort(reverse = False)
    return result</code></pre>
<h3 id="2-풀이-1">2. 풀이</h3>
<p>result = [int(ch) for ch in my_string if ch.isdigit()]</p>
<ul>
<li>for ch in my_string: my_string에서 글자를 하나씩 꺼내기</li>
<li>if ch.isdigit(): 그 글자가 숫자라면 이라는 뜻으로 확인하는 기능</li>
<li>int(ch): 숫자인지를 확인받은 ch를 int로 바꿔준다</li>
</ul>
<h2 id="✨-마무리-1">✨ 마무리</h2>
<p>isdigit이라는 명령어를 처음 봤다. 역시나 명령어 공부가 필수다! </p>
<p>알면 알수록 할 수 있는 것들이 많다는 생각에 굉장히 흥미롭다.</p>
<p><code>isdigit</code>という命令を初めて見た。やはり命令文の勉強は必須だと感じる。</p>
<p>知れば知るほど、できることがどんどん増えていくと思うと、とても興味深い。</p>
<hr>
<h1 id="문제3-숨어있는-숫자의-덧셈">문제3) 숨어있는 숫자의 덧셈</h1>
<h2 id="문제-2">[문제]</h2>
<p>문자열 <code>my_string</code>이 매개변수로 주어집니다. <code>my_string</code>안의 모든 자연수들의 합을 return하도록 solution 함수를 완성해주세요.</p>
<h3 id="1-내-정답-2">1. 내 정답</h3>
<pre><code class="language-python">def solution(my_string)
    numbers = [int(ch) for ch in my_string if ch.isdigit()]
    return sum(numbers)</code></pre>
<h2 id="✨-마무리-2">✨ 마무리</h2>
<p>2번 문제에서 활용했던 isdigit를 다시 한 번 활용하여 해결하였다.</p>
<p>이렇게 지속해서 사용해봐야 내 머리에 익숙해질 수 있을 것 같다.</p>
<p>문제 많이 많이 풀자!~ </p>
<p>2問目で活用した <code>isdigit</code> を、今回ももう一度使って解決した。</p>
<p>このように繰り返し使ってみることで、やっと自分の頭にも自然に馴染んでいく気がする。</p>
<p>これからも問題をたくさんたくさん解いていこう！</p>
<hr>
<h1 id="문제-4-소인수분해">문제 4) 소인수분해</h1>
<h2 id="문제-3">[문제]</h2>
<p>소인수분해란 어떤 수를 소수들의 곱으로 표현하는 것입니다. 예를 들어 12를 소인수 분해하면 2 * 2 * 3 으로 나타낼 수 있습니다. 따라서 12의 소인수는 2와 3입니다. 자연수 <code>n</code>이 매개변수로 주어질 때 <code>n</code>의 소인수를 오름차순으로 담은 배열을 return하도록 solution 함수를 완성해주세요.</p>
<h3 id="1-내-정답-3">1. 내 정답</h3>
<pre><code class="language-python">def solution(n):
    answer = []
    i = 2

    while i &lt;= n:
        if n % i == 0:
            if i not in answer:
                answer.append(i)
            n //= i 
        else:
            i += 1
        return answer</code></pre>
<h3 id="2-풀이-2">2. 풀이</h3>
<ul>
<li>answer = [ ]: 결과를 담을 빈 리스트를 만드는 것</li>
<li>i = 2: 1이 아닌 2부터 나누어보겠다는 뜻</li>
<li>while i ≤ n : i가 n보다 작거나 같을 동안 계속 반복해라는 뜻</li>
<li>if n % i == 0: n을 i로 나눴을 때 나머지가 0과 같다면</li>
<li>if i not in answer: i가 아직 answer에 없으면</li>
<li>answer.append(i): answer에 i를 넣어라</li>
<li>n//=i: n을 i로 나눈 몫으로 다시 바꿔라</li>
<li>i += 1: 나누어 떨어지지 않으면 i에 1을 더해라</li>
</ul>
<h2 id="✨-마무리-3">✨ 마무리</h2>
<p>소인수분해라는 간단한 것을 코드로 표현하자니 이렇게 길어진다는게 놀랍다.</p>
<p>이 정도보다 더 어려운 문제들이 많다고 생각하니 머리가 아파오지만 화이팅!~~ </p>
<p>素因数分解というシンプルなことでも、コードで表現しようとするとこんなに長くなるのかと驚いた。
これよりもっと難しい問題がたくさんあると思うと頭が痛くなってくるけれど、頑張ろう！~~</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트] 입문 - Day. 11]]></title>
            <link>https://velog.io/@aiprompt9908-max/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%9E%85%EB%AC%B8-Day.-11</link>
            <guid>https://velog.io/@aiprompt9908-max/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%9E%85%EB%AC%B8-Day.-11</guid>
            <pubDate>Sat, 14 Mar 2026 02:36:08 GMT</pubDate>
            <description><![CDATA[<h1 id="문제-1-주사위의-개수">문제 1) 주사위의 개수</h1>
<h2 id="문제">[문제]</h2>
<p>머쓱이는 직육면체 모양의 상자를 하나 가지고 있는데 이 상자에 정육면체 모양의 주사위를 최대한 많이 채우고 싶습니다. 상자의 가로, 세로, 높이가 저장되어있는 배열 <code>box</code>와 주사위 모서리의 길이 정수 <code>n</code>이 매개변수로 주어졌을 때, 상자에 들어갈 수 있는 주사위의 최대 개수를 return 하도록 solution 함수를 완성해주세요.</p>
<h3 id="1-내-정답">1. 내 정답</h3>
<p><code>def solution(box, n):
    answer = 0
    return (box[0]//n)**(box[1]//n)**(box[2]//n)</code></p>
<h3 id="2-풀이">2. 풀이</h3>
<p><code>(box[0]//n)**(box[1]//n)**(box[2]//n)</code></p>
<p>들어갈 수 있는 상자의 개수를 구하는 식의 연산 기호로 // 를 사용했다.</p>
<p>딱 떨어지는 상황이 없을 수 있기 때문에 나눗셈의 몫만을 구하는 // 기호를 사용하였다.</p>
<h2 id="✨-마무리">✨ 마무리</h2>
<p>머릿속에서만 생각하면서 해결하기가 어렵다는 생각에 종이에 써가며 풀이 과정을 알아내고 이것을 코드로 구현해내는 연습을 해보았는데, 이렇게 하는 것이 훨씬 쉽다는 걸 깨달았다.</p>
<p>혼자 공부하다 보니 많이 돌아가고 고군분투 하는 상황이 많은데 이렇게 한 문제 한 문제 풀어나가면 너무 뿌듯하다.</p>
<p>頭の中だけで考えながら解くのは難しいと感じたので、紙に書きながら解く過程を整理し、それをコードとして実装する練習をしてみた。すると、この方法のほうがずっと簡単だということに気づいた。
一人で勉強していると遠回りしたり苦労することも多いが、このように一問一問解いていくととても達成感がある。</p>
<hr>
<h1 id="문제-2-합성수-찾기">문제 2) 합성수 찾기</h1>
<h2 id="문제-1">[문제]</h2>
<p>약수의 개수가 세 개 이상인 수를 합성수라고 합니다. 자연수 n이 매개변수로 주어질 때 n이하의 합성수의 개수를 return하도록 solution 함수를 완성해주세요.</p>
<h3 id="1-내-정답-1">1. 내 정답</h3>
<p><code>def solution(n):
count = 0</code></p>
<p><code>for i in range(4,n+1):
    for x in range (2,i):
        if i % x == 0:
            count += 1
            break
return count</code></p>
<h3 id="2-풀이-1">2. 풀이</h3>
<ul>
<li>count = 0 : 합성수의 개수를 세기 위한 상자를 만듦.</li>
<li>for i in range (4, n+1) : 4이하의 숫자는 전부 소수이기 때문에 4 이상의 숫자부터 검사한다는 뜻 .</li>
<li>for x in range(2,i): 1은 모든 수를 나눌 수 있기 때문이 i 를 2부터 i - 1 까지 하나씩 나눠본다는 뜻.</li>
<li>if i % x == 0 : %를 이용해 나머지가 0인 나눠서 딱 떨어지는 수를 찾음</li>
<li>count += 1 : count 상자의 개수를 1개씩 늘린다는 뜻</li>
<li>break : 반복문 그만!!</li>
</ul>
<h2 id="✨-마무리-1">✨ 마무리</h2>
<p>이번 문제는 해결하는데 뭔가 프로그래밍적으로 생각하는 사고력이 늘었다고 생각했다.</p>
<p>어떻게 코드를 구성해야할지 큰 틀은 아이디어가 잘 떠오르지만 문법적인 세세한 부분은 아직 부족하다고 느꼈다.</p>
<p>이렇게 매일 열심히 풀다 보면 세부적인 부분도 내가 컨트롤할 수 있는 날이 오겠지 아자아자!</p>
<p>今回の問題を解決する中で、プログラミング的に考える思考力が伸びたと感じた。
どのようにコードを構成すればいいのかという大きな枠のアイデアはよく思い浮かぶが、文法的な細かい部分はまだ足りないと感じた。
このように毎日一生懸命解いていけば、細かい部分も自分でコントロールできる日が来るはずだ。よし、やるぞ！ 💪</p>
<hr>
<h1 id="문제-3-최댓값-만들기">문제 3) 최댓값 만들기</h1>
<h2 id="문제-2">[문제]</h2>
<p>정수 배열 <code>numbers</code>가 매개변수로 주어집니다. <code>numbers</code>의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return하도록 solution 함수를 완성해주세요.</p>
<h3 id="1-내-정답-2">1. 내 정답</h3>
<p><code>def solution(numbers):
    numbers.sort(reverse=False)</code></p>
<pre><code>`return numbers[-2]*numbers[-1]`</code></pre><h3 id="2-풀이-2">2. 풀이</h3>
<ul>
<li>numbers.sort(reverse = False): numbers 리스트를 올림차순으로 정렬한다.</li>
<li>return numbers[-2]*numbers [-1]: 뒤에서 첫 번째와 두 번째 수를 곱한다.</li>
</ul>
<h2 id="✨-마무리-2">✨ 마무리</h2>
<p>처음에는 되게 복잡하게 생각했다가 차분히 적어가며 생각해보니 간단하게 해결할 수 있다는 사실을 깨달았다.</p>
<p>뭔가를 너무 복잡하게 하려고 하지말고 최대한 덜어내고 단순하게 만드는 연습을 해야겠다.</p>
<p>最初はとても複雑に考えてしまったが、落ち着いて書きながら考えてみると、簡単に解決できるということに気づいた。
何かを必要以上に複雑にしようとするのではなく、できるだけ無駄を省き、シンプルにする練習をしていきたい。</p>
<hr>
<h1 id="문제-4-팩토리얼">문제 4) 팩토리얼</h1>
<h2 id="문제-3">[문제]</h2>
<p><code>i</code>팩토리얼 (i!)은 1부터 i까지 정수의 곱을 의미합니다. 예를들어 5! = 5 * 4 * 3 * 2 * 1 = 120 입니다. 정수 n이 주어질 때 다음 조건을 만족하는 가장 큰 정수 i를 return 하도록 solution 함수를 완성해주세요.</p>
<h3 id="1-내-정답-3">1. 내 정답</h3>
<p><code>def solution(n):
fact = 1</code></p>
<p>`for i in range(1, 11):
    fact *= i</p>
<pre><code>if fact &gt; n:
    return i - 1
elif fact == n:
    return i`</code></pre><h3 id="2-풀이-3">2. 풀이</h3>
<ol>
<li>fact = 1 : 팩토리얼 값을 저장할 상자</li>
<li>for i in range(1, 11): 10 팩토리얼만 가도 300만이 넘기 때문에 우선 범위를 지정해봐줬다.</li>
<li>fact *= 1 : fact * 1 = fact와 같은 뜻</li>
<li>if fact &gt; n : return i -1 : 팩토리얼 값이 n보다 커졌으면 그 전 숫자가 정답이니까 i - 1 반환</li>
<li>elif fact == n : return i : 팩토리얼 값이 n이랑 딱 맞으면 그 숫자 i가 정답</li>
</ol>
<h2 id="✨-마무리-3">✨ 마무리</h2>
<p>숫자가 커지니까 덜컥 겁이 났다. 팩토리얼의 개념은 알고있지만 이렇게 접근해본게 처음이라 신기한 문제였다.</p>
<p>범위를 지정하지 않고도 풀 수 있는 방법을 연구해보고 이런 문제의 유형을 좀 더 풀어봐야겠다고 생각했다.</p>
<p>数字が大きくなるにつれて少し不安を感じた。階乗の概念は理解していたが、このような形でアプローチしたのは初めてで、とても新鮮で興味深い問題だった。</p>
<p>範囲を指定せずに解く方法についても考え、このタイプの問題をもっと解いてみたいと思った。</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트] 입문 - Day.10]]></title>
            <link>https://velog.io/@aiprompt9908-max/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%9E%85%EB%AC%B8-Day.10</link>
            <guid>https://velog.io/@aiprompt9908-max/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%9E%85%EB%AC%B8-Day.10</guid>
            <pubDate>Mon, 09 Mar 2026 12:33:23 GMT</pubDate>
            <description><![CDATA[<h1 id="문제-1-점의-위치-구하기">문제 1) 점의 위치 구하기</h1>
<h2 id="문제">[문제]</h2>
<p>x 좌표 (x, y)를 차례대로 담은 정수 배열 dot이 매개변수로 주어집니다. 좌표 dot이 사분면 중 어디에 속하는지 1, 2, 3, 4 중 하나를 return 하도록 solution 함수를 완성해주세요.</p>
<h3 id="1-내-정답">1. 내 정답</h3>
<p><code>def solution(dot):
    x,y = dot[0],dot[1]
    if x &gt; 0 and y &gt; 0:
        return 1
    elif x &lt; 0 and y &gt;0:
        return 2
    elif x &lt; 0 and y &lt;0:
        return 3
    else:
        return 4</code></p>
<h2 id="✨-마무리">✨ 마무리</h2>
<p>이제 이 정도 문제는 금방 풀 수 있다! </p>
<p>과연 실력이 늘까 걱정이었는데, 조금은 성장한 것 같아서 기분이 좋아지는 문제였다.</p>
<p>このくらいの問題は、もうすぐに解けるようになった！
本当に実力が伸びるのか少し心配だったけど、少しは成長している気がして、嬉しくなった問題だった。</p>
<hr>
<h1 id="문제-2-2차원으로-만들기">문제 2) 2차원으로 만들기</h1>
<h2 id="문제-1">[문제]</h2>
<p>정수 배열 <code>num_list</code>와 정수 <code>n</code>이 매개변수로 주어집니다. <code>num_list</code>를 다음 설명과 같이 2차원 배열로 바꿔 return하도록 solution 함수를 완성해주세요.</p>
<h3 id="1-내-정답-1">1. 내 정답</h3>
<p><code>def solution(num_list, n):
    answer = []</code></p>
<pre><code>`for i in range(0,len(num_list),n):
    answer.append(num_list[i:i+n])

return answer`</code></pre><h3 id="2-풀이">2. 풀이</h3>
<ul>
<li>range(0, len(num_list), n): 0부터 num_list 길이까지 n씩 증가하면서 반복</li>
<li>num_list[i:i+n]: 리스트 슬라이싱 (리스트 [ 시작 : 끝 ] )</li>
</ul>
<h3 id="3-파이썬-개념-정리---2차원-배열">3. 파이썬 개념 정리 - 2차원 배열</h3>
<p>2차원 배열이라는 말은 그대로 행과 열의 구조를 가진 배열 ⇒ 표나 엑셀 같은 형태의 데이터 구조</p>
<p>파이썬에서는 보통 리스트 안에 리스트를 넣어서 2차원 배열을 만든다.</p>
<ul>
<li>가장 많이 쓰는 패턴</li>
</ul>
<p><code>for row in arr:</code> </p>
<p><code>for num in row:</code></p>
<p><code>print(num)</code></p>
<p>또는</p>
<p><code>for i in range(len(arr)):</code></p>
<p><code>for j in range (len(arr[i])):</code></p>
<p><code>print (arr[i][j])</code></p>
<h2 id="✨-마무리-1">✨ 마무리</h2>
<p>2차원 배열이라는 말이 어렵게 다가와서 당황했지만! </p>
<p>행과 열로 이루어진 표와 같다는 말에 쉽게 이해가 된 것 같다.</p>
<p>最初は「二次元配列」という言葉だけを見ると少し難しく感じて、正直少し戸惑いました。
ですが、「行」と「列」で構成された表のようなものだと理解してからは、イメージが一気に掴みやすくなりました。</p>
<p>実際に考えてみると、エクセルの表やマス目のような構造なので、思っていたよりもシンプルな概念だと感じました。</p>
<hr>
<h1 id="문제-3-공-던지기">문제 3) 공 던지기</h1>
<h2 id="문제-2">[문제]</h2>
<p>머쓱이는 친구들과 동그랗게 서서 공 던지기 게임을 하고 있습니다. 공은 1번부터 던지며 오른쪽으로 한 명을 건너뛰고 그다음 사람에게만 던질 수 있습니다. 친구들의 번호가 들어있는 정수 배열 <code>numbers</code>와 정수 <code>K</code>가 주어질 때, <code>k</code>번째로 공을 던지는 사람의 번호는 무엇인지 return 하도록 solution 함수를 완성해보세요.</p>
<h3 id="1-내-정답-2">1. 내 정답</h3>
<p><code>def solution(numbers, k):
    return numbers[(2 * (k-1))%len(numbers)]</code></p>
<h3 id="2-풀이-1">2. 풀이</h3>
<ul>
<li>(2 * (k-1) : 첫 번쨰 던지는 사람은 numbers[0]으로 정해져 있기 때문에 첫번째 던지는 횟수를 빼주고 2씩 떨어지니까 곱해준다.</li>
<li>% len (numbers) : 나머지 연산자로 numbers 리스트의 길이만큼 나누어 나머지로 값을 구한다.</li>
</ul>
<h2 id="✨-마무리-2">✨ 마무리</h2>
<p>수학적 사고방식이 덜 켜졌는지 어떤 식으로 풀어야할 지는 알았지만 어떻게 표현 해야하는지 감이 안 잡혔다. </p>
<p>수학적 사고방식과 프로그래밍적 사고방식을 키우는데 집중해야겠다.</p>
<p>解き方の方向性自体はなんとなく分かっていたのですが、
それをどのようにコードとして表現すればいいのかがうまく思い浮かびませんでした。</p>
<p>まだ数学的な思考が十分に身についていないと感じたので、
これからは数学的思考とプログラミング的思考の両方を意識して鍛えていきたいと思います。</p>
<hr>
<h1 id="문제-4-배열-회전시키기">문제 4) 배열 회전시키기</h1>
<h2 id="1-내-정답-3">1. 내 정답</h2>
<p><code>def solution(numbers, direction):
    return [numbers[-1]] + numbers[:-1] if direction == &quot;right&quot; else numbers[1:] + [numbers[0]]</code></p>
<h2 id="2-풀이-2">2. 풀이</h2>
<ol>
<li><p>오른쪽 회전</p>
<p> [1,2,3]→[3,1,2]</p>
<ul>
<li><p>마지막 원소를 앞으로</p>
</li>
<li><p>나머지는 뒤에 붙임</p>
<p>⇒ 슬라이싱 활용</p>
<p><code>numbers = [1,2,3,4]</code></p>
<p><code>[number[-1]] + numbers [ :-1]</code></p>
<p><code>[4] + [1,2,3]</code></p>
</li>
<li><p>[number[-1]]: 뒤에서 첫 번째, 같은 타입끼리 이을 수 있기 때문에 리스트를 씌워야한다.</p>
</li>
<li><p>[number[ : -1]: 처음부터 마지막 전까지 잘라서 가져오기</p>
</li>
</ul>
</li>
<li><p>왼쪽 회전 </p>
<p> [1,2,3] → [2,3,1]</p>
<ul>
<li>첫 번째 원소를 뒤로</li>
<li>나머지를 앞에 붙임</li>
</ul>
</li>
</ol>
<p><code>numbers = [1,2,3,4]</code></p>
<p><code>numbers =[ 1 : ] + [numbers [0]]</code></p>
<p><code>[2,3,4] + [1]</code></p>
<h2 id="✨-마무리-3">✨ 마무리</h2>
<p>슬라이싱을 이런 식으로도 활용할 수 있다는 걸 알 수 있는 문제였다.</p>
<p>뭔가 단순하지만 이걸 활용해서 구현할 수 있는 것들이 많을 것 같은 느낌이다.</p>
<p>スライシングはこういう形でも活用できるのだと気づかされた問題でした。
一見とてもシンプルですが、こうした考え方を使えば実装できることが思った以上に多そうだと感じました。</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트]입문 - Day.09]]></title>
            <link>https://velog.io/@aiprompt9908-max/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8%EC%9E%85%EB%AC%B8-Day.09</link>
            <guid>https://velog.io/@aiprompt9908-max/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8%EC%9E%85%EB%AC%B8-Day.09</guid>
            <pubDate>Mon, 02 Mar 2026 14:05:01 GMT</pubDate>
            <description><![CDATA[<h1 id="문제-1-개미-군단">문제 1) 개미 군단</h1>
<h3 id="문제">[문제]</h3>
<p>개미 군단이 사냥을 나가려고 합니다. 개미군단은 사냥감의 체력에 딱 맞는 병력을 데리고 나가려고 합니다. 장군개미는 5의 공격력을, 병정개미는 3의 공격력을 일개미는 1의 공격력을 가지고 있습니다. 예를 들어 체력 23의 여치를 사냥하려고 할 때, 일개미 23마리를 데리고 가도 되지만, 장군개미 네 마리와 병정개미 한 마리를 데리고 간다면 더 적은 병력으로 사냥할 수 있습니다. 사냥감의 체력 hp가 매개변수로 주어질 때, 사냥감의 체력에 딱 맞게 최소한의 병력을 구성하려면 몇 마리의 개미가 필요한지를 return하도록 solution 함수를 완성해주세요.</p>
<h3 id="1-내-정답">1. 내 정답</h3>
<p><code>def solution(hp):
    general = 5
    soilder = 3
    worker = 1
    general_num = hp // general
    soilder_num = (hp % general) // soilder
    worker_num = hp - (general * *general_num) - (soilder ** soilder_num)
    return general_num + soilder_num + worker_num</code></p>
<h2 id="✨-마무리">✨ 마무리</h2>
<p>코드를 작성하고 나서 보니 좀 더 간결하게 할 수 있었겠다는 생각이 든다.</p>
<p>コードを書いた後に見返してみると、もっと簡単に書けたのではないかと思った。</p>
<p>하지만, 프로그래밍적 사고방식이 한 단계 성장했음을 느낄 수 있던 문제였다.</p>
<p>しかし、プログラミング的な思考が一歩成長したと感じられる問題だった。</p>
<hr>
<h1 id="문제-2-모스부호1">문제 2) 모스부호(1)</h1>
<h2 id="문제-1">[문제]</h2>
<p>머쓱이는 친구에게 모스부호를 이용한 편지를 받았습니다. 그냥은 읽을 수 없어 이를 해독하는 프로그램을 만들려고 합니다. 문자열 letter가 매개변수로 주어질 때,</p>
<p>letter를 영어 소문자로 바꾼 문자열을 return 하도록 solution 함수를 완성해보세요.</p>
<p>모스부호는 다음과 같습니다.</p>
<h3 id="1-내-정답-1">1. 내 정답</h3>
<p><code>def solution(letter):
    morse = {
    &#39;.-&#39;:&#39;a&#39;,&#39;-...&#39;:&#39;b&#39;,&#39;-.-.&#39;:&#39;c&#39;,&#39;-..&#39;:&#39;d&#39;,&#39;.&#39;:&#39;e&#39;,&#39;..-.&#39;:&#39;f&#39;,
    &#39;--.&#39;:&#39;g&#39;,&#39;....&#39;:&#39;h&#39;,&#39;..&#39;:&#39;i&#39;,&#39;.---&#39;:&#39;j&#39;,&#39;-.-&#39;:&#39;k&#39;,&#39;.-..&#39;:&#39;l&#39;,
    &#39;--&#39;:&#39;m&#39;,&#39;-.&#39;:&#39;n&#39;,&#39;---&#39;:&#39;o&#39;,&#39;.--.&#39;:&#39;p&#39;,&#39;--.-&#39;:&#39;q&#39;,&#39;.-.&#39;:&#39;r&#39;,
    &#39;...&#39;:&#39;s&#39;,&#39;-&#39;:&#39;t&#39;,&#39;..-&#39;:&#39;u&#39;,&#39;...-&#39;:&#39;v&#39;,&#39;.--&#39;:&#39;w&#39;,&#39;-..-&#39;:&#39;x&#39;,
    &#39;-.--&#39;:&#39;y&#39;,&#39;--..&#39;:&#39;z&#39;
}
    result = &quot;&quot;</code></p>
<pre><code>`for code in letter.split():
    result += morse[code]

return result`</code></pre><h3 id="2-풀이">2. 풀이</h3>
<ul>
<li>result = “” : 변환된 알파벳을 차곡차곡 붙여서 만들 최종 문자열을 준비</li>
<li>for code in letter.split():<ul>
<li>letter.split() : 공백 기준으로 모스부호들을 나눠준다.</li>
<li>for code: code에 순서대로 넣어준다.</li>
</ul>
</li>
<li>result += morse[code]: morse에서 code와 맞는 알파벳을 하나씩 더해서 result에 넣어준다</li>
</ul>
<h2 id="✨-마무리-1">✨ 마무리</h2>
<p>모스 부호에서 살짝 당황, 딕셔너리 양 보고 살짝 당황했지만!!! 그동안 썼던 걸 잘 활용해서 풀어낸 것 같다.</p>
<p>split이라는 새로운 명령어를 알게되었다.</p>
<p>이걸 활용해서 나중에 모스부호 해도기를 내가 직접 만들어볼 수도 있지 않을까?</p>
<p>モールス信号という点で少し戸惑い、辞書の量を見て少し驚いたが、これまで使ってきた方法をうまく活用して解くことができた。</p>
<p>また、今回の問題で <strong>split</strong> という新しいメソッドを知ることができた。</p>
<p>これを活用すれば、将来モールス信号の解読機を自分で作ることもできるのではないかと思った。</p>
<hr>
<h1 id="문제-3-가위바위보">문제 3) 가위바위보</h1>
<h2 id="문제-2">[문제]</h2>
<p>가위는 2 바위는 0 보는 5로 표현합니다. 가위 바위 보를 내는 순서대로 나타낸 문자열 <code>rsp</code>가 매개변수로 주어질 때, rsp에 저장된 가위 바위 보를 모두 이기는 경우를 순서대로 나타낸 문자열을 return하도록 solution 함수를 완성해보세요.</p>
<h3 id="1-내-정답-2">1. 내 정답</h3>
<p><code>def solution(rsp):
    win = {&quot;2&quot;:&quot;0&quot;,&quot;0&quot;:&quot;5&quot;,&quot;5&quot;:&quot;2&quot;}</code></p>
<pre><code>`answer = &quot;&quot;

for i in rsp:
    answer += win[i]

return answer`</code></pre><h2 id="✨-마무리-2">✨ 마무리</h2>
<p>문제 2에서 사용했던 방법을 그대로 가져와서 해결하였다. </p>
<p>이 문법에 익숙해질 수 있는 좋은 기회가 된 것 같다.</p>
<p>이걸 활용해서 게임을 만들어 볼 수도 있겠다는 아이디어가 떠올랐다.</p>
<p>問題２で使った方法をそのまま活用して解決することができた。</p>
<p>この文法に慣れる良い機会になったと思う。
これを活用すれば、ゲームを作ることもできるのではないかというアイデアが浮かんだ。</p>
<hr>
<h1 id="문제-4-구슬을-나누는-경우의-수">문제 4) 구슬을 나누는 경우의 수</h1>
<h2 id="문제-3">[문제]</h2>
<p>머쓱이는 구슬을 친구들에게 나누어주려고 합니다. 구슬은 모두 다르게 생겼습니다. 머쓱이가 갖고 있는 구슬의 개수 <code>balls</code>와 친구들에게 나누어 줄 구슬 개수 <code>share</code>이 매개변수로 주어질 때, <code>balls</code>개의 구슬 중 <code>share</code>개의 구슬을 고르는 가능한 모든 경우의 수를 return 하는 solution 함수를 완성해주세요.</p>
<h3 id="1-내-정답-3">1. 내 정답</h3>
<p><code>import math</code></p>
<p><code>def solution(balls, share):
    return math.comb(balls,share)</code></p>
<h3 id="2-풀이-1">2. 풀이</h3>
<ul>
<li>math.comb : 조합(combination)을 계산해주는 파이썬 내장 함수로 n개 중에서 r개를 고르는 경우의 수를 계산해준다.</li>
</ul>
<h2 id="✨-마무리-3">✨ 마무리</h2>
<p>새로운 내장 함수를 배웠다.</p>
<p>경우의 수를 구하는 식은 알았는데, 이걸 어떻게 코드로 표현할 수 있나 한참 고민했다.</p>
<p>이렇게 내장 함수를 이용하여 간단하게 풀 수 있다는 것도 알게되었고 경우의 수 문제에서 잘 활용할 수 있을 것 같다.</p>
<p>新しい組み込み関数を学ぶことができた。
場合の数を求める式は知っていたが、これをどのようにコードで表現すればいいのかしばらく悩んだ。
このように組み込み関数を使えば簡単に解くことができるということも分かり、場合の数の問題でうまく活用できそうだと思った。</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트]입문 - Day.08]]></title>
            <link>https://velog.io/@aiprompt9908-max/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8%EC%9E%85%EB%AC%B8-Day.08</link>
            <guid>https://velog.io/@aiprompt9908-max/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8%EC%9E%85%EB%AC%B8-Day.08</guid>
            <pubDate>Sat, 28 Feb 2026 15:10:42 GMT</pubDate>
            <description><![CDATA[<h1 id="문제-1--배열-자르기">문제 1 ) 배열 자르기</h1>
<h2 id="문제">[문제]</h2>
<p>정수 배열 <code>numbers</code>와 정수 <code>num1</code>, <code>num2</code>가 매개변수로 주어질 때, <code>numbers</code>의 <code>num1</code>번 째 인덱스부터 <code>num2</code>번째 인덱스까지 자른 정수 배열을 return 하도록 solution 함수를 완성해보세요.</p>
<h3 id="1-나의-정답">1. 나의 정답</h3>
<p><code>def solution(numbers, num1, num2):
    answer = numbers[num1:(num2+1)]
    return answer</code></p>
<p>[slice] </p>
<p>list [ start : stop : step ]</p>
<ul>
<li>start : 시작 인덱스 (포함)</li>
<li>stop : 끝 인덱스 (미포함)</li>
<li>step : 간격 (기본 1)<ol>
<li>일부 자르기 a = [ 1 , 4 ]</li>
<li>처음부터 a = [  : 3 ]</li>
<li>끝까지 a = [ 2 :  ]</li>
<li>전체 복사 a = [  :  ]</li>
<li>2칸씩 a = [  :  : 2 ]</li>
<li>뒤집기 a = [  :  : -1 ]</li>
<li>뒤에서 자르기 a = -2 : ] , a = [  : -1] </li>
</ol>
</li>
</ul>
<h2 id="✨-마무리">✨ 마무리</h2>
<p>슬라이스는 기존에 알고 있던 문법이지만, 더 자세하게 공부할 수 있는 기회가 되어서 좋은 것 같다.</p>
<p>슬라이스의 다양한 활용 방법에 대해서 잊지 않고 잘 활용할 수 있도록 해야겠다.</p>
<p>スライスの文法はもともと知っていましたが、
より詳しく学ぶ良い機会になったと感じます。</p>
<p>今後もスライスのさまざまな活用方法を忘れずに、しっかり使いこなせるようにしていきたいです。</p>
<hr>
<h1 id="문제-2--외계행성의-나이">문제 2 ) 외계행성의 나이</h1>
<h2 id="문제-1">[문제]</h2>
<p>우주여행을 하던 머쓱이는 엔진 고장으로 PROGRAMMERS-962 행성에 불시착하게 됐습니다. 입국심사에서 나이를 말해야 하는데, PROGRAMMERS-962 행성에서는 나이를 알파벳으로 말하고 있습니다. a는 0, b는 1, c는 2, ..., j는 9입니다. 예를 들어 23살은 cd, 51살은 fb로 표현합니다. 나이 <code>age</code>가 매개변수로 주어질 때 PROGRAMMER-962식 나이를 return하도록 solution 함수를 완성해주세요.</p>
<h2 id="1-나의-정답-1">1. 나의 정답</h2>
<p><code>def solution(age):
    table = &quot;abcdefghij&quot;      # 알파벳을 숫자로 변경
    return &#39;&#39;.join(table[int(ch)]for ch in str(age))</code></p>
<p><code>#str(age): string age로 age를 문자로 변환 , 숫자는 하나씩 꺼내오는게 어렵기 때문
#for ch in str(age): age의 문자를 하나씩 꺼내기 ex) &quot;23&quot; 처음 ch = &quot;2&quot;, 다음엔 ch = &quot;3&quot;
#int(ch): ch에 들어있는 문자를 숫자(정수)로 변경
#table[int(ch)]: table에서 int(ch) 꺼내오기
#&#39;&#39;.join(...): 지금까지 나온 글자들을 붙여서 하나의 문자열로 만듦</code></p>
<h2 id="✨-마무리-1">✨ 마무리</h2>
<p>문제를 이해하고 어떤 식으로 풀어내야 하는지는 알겠는데, 코딩식으로 표현을 어떻게 해야하는지가 어려웠다.</p>
<p>問題は理解できて、どう解くかも分かったが、それをプログラムで表現するのが難しかった。</p>
<p>이걸 잘 이해해서, 비슷한 상황에서 잘 활용할 수 있도록 잘 배워놔야겠다.</p>
<p><strong>これをよく理解して、似たような問題でも活用できるようにしっかり学んでおきたい。</strong></p>
<p>뜻</p>
<hr>
<h1 id="문제-3--진료-순서-정하기">문제 3 ) 진료 순서 정하기</h1>
<h2 id="문제-2">[문제]</h2>
<p>외과의사 머쓱이는 응급실에 온 환자의 응급도를 기준으로 진료 순서를 정하려고 합니다. 정수 배열 <code>emergency</code>가 매개변수로 주어질 때 응급도가 높은 순서대로 진료 순서를 정한 배열을 return하도록 solution 함수를 완성해주세요.</p>
<h3 id="1-나의-정답-2">1. 나의 정답</h3>
<p><code>def solution(emergency):
    sorted_e = sorted(emergency, reverse = True)
    return [sorted_e.index(e) + 1 for e in emergency]</code></p>
<h3 id="2-정답-풀이">2. 정답 풀이</h3>
<ol>
<li>sorted_e = sorted(emergency, reverse = True)<ul>
<li>sorted(정렬할 것)<ul>
<li>기본 : 오름차순 (작은 → 큰), 내림차순(reversed = True, 큰 → 작은)</li>
<li>절댓값 기준 정렬 : key = abs, 문자열 길이 기준 정렬: key = len</li>
<li>list.sort(): 리스트를 그 자리에서 정렬</li>
</ul>
</li>
</ul>
</li>
</ol>
<p>⇒ emergency 리스트를 내림차순으로 정렬해서 sorted_e에 대입</p>
<p>b. return [sorted_e.index(e) + 1 for e in emergency]</p>
<ul>
<li>sorted_e.index(e): sorted_e 리스트의 인덱스 번호 찾기<ul>
<li>리스트.index(찾을값): 찾을 값을 리스트 안에서 찾아내어 인덱스 번호를 찾기.</li>
</ul>
</li>
<li>+1: 인덱스는 0부터 시작이니 각 인덱스에 1씩 더해주기</li>
</ul>
<h2 id="✨-마무리-2">✨ 마무리</h2>
<p>기록하는 방식을 조금 바꿔봤다. </p>
<p>記録の仕方を少し変えてみた。</p>
<p>좀 더 내가 생각해 나가는 과정과 왜 이런 코드를 썼는지 한 눈에 확인할 수 있어서 좀 더 용이한 것 같다. </p>
<p>もっと自分の思考過程や、なぜこのコードを書いたのかを一目で確認できるので、より良いと感じた。</p>
<hr>
<h1 id="문제-4-순서쌍의-개수">문제 4) 순서쌍의 개수</h1>
<h2 id="문제-3">[문제]</h2>
<p>순서쌍이란 두 개의 숫자를 순서를 정하여 짝지어 나타낸 쌍으로 (a, b)로 표기합니다. 자연수 <code>n</code>이 매개변수로 주어질 때 두 숫자의 곱이 <code>n</code>인 자연수 순서쌍의 개수를 return하도록 solution 함수를 완성해주세요.</p>
<blockquote>
<p>이는 n의 약수 개수 세기와 같다.</p>
</blockquote>
<h3 id="1-나의-정답-3">1. 나의 정답</h3>
<p><code>def solution(n):
    count = 0
    for a in range(1, n + 1):
        if n % a == 0:
            count += 1
    return count</code></p>
<h3 id="2-정답-풀이-1">2. 정답 풀이</h3>
<ol>
<li>count = 0<ul>
<li>순서쌍의 개수를 세기 위한 카운터, 한 마디로 값을 넣을 빈 통.</li>
</ul>
</li>
<li>for a in range (1, n + 1):<ul>
<li>a를 1부터 n까지 하나씩 바꿔가며 확인</li>
</ul>
</li>
<li>if n % a == 0:<ul>
<li>n을 a로 나눴을 때 나머지가 0인 값을 구하기 = 이는 a가 n의 약수라는 뜻</li>
</ul>
</li>
<li>count += 1<ul>
<li>count 빈통에 더해서 저장한다</li>
</ul>
</li>
</ol>
<h2 id="✨-마무리-3">✨ 마무리</h2>
<p>이 문제가 n의 약수 세기와 같다는 것은 새로운 시각이라 매우 흥미로웠다.</p>
<p>この問題が n の約数を数える問題と同じだという考え方は、とても興味深かった。</p>
<p>그 방법을 알고 나니 내가 아는 부분에서 해결할 수 있었다. </p>
<p>この方法を知ったから、自分が知っているで知識で解くことができた。</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트]입문 - Day.07]]></title>
            <link>https://velog.io/@aiprompt9908-max/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8%EC%9E%85%EB%AC%B8-Day.07</link>
            <guid>https://velog.io/@aiprompt9908-max/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8%EC%9E%85%EB%AC%B8-Day.07</guid>
            <pubDate>Thu, 26 Feb 2026 04:33:15 GMT</pubDate>
            <description><![CDATA[<h1 id="문제-1--특정-문자-제거하기">문제 1 ) 특정 문자 제거하기</h1>
<h2 id="문제">[문제]</h2>
<p>문자열 <code>my_string</code>과 문자 <code>letter</code>이 매개변수로 주어집니다. <code>my_string</code>에서 <code>letter</code>를 제거한 문자열을 return하도록 solution 함수를 완성해주세요.</p>
<h3 id="1-나의-첫-번째-코드">1. 나의 첫 번째 코드</h3>
<p><code>def solution(my_string, letter):
    answer=&quot;&quot;
    answer = my_string.replace(letter,&quot;&quot;)
    return answer</code></p>
<p>✅ 문자열에서 특정 문자를 제거하는 방법</p>
<ol>
<li>replace ( )</li>
</ol>
<ul>
<li>문자열.replace(”제거할 문자”, “ “)</li>
</ul>
<ol>
<li>join + 조건</li>
</ol>
<ul>
<li>‘ ‘.join(c for c in s if c ≠ ‘x’)</li>
<li>특정 조건으로 제거할 때 유용</li>
<li>여러 조건도 가능</li>
</ul>
<h2 id="✨-마무리">✨ 마무리</h2>
<p>문자열에서 특정 문자를 제거하는 문제를 통해</p>
<p>파이썬 문자열은 <strong>직접 수정되는 것이 아니라 새로운 문자열을 반환</strong>한다는 점을 다시 한 번 정리할 수 있었다.</p>
<p>특히 <code>replace()</code>는 가장 직관적이고 자주 쓰이는 방법이며,</p>
<p>조건에 따라 문자를 제거해야 할 때는 <code>join()</code>과 반복을 함께 사용하는 방식이 유용하다는 걸 알게 되었다.</p>
<p>앞으로 문자열 문제를 풀 때는</p>
<p>문자열이 불변 객체라는 점을 항상 염두에 두고</p>
<p>상황에 맞는 방법을 선택해서 해결해보려고 한다.</p>
<h3 id="🇯🇵-日本語まとめ">🇯🇵 日本語まとめ</h3>
<p>文字列は変更できないオブジェクトであり、<code>replace()</code>を使うと新しい文字列が生成されることを学びました。</p>
<hr>
<h1 id="문제-2--각도기">문제 2 ) 각도기</h1>
<h2 id="문제-1">[문제]</h2>
<p>각에서 0도 초과 90도 미만은 예각, 90도는 직각, 90도 초과 180도 미만은 둔각 180도는 평각으로 분류합니다. 각 <code>angle</code>이 매개변수로 주어질 때 예각일 때 1, 직각일 때 2, 둔각일 때 3, 평각일 때 4를 return하도록 solution 함수를 완성해주세요.</p>
<h3 id="1-나의-첫-번째-코드-1">1. 나의 첫 번째 코드</h3>
<p><code>def solution(angle):
    if angle == 180 :
        return 4
    elif 90 &lt; angle &lt; 180 :
        return 3
    elif angle == 90 :
        return 2
    else:
        return 1</code></p>
<h2 id="✨-마무리-1">✨ 마무리</h2>
<p>조건문의 순서는 무작정 정하는 것이 아니라</p>
<p>각 조건이 <strong>서로 포함되는지, 배타적인지</strong>를 먼저 판단해야 한다는 걸 알게 되었다.</p>
<p>앞으로는 조건을 작성하기 전에</p>
<p>“이 조건이 다음 조건을 포함하는가?”를 먼저 생각하고</p>
<p>문제 구조에 맞는 순서를 선택해보려고 한다.</p>
<h3 id="🇯🇵-日本語まとめ-1">🇯🇵 日本語まとめ</h3>
<p>条件分岐を書く前に、条件同士が重なるかどうかを考えることの重要性を学びました。</p>
<hr>
<h1 id="문제-3--양꼬치">문제 3 ) 양꼬치</h1>
<p>머쓱이네 양꼬치 가게는 10인분을 먹으면 음료수 하나를 서비스로 줍니다. 양꼬치는 1인분에 12,000원, 음료수는 2,000원입니다. 정수 <code>n</code>과 <code>k</code>가 매개변수로 주어졌을 때, 양꼬치 <code>n</code>인분과 음료수 <code>k</code>개를 먹었다면 총얼마를 지불해야 하는지 return 하도록 solution 함수를 완성해보세요.</p>
<h2 id="1-나의-첫-번째-코드-2">1. 나의 첫 번째 코드</h2>
<p><code>def solution(n, k):
    lamb = n * 12000
    drink = k
    service = n // 10
    return lamb + (drink - service)*2000</code></p>
<h2 id="✨-마무리-2">✨ 마무리</h2>
<p>처음에 문제를 이해하면서 어떻게 서비스 음료의 개수를 구할 지 생각해내는데 시간이 걸렸다. </p>
<p>最初は、問題を理解しながら、サービスの飲み物の個数をどのように求めるか考えるのに時間がかかりました。</p>
<p><strong><em>수학적인 사고능력</em></strong>을 기르는게 많이 중요하다고 느껴졌다.</p>
<p>数学的な思考力を養うことがとても重要だと感じました。</p>
<hr>
<h1 id="문제-4-짝수의-합">문제 4) 짝수의 합</h1>
<h2 id="문제-2">[문제]</h2>
<p>정수 <code>n</code>이 주어질 때, <code>n</code>이하의 짝수를 모두 더한 값을 return 하도록 solution 함수를 작성해주세요.</p>
<h3 id="1-나의-첫-번째-코드-3">1. 나의 첫 번째 코드</h3>
<p><code>def solution(n):
    even = [ ]
    for i in range (1,n+1):
        if i % 2 == 0:
            even.append(i)
    return sum(even)</code></p>
<h3 id="2-다른-추천-코드">2. 다른 추천 코드</h3>
<p><code>def solution(n):
    total = 0
    for i in range(1, n+1):
        if i % 2 == 0:
            total += i
    return total</code></p>
<ul>
<li>+= 더해서 다시 저장하라</li>
</ul>
<p>ex) a += b → a = a+b</p>
<h2 id="✨-마무리-3">✨ 마무리</h2>
<p>for문, if문, range, 리스트까지 모든 걸 다 혼합해서 쓰느라 순서며 문법이며 조금씩 틀려서 계속해서 손 보며 답을 찾아갔다.</p>
<p>for文やif文、range、リストなどをすべて組み合わせて使う中で、
順序や文法を少しずつ間違えながら、何度も手直しして答えにたどり着きました。</p>
<p>間違えてもあきらめずに修正を重ねることで、正解を見つけることができました。</p>
<p>이제는 어느 상황에서 어떤 문법을 사용해야하는지 조금씩 감이 잡히는 것 같다.</p>
<p>今ではどんな状況でどの文法を使えばよいのかが、少しずつ分かってきた気がします。</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트] 입문 - Day. 06]]></title>
            <link>https://velog.io/@aiprompt9908-max/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%9E%85%EB%AC%B8-Day.-06</link>
            <guid>https://velog.io/@aiprompt9908-max/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%9E%85%EB%AC%B8-Day.-06</guid>
            <pubDate>Thu, 19 Feb 2026 12:43:25 GMT</pubDate>
            <description><![CDATA[<h1 id="문제-1--뒤집힌-문자열">문제 1 ) 뒤집힌 문자열</h1>
<h2 id="문제">[문제]</h2>
<p>문자열 <code>my_string</code>이 매개변수로 주어집니다. <code>my_string</code>을 거꾸로 뒤집은 문자열을 return하도록 solution 함수를 완성해주세요.</p>
<h3 id="1-나의-첫-번째-코드">1. 나의 첫 번째 코드</h3>
<p><code>def solution(my_string):
    return (my_string[ : : -1])</code></p>
<p>⇒ 어제 숫자열에 적용되었던 슬라이싱 기법을 그대로 사용. 문자열에도 적용 가능함을 확인.</p>
<h2 id="✨-마무리">✨ 마무리</h2>
<p>문자열 뒤집기처럼 단순해 보이는 문제에서도</p>
<p>파이썬의 슬라이싱을 알고 있느냐에 따라</p>
<p>코드의 길이와 가독성이 크게 달라진다는 걸 느꼈다.</p>
<p>기본 문법을 정확히 이해하고 있는 것이</p>
<p>코딩테스트에서 얼마나 중요한지 다시 한 번 확인할 수 있었다.</p>
<hr>
<h1 id="문제-2--직각삼각형-출력하기">문제 2 ) 직각삼각형 출력하기</h1>
<h2 id="문제-1">[문제]</h2>
<p>&quot;<strong>&quot;의 높이와 너비를 1이라고 했을 때, “</strong>&quot;을 이용해 직각 이등변 삼각형을 그리려고합니다. 정수 n 이 주어지면 높이와 너비가 n 인 직각 이등변 삼각형을 출력하도록 코드를 작성해보세요.</p>
<h3 id="1-나의-첫-번째-코드-1">1. 나의 첫 번째 코드</h3>
<p><code>n = int(input())</code></p>
<p><code>for i in range ( 1 , n + 1 ):
    print ( &quot;*&quot; * i )</code></p>
<ul>
<li><p>range</p>
<p>  : 정해진 규칙의 숫자 시퀀스(반복용 범위)를 만들어서, 주로 for문에서 “몇 번 반복할지”를 정할 때 쓰는 함수</p>
<ul>
<li><p>range (stop)</p>
<ul>
<li><p>0부터 시작</p>
</li>
<li><p>stop은 미포함</p>
<p>ex ) range (5) ⇒ 0,1,2,3,4</p>
</li>
</ul>
</li>
<li><p>range (start , stop)</p>
<ul>
<li><p>start부터 시작</p>
</li>
<li><p>stop은 미포함</p>
<p>ex) range(2,6) ⇒ 2,3,4,5</p>
</li>
</ul>
</li>
<li><p>range (start, stop, step)</p>
<ul>
<li><p>step만큼 건너뛰며 증가/감소</p>
<p>ex) range( 1, 10, 2) ⇒ 1, 3, 5, 7, 9</p>
</li>
</ul>
</li>
<li><p>음수 step (감소하는 range)</p>
<p>  ex) range(5, 0 , -1) ⇒ 5,4,3,2,1</p>
</li>
</ul>
</li>
</ul>
<h2 id="✨-마무리-1">✨ 마무리</h2>
<p>처음에는 이게 도대체 무슨 문제인지 뭘 요구 하는 문제인지 알아 차리는 데에 시간이 많이 소요 되었다. </p>
<p>반복문 for와 명령어 range를 사용해서 이런 구현도 할 수 있다는 것이 재밌었고,</p>
<p>range의 다양한 사용법에 더 흥미가 생겼다.</p>
<hr>
<h1 id="문제-3-짝수-홀수-개수">문제 3) 짝수 홀수 개수</h1>
<h2 id="문제-2">[문제]</h2>
<p>정수가 담긴 리스트 <code>num_list</code>가 주어질 때, <code>num_list</code>의 원소 중 짝수와 홀수의 개수를 담은 배열을 return 하도록 solution 함수를 완성해보세요.</p>
<h3 id="1-나의-첫-번째-코드-2">1. 나의 첫 번째 코드</h3>
<p><code>def solution(num_list):
    even = len([x for x in num_list if x % 2 == 0])
    odd = len([x for x in num_list if x % 2 == 1])
    return [even,odd]</code></p>
<h2 id="✨-마무리-2">✨ 마무리</h2>
<p>이번 문제를 통해 리스트 문제에서는</p>
<p>리스트 자체가 아니라 <strong>각 원소를 하나씩 처리해야 한다</strong>는 점을 다시 한 번 느꼈다.</p>
<p>짝수와 홀수를 구분하는 것보다</p>
<p>“어떻게 개수를 세는지”가 핵심이었고,</p>
<p>이를 위해 반복문과 조건문을 함께 사용하는 방법을 정리할 수 있었다.</p>
<p>앞으로도 리스트 관련 문제를 풀 때는</p>
<p>항상 원소 단위로 생각하는 습관을 유지하려고 한다.</p>
<hr>
<h1 id="문제-4-문자-반복-출력하기">문제 4) 문자 반복 출력하기</h1>
<h2 id="문제-3">[문제]</h2>
<p>문자열 <code>my_string</code>과 정수 <code>n</code>이 매개변수로 주어질 때, <code>my_string</code>에 들어있는 각 문자를 <code>n</code>만큼 반복한 문자열을 return 하도록 solution 함수를 완성해보세요.</p>
<h3 id="1-나의-첫-번째-코드-3">1. 나의 첫 번째 코드</h3>
<p><code>def solution(my_string, n):
    for i in my_string:
    return i * n</code></p>
<p>⇒ 결과 : hhh </p>
<p>문제 1. return 위치</p>
<ul>
<li>return은 함수가 즉시 종료되어 첫 글자만 반복하고 끝남.</li>
</ul>
<p>문제 2. 문자열을 누적하지 않음</p>
<ul>
<li>각 문자를 반복해서 하나의 문자열로 이어 붙여야 함</li>
</ul>
<p>✅ 정답으로 향하는 사고 방식</p>
<ol>
<li>빈 문자열 준비</li>
<li>문자열을 한 글자씩 순회</li>
<li>각 글자를 N번 반복하여 누적</li>
<li>반복 끝난 후 return</li>
</ol>
<h3 id="2-나의-두-번째-코드">2. 나의 두 번째 코드</h3>
<p><code>def solution(my_string, n):</code></p>
<p><code>result = “”</code></p>
<p><code>for c in my_string</code> </p>
<p><code>result += c * n</code></p>
<p><code>return result</code></p>
<ul>
<li>+= : 기존 값에 더한 뒤, 그 결과를 다시 그 변수에 저장</li>
</ul>
<h2 id="✨-마무리-3">✨ 마무리</h2>
<p>처음에는 <code>+=</code>가 단순히 줄여 쓴 표현이라고만 생각했지만,</p>
<p>직접 예제를 통해 확인해 보니</p>
<p>“기존 값에 더해서 다시 저장한다”는 개념이 명확해졌다.</p>
<p>이제 문자열이나 숫자를 누적해야 하는 문제에서도</p>
<p>왜 <code>+=</code>를 사용하는지 이해하고 적용할 수 있을 것 같다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트] 입문 - Day.05]]></title>
            <link>https://velog.io/@aiprompt9908-max/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%9E%85%EB%AC%B8-Day.05</link>
            <guid>https://velog.io/@aiprompt9908-max/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%9E%85%EB%AC%B8-Day.05</guid>
            <pubDate>Wed, 18 Feb 2026 14:58:57 GMT</pubDate>
            <description><![CDATA[<h1 id="문제-1-👚옷-가게-할인-받기👚">문제 1. 👚옷 가게 할인 받기👚</h1>
<h2 id="문제">[문제]</h2>
<p>머쓱이네 옷가게는 10만 원 이상 사면 5%, 30만 원 이상 사면 10%, 50만 원 이상 사면 20%를 할인해줍니다.</p>
<p>구매한 옷의 가격 {price}가 주어질 때, 지불해야 할 금액을 return 하도록 solution 함수를 완성해보세요.</p>
<h3 id="1-나의-첫-번째-코드">1. 나의 첫 번째 코드</h3>
<p><code>def solution(price):
    if price &gt;= 100000:
        return  price * 0.95
    elif price &gt;= 300000:
        return price * 0.9
    elif 1000000 &gt;= price &gt;= 500000:
        return price * 0.8
    else:
        return &quot;Wrong price&quot;</code></p>
<p>⇒ 결과 : 2번의 테스트 중 1개 오류 발생</p>
<p>*테스트를 통과하더라도 문제 조건과 정확히 일치하지 않거나 불필요한 조건이 많으면 유지보수와 확장에 불리하다.</p>
<p>1)문제점</p>
<ul>
<li>조건문의 순서가 잘못됨<ul>
<li>if/elif는 위에서부터 하나만 실행된다.<ul>
<li>예를 들어 price = 500000이면 첫번째 if 조건에 들어가기 때문에 밑에 조건들은 검사 안하고 결과 return</li>
</ul>
</li>
<li>그래서 30만, 50만 이상이어도 전부 5% 할인만 적용됨</li>
<li>조건문을 작성할 때는 항상 “큰 범위” 먼저</li>
</ul>
</li>
<li>반환 타입이 잘못됨<ul>
<li>프로그래머스 문제는 항상 숫자를 리턴해야 함</li>
</ul>
</li>
</ul>
<h3 id="2-나의-두-번째-코드">2. 나의 두 번째 코드</h3>
<p><code>def solution(price):
    if 299999&gt;= price &gt;= 100000:
        return  price * 0.95
    elif 499999 &gt;= price &gt;= 300000:
        return price * 0.9
    elif 1000000 &gt;= price &gt;= 500000:
        return price * 0.8
    else:
        return 0</code></p>
<p>⇒ 결과: 테스트는 문제 없지만 코드가 깔끔하지 않고, 오류 발생 가능성 있음</p>
<p>1)문제점</p>
<ul>
<li>할인 안되는 경우의 return 값<ul>
<li>할인이 없으면 원래 가격을 그대로 지불 따라서 return price가 되어야 함.</li>
</ul>
</li>
<li>반환 타입이 float이 아닌 int여야 함</li>
</ul>
<h3 id="3-최종-코드">3. 최종 코드</h3>
<p><code>def solution(price):
    if price &gt;= 500000:
        return int(price * 0.8)
    elif price &gt;= 300000:
        return int(price * 0.9)
    elif price &gt;= 100000:
        return int(price * 0.95)
    else:
        return price</code></p>
<h2 id="✨-배운-점">✨ 배운 점</h2>
<ul>
<li>if / elif 조건문은 <strong>위에서부터 하나만 실행 된다</strong></li>
<li>범위 조건이 있을 때는 <strong>큰 값부터 검사</strong></li>
<li>코딩테스트에서는 <strong>return 타입이 매우 중요</strong></li>
<li>문제에 없는 조건은 만들지 않는 것이 좋다.</li>
</ul>
<hr>
<h1 id="문제-2-☕️아이스-아메리카노☕️">문제 2. ☕️아이스 아메리카노☕️</h1>
<h2 id="문제-1">[문제]</h2>
<p>머쓱이는 추운 날에도 아이스 아메리카노만 마십니다. 아이스 아메리카노는 한잔에 5,500원입니다. 머쓱이가 가지고 있는 돈 <code>money</code>가 매개변수로 주어질 때, 머쓱이가 최대로 마실 수 있는 아메리카노의 잔 수와 남는 돈을 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.</p>
<h3 id="1-나의-첫-번째-코드-1">1. 나의 첫 번째 코드</h3>
<p><code>def solution(money):
    cup = money // 5500
    change = money % 5500
    return [cup,change]</code></p>
<h2 id="✨-마무리">✨ 마무리</h2>
<p>이번 문제들을 통해 단순히 정답을 맞히는 것보다</p>
<p><strong>문제를 어떻게 구조화해서 생각해야 하는지</strong>가 더 중요하다는 걸 느꼈다.</p>
<p>같아 보이는 문제라도</p>
<ul>
<li>올림이 필요한 경우인지</li>
<li>최소공배수를 구해야 하는 경우인지</li>
<li>단순한 정수 나눗셈 문제인지</li>
</ul>
<p>를 먼저 구분하지 않으면 쉽게 실수할 수 있었다.</p>
<p>앞으로는 코드를 바로 작성하기보다</p>
<p><strong>수식과 조건을 먼저 정리한 뒤 구현하는 습관</strong>을 들이려고 한다.</p>
<hr>
<h1 id="문제-3-🌪️배열-뒤집기🌪️">문제 3. 🌪️배열 뒤집기🌪️</h1>
<h2 id="문제-2">[문제]</h2>
<p>정수가 들어 있는 배열 <code>num_list</code>가 매개변수로 주어집니다. <code>num_list</code>의 원소의 순서를 거꾸로 뒤집은 배열을 return하도록 solution 함수를 완성해주세요.</p>
<h3 id="1-나의-첫-번째-코드-2">1. 나의 첫 번째 코드</h3>
<p><code>def solution(num_list):
    return list(reversed(num_list))</code></p>
<h3 id="2-다양한-배열-뒤집기-방법">2. 다양한 배열 뒤집기 방법</h3>
<ul>
<li><p>슬라이싱</p>
<p>  <code>arr[ : : -1]</code></p>
</li>
</ul>
<ul>
<li><p>리스트 자체를 뒤집기</p>
<p>  <code>arr. reverse()</code></p>
</li>
</ul>
<ul>
<li><p>reversed( ) 함수</p>
<p>  <code>list(reversed(arr))</code></p>
</li>
</ul>
<h2 id="✨-마무리-1">✨ 마무리</h2>
<p>슬라이싱은 단순히 리스트를 자르는 문법이 아니라</p>
<p>인덱스, 범위, 방향을 한 번에 표현할 수 있는 강력한 도구라는 걸 느꼈다.</p>
<p>특히 <code>start</code>, <code>stop</code>, <code>step</code>의 의미를 정확히 이해하니</p>
<p>배열 뒤집기나 구간 추출 같은 작업을</p>
<p>반복문 없이도 간결하게 처리할 수 있었다.</p>
<p>앞으로는 리스트를 다룰 때</p>
<p>for문부터 떠올리기보다 슬라이싱으로 해결할 수 있는지</p>
<p>먼저 생각해보는 습관을 들여보려고 한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[늦었다고 느낀 순간부터, 개발자를 향해 
(遅いと感じた瞬間から、エンジニアへ)]]></title>
            <link>https://velog.io/@aiprompt9908-max/%EB%8A%A6%EC%97%88%EB%8B%A4%EA%B3%A0-%EB%8A%90%EB%82%80-%EC%88%9C%EA%B0%84%EB%B6%80%ED%84%B0-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%ED%96%A5%ED%95%B4-%E9%81%85%E3%81%84%E3%81%A8%E6%84%9F%E3%81%98%E3%81%9F%E7%9E%AC%E9%96%93%E3%81%8B%E3%82%89%E3%80%81%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%B8</link>
            <guid>https://velog.io/@aiprompt9908-max/%EB%8A%A6%EC%97%88%EB%8B%A4%EA%B3%A0-%EB%8A%90%EB%82%80-%EC%88%9C%EA%B0%84%EB%B6%80%ED%84%B0-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%ED%96%A5%ED%95%B4-%E9%81%85%E3%81%84%E3%81%A8%E6%84%9F%E3%81%98%E3%81%9F%E7%9E%AC%E9%96%93%E3%81%8B%E3%82%89%E3%80%81%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%B8</guid>
            <pubDate>Wed, 11 Feb 2026 19:47:52 GMT</pubDate>
            <description><![CDATA[<p>남들은 무모하다고 느낄 수도 어리석다고 느낄 수도 있는 선택을 하면서,
나의 선택에 대한 후회가 없도록 열심히 살아가고 있는 매일의 순간들.</p>
<p>그 순간들을 기록해두지 않으면 나조차도 기억 속에서 희미해질 것 같아 내가 개발자로 성장하는 과정을 기록으로 남기기로 했다.</p>
<p>이 벨로그는 잘 정리되거나, 정답 같은 문제 풀이보다는 
내가 문제를 풀어가는 방식과 헷갈리는 부분, 새로이 배운 것들을 솔직하게 적어 나가는 공간이 될 예정이다.</p>
<p><strong>지금의 나</strong>
현재는 각종 자격증을 따고 있으며 python으로 코딩테스트 기초부터 다시 다지고 있다. 
프로그래머스 코딩테스트 문제를 통해 아주 기본적인 개념부터 정리해 나가고 있다.</p>
<p>아직은 아주 쉬운 문제조차 오랜 시간을 들여 풀어나가지만,
문제를 정확히 이해하고 요구사항에 맞는 코드를 작성하는 연습이 훗날 더 어렵고 복잡한 문제를 해결할 수 있는 초석이 될 것이라고 생각한다.</p>
<p><strong>앞으로의 계획</strong></p>
<ul>
<li>일본 기업 취업을 목표로 한 준비 과정 기록</li>
<li>python과 코테에서 자주 헷갈리는 개념 정리</li>
<li>프롬프트 제작 및 빅데이터 분석 정리</li>
</ul>
<p>잘 꾸며내고 정답만이 아닌,
나라는 사람이 성장하는 과정을 꾸준히 남기는 기록을 목표로 차근차근 쌓아가려 한다.</p>
<p>[일본어 버전]
周囲から見れば、
無謀だと思われるかもしれない、
あるいは愚かな選択だと感じられるかもしれない道を選びながら、
自分の選択に後悔が残らないよう、毎日を懸命に生きている。
その一つ一つの瞬間を記録として残しておかなければ、
いつか自分自身の記憶の中でも薄れてしまう気がした。
だから私は、エンジニアとして成長していく過程を
記録として残すことに決めた。
このブログは、
きれいに整理された解答や、正解だけをまとめる場所ではない。
問題にどう向き合い、
どこで迷い、
何を新しく理解したのか――
そうした過程を、できるだけ正直に書き残していくための場所にしたいと考えている。</p>
<p>■ 現在の自分
現在は、各種資格試験の学習と並行して、
Pythonを用いてコーディングテストの基礎から改めて取り組んでいる。
プログラマーズ（Programmers）のコーディングテスト問題を通して、
非常に基本的な概念から一つずつ整理している段階だ。
今はまだ、
簡単な問題であっても解くまでに時間がかかることが多い。
それでも、
問題を正確に理解し、要件に沿ったコードを書く練習こそが、
将来より難しく複雑な問題を解決するための
土台になると考えている。</p>
<p>■ 今後の計画
日本企業への就職を目標とした準備過程の記録
Pythonおよびコーディングテストで混乱しやすい概念の整理
プロンプト設計およびビッグデータ分析に関する学習内容の整理
きれいに飾った結果や、正解だけを並べるのではなく、
「自分という人間がどのように成長していくのか」
その過程を、継続して残していくことを目標に、
一歩ずつ積み重ねていきたい。</p>
]]></description>
        </item>
    </channel>
</rss>