<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>newbie_1761.log</title>
        <link>https://velog.io/</link>
        <description>늒네입니다.</description>
        <lastBuildDate>Tue, 06 Oct 2026 01:10:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>newbie_1761.log</title>
            <url>https://velog.velcdn.com/images/newbie_1761/profile/dd54c497-cae3-4260-ba17-79f973503c1f/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. newbie_1761.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/newbie_1761" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[찰떡 번역 봇 (직군별 통역 봇)]]></title>
            <link>https://velog.io/@newbie_1761/%EC%B0%B0%EB%96%A1-%EB%B2%88%EC%97%AD-%EB%B4%87-%EC%A7%81%EA%B5%B0%EB%B3%84-%ED%86%B5%EC%97%AD-%EB%B4%87</link>
            <guid>https://velog.io/@newbie_1761/%EC%B0%B0%EB%96%A1-%EB%B2%88%EC%97%AD-%EB%B4%87-%EC%A7%81%EA%B5%B0%EB%B3%84-%ED%86%B5%EC%97%AD-%EB%B4%87</guid>
            <pubDate>Tue, 06 Oct 2026 01:10:00 GMT</pubDate>
            <description><![CDATA[<h2 id="기획">기획</h2>
<blockquote>
<p><strong>Pain-point, 기회영역</strong></p>
<ul>
<li>기업별로 자주 활용하는 단어나 용어 컨셉이 있을 것이다?</li>
<li>각자만 알고 있는 도메인 지식 - ?</li>
<li>도메인을 지정해서 해보는 것도 좋을 듯</li>
</ul>
</blockquote>
<blockquote>
<p><strong>번역 방향과 상황</strong></p>
<ul>
<li>직군별 전달 사항을 전달 전/후 상황 모두 번역이 되도록 구성</li>
<li>직군, 받은 말, 보낼 말, 붙여넣기, 해석하기 등의 핵심 컴포넌트 구성</li>
<li>Slack, 이메일, 상사 등의 다양한 형식과 상황에 범용적인 부분은 선 제외</li>
<li>메인 기능인 모두가 이해하기 쉽도록 하는 ‘번역’ 기능에 초점</li>
<li>기업의 각 부서에서 이미 전문 용어를 사용하고 있고, 그 전문 용어들을 서로 다른 직군에 맞게 번역 혹은 해석해주는 챗봇</li>
<li>누락 감지 - 협업 마찰의 메인 원인, 모호한 요청에 대상, 범위, 기준 등 누락된 부분을 나타내줌</li>
<li>우리가 설정한 전문적인 지침을 미리 설정해둔 클로드 느낌?</li>
<li>클로드 내의 프로젝트와 다를 바가 없을 것 같기도 하다 - 차별점은 어디로?</li>
<li><strong>가벼움, 입력 0</strong></li>
</ul>
</blockquote>
<blockquote>
<p><strong>도우미의 성격 정하기</strong></p>
<p><strong>전문적이면서도 친근한 통역가:</strong> 각 직군의 전문 용어(도메인 지식)를 정확히 이해하되, 타 부서 직원이 이해하기 쉬운 언어로 부드럽게 풀어서 설명해 주는 성격.<br><br></p>
</blockquote>
<blockquote>
<p><strong>규칙(꼭 지켜야 할 것) 정하기</strong></p>
<ul>
<li>원문의 사실/숫자/일정은 절대 바꾸지 않는다</li>
<li>번역할 때 어투는 부드럽게 하되 내용의 뉘앙스(예: 긴급함, 불만)는 보존한다</li>
<li>모르는 용어가 나오면 추측하지 않고 &quot;확인이 필요해요&quot;라고 표시한다</li>
<li><strong>직군별 맥락 보존:</strong> 번역 과정에서 원래 전하고자 했던 의도나 핵심 비즈니스 로직(목표, 수치 등)이 왜곡되지 않도록 유지할 것.</li>
<li>의미를 임의로 추가하거나 삭제하지 않기<br></li>
</ul>
</blockquote>
<blockquote>
<p><strong>안전선(하지 말아야 할 것) 정하기</strong></p>
<ul>
<li>누구 편도 들지 않는다 (예: 개발자 vs 디자인 갈등 상황에서 판단하지 않음)</li>
<li>인사평가, 징계, 해고 관련 판단이나 조언은 하지 않는다</li>
<li>개인 신상이나 민감정보가 포함된 문장은 번역하지 않고 경고한다</li>
<li>원문에 없는 내용을 지어내지 않는다 (사실 왜곡 방지)</li>
</ul>
<p>&nbsp;</p>
<p><strong>시스템 프롬프트 초안 작성</strong></p>
</blockquote>
<p>🔗 <a href="https://docs.google.com/document/d/1CvoOowXCvqyu4WBDzOmX-rst84wn56XmDTnX6jncdMc/edit">Google Docs 문서</a></p>
<h2 id="1차-프로토타입"><strong>1차 프로토타입</strong></h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/newbie_1761/post/f9671df9-b590-4d2d-b112-a9a6b98304ed/image.png" alt=""></p>
<ul>
<li>맞춤법 검사기 느낌으로 각 단어만 변경해줌</li>
<li>문맥 흐름이 맞지 않음</li>
</ul>
</blockquote>
<p>▾ <strong>프롬프트 초안</strong></p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/newbie_1761/post/37503493-4748-4563-ba98-b5810b3d6db0/image.png" alt=""></p>
</blockquote>
<p>📎 TOMATO_발표자료.pptx (Notion 원본에만 있는 첨부 파일)</p>
<p>Feedbacks</p>
<ul>
<li>문제 정의 더 짜임새 있게</li>
<li>포폴 자산으로 정리</li>
<li>개선 해보길</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[🛡️ 멈추고, 가리고, 확인하기]]></title>
            <link>https://velog.io/@newbie_1761/8%EC%9B%94-10%EC%9D%BC</link>
            <guid>https://velog.io/@newbie_1761/8%EC%9B%94-10%EC%9D%BC</guid>
            <pubDate>Tue, 29 Sep 2026 01:07:03 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>🛡️ <strong>한 줄 요약</strong> — 만들 줄 알게 됐으니, 이제 <em>안전하게</em>. 오늘 배운 건 결국 세 개예요: <strong>멈추고 · 가리고 · 확인하기</strong>.
어제 워크플로우에서 짚은 &#39;사람이 지켜야 할 자리&#39;를, 오늘은 <strong>데이터</strong>와 <strong>검증</strong>으로 구체화했습니다.</p>
</blockquote>
<hr>
<h2 id="🎯-오늘-하루가-끝나면">🎯 오늘 하루가 끝나면</h2>
<table>
<thead>
<tr>
<th>#</th>
<th>목표</th>
<th>의미</th>
</tr>
</thead>
<tbody><tr>
<td>01</td>
<td><strong>데이터 흐름을 안다</strong></td>
<td>내가 넣은 게 어디로 가는지 감을 잡는다</td>
</tr>
<tr>
<td>02</td>
<td><strong>올릴 것을 가린다</strong></td>
<td>개인정보, 기밀을 알아보고 가려서 쓴다</td>
</tr>
<tr>
<td>03</td>
<td><strong>답을 검증한다</strong></td>
<td>AI 답을 곧이곧대로 믿지 않고 확인한다</td>
</tr>
<tr>
<td>04</td>
<td><strong>안전 습관</strong></td>
<td>멈추고, 가리고, 확인하는 습관을 몸에 붙인다</td>
</tr>
</tbody></table>
<h2 id="⚠️-왜-지금-중요할까--여기서-사고가-나요">⚠️ 왜 지금 중요할까 — 여기서 사고가 나요</h2>
<p>AI를 재미로만 쓸 땐 몰라요. 그런데 이제 실제 업무 데이터를 넣고, 나온 결과를 보고서에 쓰기 시작했잖아요. 딱 여기서 사고가 납니다.</p>
<blockquote>
<p>💧 <strong>데이터 유출</strong>
넣지 말아야 할 걸 넣어서, 회사 기밀 · 고객 정보가 새는 것</p>
</blockquote>
<blockquote>
<p>🌫️ <strong>환각(Hallucination)</strong>
믿지 말아야 할 걸 믿어서, 지어낸 숫자가 보고서에 들어가는 것</p>
</blockquote>
<blockquote>
<p><span style="color: #787774">오늘은 이 두 가지를 막는 눈을 기릅니다. <strong>안 넣을 것</strong>과 <strong>안 믿을 것</strong>.</span></p>
</blockquote>
<h2 id="🧭-오늘의-흐름--알고-가리고-확인한다">🧭 오늘의 흐름 — 알고, 가리고, 확인한다</h2>
<table>
<thead>
<tr>
<th>PART</th>
<th>주제</th>
<th>핵심 질문</th>
</tr>
</thead>
<tbody><tr>
<td><strong>PART 1</strong></td>
<td>데이터 이해</td>
<td>내 입력이 어디로 가나</td>
</tr>
<tr>
<td><strong>PART 2</strong></td>
<td>입력 위험</td>
<td>뭘 올려도 되나</td>
</tr>
<tr>
<td><strong>PART 3</strong></td>
<td>환각 검증</td>
<td>답을 어떻게 믿나</td>
</tr>
</tbody></table>
<hr>
<h1 id="part-1-·-데이터-이해--내-입력이-어디로-가나">PART 1 · 데이터 이해 — 내 입력이 어디로 가나</h1>
<h2 id="ai에-넣은-건-어디로-갈까">AI에 넣은 건 어디로 갈까</h2>
<p>AI에 넣은 내용은 <strong>그 자리에서 처리되고 끝나는 게 아니에요.</strong> 대화로 남고, 서비스에 따라 성능 개선에 쓰이기도 해요. 무료 · 유료 · 기업용에 따라 정책도 다르고요.</p>
<table>
<thead>
<tr>
<th>사실</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><strong>대화는 남는다</strong></td>
<td>내가 넣은 내용이 기록으로 남을 수 있어요</td>
</tr>
<tr>
<td><strong>학습에 쓰일 수도</strong></td>
<td>일부 서비스는 입력을 성능 개선에 활용해요</td>
</tr>
<tr>
<td><strong>설정으로 끌 수도</strong></td>
<td>학습 사용을 끄거나 기록을 지우는 옵션도 있어요</td>
</tr>
</tbody></table>
<blockquote>
<p><span style="color: #787774">정책은 서비스마다 다르고 자주 바뀌어요. 중요한 건 <strong>&quot;내 입력이 밖에 남을 수 있다&quot;는 감각</strong>이에요.</span></p>
</blockquote>
<h2 id="무료-·-유료-·-기업용-취급이-달라요">무료 · 유료 · 기업용, 취급이 달라요</h2>
<p>같은 AI라도 <strong>어떤 요금제로 쓰느냐</strong>에 따라 내 입력을 어떻게 다루는지가 달라져요. 대략 이런 경향이 있습니다.</p>
<table>
<thead>
<tr>
<th>요금제</th>
<th>경향</th>
</tr>
</thead>
<tbody><tr>
<td><strong>무료</strong></td>
<td>입력이 성능 개선(학습)에 쓰일 가능성이 상대적으로 높음 → <strong>민감한 건 피하기</strong></td>
</tr>
<tr>
<td><strong>유료(개인)</strong></td>
<td>학습 사용을 끄는 옵션이 있는 경우가 많음 → <strong>설정을 한 번 확인</strong></td>
</tr>
<tr>
<td><strong>기업용 · 팀</strong></td>
<td>계약상 학습에 안 쓰이고 보안 · 관리가 강화된 경우가 많음</td>
</tr>
</tbody></table>
<blockquote>
<p><span style="color: #787774">정확한 건 서비스 정책을 직접 확인해야 해요. 핵심은 <strong>&#39;요금제에 따라 다르다&#39;는 걸 아는 것</strong>.</span></p>
</blockquote>
<h2 id="사고는-대개-이렇게-나요">사고는 대개 이렇게 나요</h2>
<p>거창한 해킹이 아니에요. 대부분 <strong>&#39;편하려고 그냥 붙여넣다가&#39;</strong> 샙니다.</p>
<table>
<thead>
<tr>
<th>흔한 행동</th>
<th>새는 것</th>
</tr>
</thead>
<tbody><tr>
<td>❗ <strong>회의록을 통째로 붙여넣기</strong></td>
<td>참석자 실명 · 내부 논의가 그대로 밖으로</td>
</tr>
<tr>
<td>❗ <strong>고객 문의 원본 붙여넣기</strong></td>
<td>이름 · 연락처가 담긴 채로 분석 요청</td>
</tr>
<tr>
<td>❗ <strong>내부 코드 · 문서 붙여넣기</strong></td>
<td>소스 · 기밀이 담긴 채로 검토 요청</td>
</tr>
</tbody></table>
<blockquote>
<p><span style="color: #787774">실제로 여러 회사가 이런 일로 사내 챗봇 사용을 제한하기도 했어요. <strong>편함과 안전을 맞바꾸지 않기.</strong></span></p>
</blockquote>
<h2 id="🖐️-첫-번째-습관--올리기-전에-한-번-멈추기">🖐️ 첫 번째 습관 — 올리기 전에, 한 번 멈추기</h2>
<p>복잡한 규정을 다 외울 필요 없어요. 무언가 올리기 전에 딱 한 번 멈추고 스스로에게 물어보는 거예요.</p>
<blockquote>
<p>❓ <strong>&quot;이 내용, 밖에 나가도 괜찮은 걸까?&quot;</strong></p>
</blockquote>
<blockquote>
<p><span style="color: #787774">이 질문에 &#39;어… 좀 걸리는데&#39; 싶으면, 그게 신호예요. → 다음 파트에서 <strong>뭘 걸러야 하는지</strong> 봅니다.</span></p>
</blockquote>
<hr>
<h1 id="part-2-·-입력-위험--뭘-올려도-되나">PART 2 · 입력 위험 — 뭘 올려도 되나</h1>
<h2 id="올려도-되는-것-안-되는-것">올려도 되는 것, 안 되는 것</h2>
<blockquote>
<p>⭕ <strong>올려도 괜찮아요</strong></p>
<ul>
<li>공개된 정보 · 뉴스</li>
<li>내가 쓴 초안 · 메모</li>
<li>가상의 예시 · 시나리오</li>
<li>익명화한 데이터</li>
</ul>
</blockquote>
<blockquote>
<p>❌ <strong>올리면 안 돼요</strong></p>
<ul>
<li>고객 · 직원 개인정보</li>
<li>계약서 · 내부 기밀</li>
<li>비밀번호 · 인증정보</li>
<li>아직 공개 안 한 정보</li>
</ul>
</blockquote>
<blockquote>
<p><span style="color: #787774">헷갈리면 보수적으로. <strong>&#39;세면 곤란한 것&#39;은 일단 넣지 않는 게 안전해요.</strong></span></p>
</blockquote>
<h2 id="🚩-이게-보이면-멈추세요-red-flags-5">🚩 이게 보이면, 멈추세요 (Red Flags 5)</h2>
<table>
<thead>
<tr>
<th>신호</th>
<th>왜 위험한가</th>
</tr>
</thead>
<tbody><tr>
<td>❗ <strong>실명 · 연락처 · 주민번호</strong></td>
<td>사람을 특정할 수 있는 정보</td>
</tr>
<tr>
<td>❗ <strong>고객 · 직원 데이터</strong></td>
<td>명단 · 구매내역 · 평가 등</td>
</tr>
<tr>
<td>❗ <strong>계약서 · 내부 문서</strong></td>
<td>회사 밖에 못 나가는 자료</td>
</tr>
<tr>
<td>❗ <strong>비밀번호 · API 키</strong></td>
<td>인증 · 접근 정보는 절대</td>
</tr>
<tr>
<td>❗ <strong>아직 공개 안 한 정보</strong></td>
<td>신제품 · 실적 · 인사 등</td>
</tr>
</tbody></table>
<blockquote>
<p><span style="color: #787774">이 다섯 중 하나라도 보이면, 그대로 올리지 말고 <strong>다음 장처럼 가려서</strong> 씁니다.</span></p>
</blockquote>
<h2 id="🎭-안-되면-가려서-올려요">🎭 안 되면, 가려서 올려요</h2>
<p>민감한 게 섞여 있다고 포기할 필요는 없어요. <strong>가리고 바꿔서</strong> 안전하게 쓰면 됩니다.</p>
<blockquote>
<p>🅰️ <strong>익명화</strong>
이름을 A · B · 고객1 로 바꾸기</p>
</blockquote>
<blockquote>
<p>📝 <strong>요약만</strong>
원문 대신 핵심만 넣기</p>
</blockquote>
<blockquote>
<p>🔒 <strong>마스킹</strong>
번호 · 계좌 일부를 가리기 (010-****)</p>
</blockquote>
<blockquote>
<p>🎲 <strong>가상 데이터</strong>
실제 대신 비슷한 가짜로 바꿔 넣기</p>
</blockquote>
<blockquote>
<p>💡 <strong>팁</strong> — <em>&#39;이 결과를 내가 만들 수만 있으면 되지, 원본을 다 줄 필요는 없다&#39;</em> 고 생각하면 쉬워요.</p>
</blockquote>
<h2 id="👔-내-직무에서-특히-조심할-것">👔 내 직무에서 특히 조심할 것</h2>
<p>내 손에 자주 오는 데이터일수록 무뎌지기 쉬워요.</p>
<table>
<thead>
<tr>
<th>직무</th>
<th>특히 조심할 것</th>
</tr>
</thead>
<tbody><tr>
<td><strong>HR</strong></td>
<td>직원 · 지원자 개인정보, 평가 · 연봉</td>
</tr>
<tr>
<td><strong>PO</strong></td>
<td>미공개 지표 · 로드맵, 고객 데이터</td>
</tr>
<tr>
<td><strong>디자인</strong></td>
<td>미공개 시안, 클라이언트 자료 · 저작권</td>
</tr>
<tr>
<td><strong>개발</strong></td>
<td>소스코드, API 키 · 서버 정보</td>
</tr>
</tbody></table>
<blockquote>
<p><span style="color: #787774">내 직무의 <strong>&#39;민감 목록&#39;을 한 번 떠올려두면</strong>, 올릴 때 자동으로 걸러져요.</span></p>
</blockquote>
<h2 id="🔁-위험한-프롬프트-이렇게-바꿔요">🔁 위험한 프롬프트, 이렇게 바꿔요</h2>
<blockquote>
<p>🚫 <strong>BEFORE · 그대로 붙여넣기</strong>
&quot;이 고객 문의 목록 요약해줘&quot; + 김OO 010-1234-… <strong>원본 붙여넣기</strong>
→ <span style="color: #d44c47">개인정보가 그대로 밖으로 나가요.</span></p>
</blockquote>
<blockquote>
<p>✅ <strong>AFTER · 가려서 올리기</strong>
이름은 A · B로, 번호는 지우고 : &quot;아래 <strong>익명화된</strong> 문의를 유형별로 요약해줘&quot;
→ <strong>같은 결과, 정보는 안전.</strong></p>
</blockquote>
<blockquote>
<p><span style="color: #787774">결과물은 똑같이 얻어요. <strong>원본을 다 줄 필요가 없다</strong>는 게 핵심이에요.</span></p>
</blockquote>
<hr>
<h1 id="part-3-·-환각-검증--답을-어떻게-믿나">PART 3 · 환각 검증 — 답을 어떻게 믿나</h1>
<h2 id="ai는-자신-있게-틀려요">AI는 자신 있게 틀려요</h2>
<p>Day 1에서 봤죠. AI는 &#39;다음에 올 그럴듯한 말&#39;을 이어붙이는 예측기. 그래서 모르는 것도 멈추지 않고, 그럴듯하게 지어냅니다.</p>
<blockquote>
<p>🔑 <strong>핵심</strong> — AI가 자신 있게 말한다고 해서 맞는 건 아니에요. <strong>오히려 가장 그럴듯할 때가 제일 위험합니다.</strong></p>
</blockquote>
<blockquote>
<p><span style="color: #787774">&#39;틀릴 수 있다&#39;가 아니라 <strong>&#39;틀릴 수 있다고 전제하고 확인한다&#39;</strong>로 습관을 바꾸는 게 오늘 목표예요.</span></p>
</blockquote>
<h2 id="🔍-여기선-무조건-의심하세요-5곳">🔍 여기선 무조건 의심하세요 (5곳)</h2>
<table>
<thead>
<tr>
<th>영역</th>
<th>어떻게 틀리나</th>
</tr>
</thead>
<tbody><tr>
<td><strong>숫자 · 통계</strong></td>
<td>그럴듯한 수치를 잘 지어내요</td>
</tr>
<tr>
<td><strong>인용 · 출처</strong></td>
<td>없는 논문 · 기사를 만들기도</td>
</tr>
<tr>
<td><strong>법 · 규정</strong></td>
<td>조항을 헷갈리거나 지어냄</td>
</tr>
<tr>
<td><strong>최신 정보</strong></td>
<td>모르는 최근 일도 아는 척</td>
</tr>
<tr>
<td><strong>고유명사</strong></td>
<td>사람 · 제품 이름을 섞어버림</td>
</tr>
</tbody></table>
<blockquote>
<p><span style="color: #787774">이 다섯 곳에서 나온 건, <strong>쓰기 전에 반드시 사람이 한 번 확인</strong>합니다.</span></p>
</blockquote>
<h2 id="그럴듯하게-이렇게-지어내요">그럴듯하게, 이렇게 지어내요</h2>
<p>환각은 대놓고 이상하지 않아요. 오히려 <strong>&#39;있어 보이는&#39; 게 함정</strong>입니다.</p>
<table>
<thead>
<tr>
<th>유형</th>
<th>실제 모습</th>
</tr>
</thead>
<tbody><tr>
<td><strong>통계 · 수치</strong></td>
<td>&quot;직장인의 73%가…&quot; 그럴듯한 숫자인데 <strong>출처가 없음</strong></td>
</tr>
<tr>
<td><strong>출처 · 인용</strong></td>
<td>존재하지 않는 논문 · 기사 제목을 진짜처럼</td>
</tr>
<tr>
<td><strong>인물 · 제품</strong></td>
<td>비슷한 이름들을 섞어 사실처럼 말함</td>
</tr>
</tbody></table>
<blockquote>
<p><span style="color: #787774">공통점은 다 <strong>&#39;자신 있게&#39;</strong> 말한다는 거예요. 자신 있을수록 더 의심하세요.</span></p>
</blockquote>
<h2 id="✔️-답을-어떻게-확인할까-4단계">✔️ 답을 어떻게 확인할까 (4단계)</h2>
<table>
<thead>
<tr>
<th>#</th>
<th>방법</th>
<th>이렇게</th>
</tr>
</thead>
<tbody><tr>
<td>01</td>
<td><strong>근거를 물어본다</strong></td>
<td>&quot;이 답의 근거와 출처를 알려줘&quot;</td>
</tr>
<tr>
<td>02</td>
<td><strong>원문과 대조한다</strong></td>
<td>자료를 줬으면 거기서만 나왔는지 확인</td>
</tr>
<tr>
<td>03</td>
<td><strong>교차 확인한다</strong></td>
<td>다른 데서(검색 · 자료) 한 번 더 확인</td>
</tr>
<tr>
<td>04</td>
<td><strong>스스로 검토시킨다</strong></td>
<td>&quot;틀릴 수 있는 부분을 스스로 짚어줘&quot;</td>
</tr>
</tbody></table>
<blockquote>
<p><span style="color: #787774">중요한 결과일수록 <strong>사람이 마지막 확인</strong>. 이게 어제 말한 &#39;사람 자리&#39;예요.</span></p>
</blockquote>
<h2 id="🧰-바로-쓰는-검증-프롬프트">🧰 바로 쓰는 검증 프롬프트</h2>
<p>하나 골라 저장소에 넣어두고 계속 쓰세요. <strong>이 네 문장이면 환각을 크게 줄여요.</strong></p>
<pre><code class="language-javascript">· 답의 근거와 출처를 함께 표시해줘.
· 확실하지 않으면 &#39;모른다&#39;고 말해줘.
· 이 자료 안에서만 답하고, 없는 건 지어내지 마.
· 방금 답에서 틀릴 수 있는 부분을 스스로 짚어줘.</code></pre>
<h2 id="🔁-물어보는-법만-바꿔도">🔁 물어보는 법만 바꿔도</h2>
<blockquote>
<p>🚫 <strong>BEFORE · 그냥 물어보기</strong>
&quot;이 주제 통계 좀 알려줘.&quot;
→ 출처 없는 숫자가 줄줄. 맞는지 알 수가 없어요.</p>
</blockquote>
<blockquote>
<p>✅ <strong>AFTER · 근거를 요구하기</strong>
&quot;통계를 알려주되 각 수치의 <strong>출처를 함께</strong>, 확실치 않으면 <strong>모른다고 해</strong>.&quot;
→ 근거 있는 것만, 모르는 건 모른다고 나와요.</p>
</blockquote>
<blockquote>
<p><span style="color: #787774">검증은 대단한 게 아니에요. <strong>프롬프트에 한 줄 더하는 것</strong>부터 시작해요.</span></p>
</blockquote>
<hr>
<h1 id="🧪-실습">🧪 실습</h1>
<h2 id="실습-1-·-입력-판단-ox-part-2">실습 1 · 입력 판단 O/X (PART 2)</h2>
<blockquote>
<p>📌 <em>이 슬라이드는 스크린샷에 빠져 있어, 강의 흐름(“입력 판단 O/X와 환각 잡기, 두 실습이 중간에 들어가요”)에 맞춰 재구성했습니다.</em></p>
</blockquote>
<p>주어진 사례를 보고 <strong>올려도 되는지(O) / 안 되는지(X)</strong>, X면 <strong>어떻게 가려서 올릴지</strong>까지 답하기.</p>
<table>
<thead>
<tr>
<th>사례</th>
<th>판단</th>
<th>가리는 법</th>
</tr>
</thead>
<tbody><tr>
<td>공개된 뉴스 기사 요약 요청</td>
<td>⭕</td>
<td>그대로 가능</td>
</tr>
<tr>
<td>고객 문의 원본(이름 · 번호 포함)</td>
<td>❌</td>
<td>익명화 + 마스킹 후 요약 요청</td>
</tr>
<tr>
<td>회의록 전문</td>
<td>❌</td>
<td>참석자는 A · B로, 핵심만 요약해서 입력</td>
</tr>
<tr>
<td>내가 쓴 기획 초안</td>
<td>⭕</td>
<td>단, 미공개 지표는 가상 수치로 치환</td>
</tr>
<tr>
<td>서버 접속용 API 키가 든 코드</td>
<td>❌</td>
<td>키는 제거 · 더미로 치환 후 로직만 검토 요청</td>
</tr>
</tbody></table>
<h2 id="실습-2-·-환각-잡기--의심하고-확인하기">실습 2 · 환각 잡기 — 의심하고 확인하기</h2>
<p>AI에게 <strong>사실이 섞인 질문</strong>을 하나 던지고, 나온 답에서 의심 포인트를 찾아 실제로 검증해보세요.</p>
<table>
<thead>
<tr>
<th>#</th>
<th>단계</th>
<th>내용</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td><strong>질문 던지기</strong></td>
<td>숫자 · 출처가 나올 만한 질문 (예: 통계, 사례)</td>
</tr>
<tr>
<td>2</td>
<td><strong>의심 3곳 표시</strong></td>
<td>숫자 · 인용 · 고유명사에 밑줄</td>
</tr>
<tr>
<td>3</td>
<td><strong>검증 프롬프트</strong></td>
<td>&#39;근거 · 출처 표시&#39;, &#39;모르면 모른다고&#39; 적용</td>
</tr>
<tr>
<td>4</td>
<td><strong>교차 확인</strong></td>
<td>한 곳은 검색이나 자료로 직접 확인</td>
</tr>
</tbody></table>
<blockquote>
<p>🏁 <strong>성공 기준</strong> — AI가 틀리거나 애매하게 말한 곳을 <strong>한 군데라도 잡아냈다.</strong></p>
</blockquote>
<h3 id="내가-써본-질문-예시">내가 써본 질문 예시</h3>
<ul>
<li>최근에 친구한테 ~~로 맞았는데, 이거 어떻게 고소해야 해? <em>(법 · 규정 → 조항을 지어내기 쉬운 영역)</em></li>
<li>최근에 기온이 많이 높아져서 지구 온난화가 심해진 것 같은데, <strong>통계 수치</strong>를 알려줘 <em>(숫자 · 출처 → 그럴듯한 수치를 지어내기 쉬운 영역)</em></li>
</ul>
<h3 id="🗞️-뉴스-정보-검증-프롬프트-span-stylecolor-9f6b53실습에서-만든-것span">🗞️ 뉴스 정보 검증 프롬프트 <span style="color: #9f6b53">(실습에서 만든 것)</span></h3>
<pre><code class="language-javascript">[입력]
~~~~

[역할]
너는 헤드라인을 작성하는 기자야.
여러 가지 정보 중에 확실시 된 정보만 사용해야 하는 의무가 있어.

[맥락]
[입력] 항목에 올려주는 정보를 한 줄씩 읽어나가면서 확인하는 과정을 거치고 있어.
문구는 구어체로 사용해도 되고, 경어로 사용해도 돼.

[출력]
1. 각 리스트마다 대상, 연도, 수치(비용이나 ~% 등), 기관명, 인용, 연구자를 매칭하고 탐색해서
   확인 / 의심 / 가짜 3종류의 판정 남기기
2. 판정의 근거를 1줄 남기고, 근거를 세운 이유와 URL을 남기기
3. URL이 있는 경우는 해당 URL에 접속해보고 홈페이지에서 해당되는 내용을 찾아 추가 검증
4. 홈페이지에서 내용을 찾은 경우 해당 문구가 있는 페이지의 URL 링크까지 넣어 확실한 물증 확보
5. 내용과 URL이 있지만 URL 접근이 불가능하거나 접속이 안 되는 경우는 &#39;의심&#39;으로 판정
6. 내용이 확인이 안 되거나, 일치하지 않은 대상이나 기관, 수치가 다를 경우는 &#39;가짜&#39;로 판정
7. 의심으로 판정된 자료는 판정 결과를 &quot;미확인&quot;으로 바꾸고, 가짜로 판정된 자료는 삭제

[제약 사항]
1. 딱 떨어지는 숫자와 처음 보는 이름, 책부터 의심.
2. 체크리스트 : 숫자, 인용, 저자, 기관, 날짜에 체크. 확인해야 할 것 15개를 다 표시.
3. 없는 사실을 창조하거나 작성하지 말기</code></pre>
<blockquote>
<p>💡 이 프롬프트는 위 <strong>&#39;답을 어떻게 확인할까 4단계&#39;를 한 덩어리로 자동화</strong>한 형태예요. 근거 요구(01) → 원문 대조(02) → 교차 확인(03) → 판정 및 자가 검토(04).</p>
</blockquote>
<hr>
<h1 id="🎒-오늘-외울-건-딱-세-개">🎒 오늘 외울 건 딱 세 개</h1>
<table>
<thead>
<tr>
<th>#</th>
<th>습관</th>
<th>언제 · 어떻게</th>
</tr>
</thead>
<tbody><tr>
<td>01</td>
<td><strong>멈추기</strong></td>
<td>올리기 전에, &#39;밖에 나가도 되나?&#39; 한 번</td>
</tr>
<tr>
<td>02</td>
<td><strong>가리기</strong></td>
<td>민감한 건 익명화 · 요약 · 가짜로 바꿔서</td>
</tr>
<tr>
<td>03</td>
<td><strong>확인하기</strong></td>
<td>답을 믿기 전에, 근거 · 숫자 · 출처를 검증</td>
</tr>
</tbody></table>
<blockquote>
<p>🏁 멈추고, 가리고, 확인하기. <strong>이 셋만 몸에 붙으면 대부분의 사고는 안 나요.</strong></p>
</blockquote>
<hr>
<blockquote>
<p>📎 <strong>정리 메모</strong> — 스크린샷 21장(슬라이드 02~26) 기준으로 정리했습니다.
빠진 슬라이드: <strong>06 · 11 · 17 · 18</strong> (PART 도입 슬라이드와 입력 판단 O/X 실습으로 추정) → 강의 흐름에 맞춰 재구성했고, 재구성한 부분은 위에 표시해 두었습니다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[검색하지 말고, 일을 시켜라]]></title>
            <link>https://velog.io/@newbie_1761/7%EC%9B%94-29%EC%9D%BC</link>
            <guid>https://velog.io/@newbie_1761/7%EC%9B%94-29%EC%9D%BC</guid>
            <pubDate>Mon, 28 Sep 2026 02:29:59 GMT</pubDate>
            <description><![CDATA[<p>검색하지 말고, 일을 시켜라</p>
<p>&nbsp;</p>
<p>찾기가 아니라 만들기</p>
<ul>
<li>생성형 AI는 어딘가에 있는 것을 찾아주는게 아니라 새로 만들어낸다</li>
</ul>
<p>LLM은 텍스트 데이터로 학습을 한다.</p>
<ul>
<li>뜻보다는 패턴으로 이해한다</li>
<li>맥락이 곧 품질이다</li>
<li>프롬프트를 잘 사용해야한다.</li>
</ul>
<p>프롬프트 회고록
디자인을 정하지 않고 그냥 지시를 내려서 단순해진 경향이 있었습니다. 다음부터는 탬플릿이나 이미지를 넣거나 탐색을 시켜 더 보기 좋게 만들겠습니다. 구현할 기능도 미리 정하지 않고 순간순간 생각나는대로 바꾸면서 토큰을 낭비한 것을 알았고 처음 실행할 프롬프트부터 기능과 디자인을 확정 짓고 명령을 내려야겠다고 생각했습니다.</p>
<h2 id="claude-cowork-개발지침-예시">claude cowork 개발지침 예시</h2>
<h3 id="기술-스택">기술 스택</h3>
<ul>
<li>사용된 기술 스택 기입</li>
</ul>
<h3 id="코딩-및-스타일-규칙">코딩 및 스타일 규칙</h3>
<ul>
<li>들여쓰기: 공백 2칸 (2 spaces)</li>
<li>네이밍 컨벤션: 변수/함수는 camelCase, 클래스/타입은 PascalCase, 상수는 UPPER_SNAKE_CASE</li>
<li>Import 정렬: 라이브러리 임포트 -&gt; 내부 모듈 임포트 순서로 알파벳 정렬</li>
<li>주석 및 언어: 코드 내 설명 주석은 한국어로 작성하되, 함수명과 변수명은 영어 사용, 수정사항은 주석으로 설명</li>
</ul>
<h3 id="아키텍처-및-폴더-구조">아키텍처 및 폴더 구조</h3>
<ul>
<li>레이어드 아키텍처(Controller - Service - Repository) 패턴 준수</li>
<li>비즈니스 로직은 Controller가 아닌 Service 파일에만 작성할 것</li>
</ul>
<h3 id="응답-및-작업-지침">응답 및 작업 지침</h3>
<ul>
<li>코드를 수정하거나 제안할 때, 전체 파일을 다 출력하지 말고 변경된 부분(Diff) 위주나 핵심 함수 단위로 간결하게 보여줄 것</li>
<li>불필요한 설명이나 과장된 미사여구는 배제하고, 기술적이고 명확한 사실만 답변할 것</li>
<li>새로운 라이브러리를 추가하기 전에는 반드시 사용자에게 먼저 동의를 구할 것</li>
<li>경어체와 예의있는 답변을 사용할 것</li>
</ul>
<h3 id="코드는-테스트를-한번씩-하고-문제가-없을-경우-출력">코드는 테스트를 한번씩 하고 문제가 없을 경우 출력</h3>
<p>막히면 풀어본다</p>
<ul>
<li>더 구체적으로</li>
<li>이어서 고쳐 시키기</li>
<li>예시를 보여주기</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[클로드 코워크 완전 정복]]></title>
            <link>https://velog.io/@newbie_1761/%ED%81%B4%EB%A1%9C%EB%93%9C-%EC%BD%94%EC%9B%8C%ED%81%AC-%EC%99%84%EC%A0%84-%EC%A0%95%EB%B3%B5</link>
            <guid>https://velog.io/@newbie_1761/%ED%81%B4%EB%A1%9C%EB%93%9C-%EC%BD%94%EC%9B%8C%ED%81%AC-%EC%99%84%EC%A0%84-%EC%A0%95%EB%B3%B5</guid>
            <pubDate>Wed, 23 Sep 2026 07:14:34 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📦 <strong>Notion에서 옮겨 온 기록입니다.</strong>
이 글부터 Notion에 정리해 두었던 페이지들을 velog로 하루에 한 편씩 옮겨 옵니다. 내용은 Notion 원본을 그대로 옮겼고, velog에 표시되는 작성일은 옮긴 날짜라서 실제로 작성한 시점과 다를 수 있습니다.</p>
<p>Notion 원본 작성일: 2026-07-25</p>
</blockquote>
<hr>
<p>AI 쓰시나요? vs AI에게 일 맡기시나요?
쓰는것 =  내가 주체 (도구 활용 모드)
질문  &gt; 답변 복사 &gt; 직접 편집
매번 처음부터 설명, 결과를 자신이 조합</p>
<p>맡기는 것 = AI가 주체 (위임 모드)
업무를 통째로 위임 &gt; 결과물 받기 &gt; 검수
한번 설꼐하면 반복 실행 가능 - 사용하는 뇌가 다</p>
<p>AI 사용자 vs AX 설계자
AI 사용자와 AX 설계자의 차이
AI를 쓰는 사람 :  필요할 때마다 AI에게 질문하고 답을 얻는 단발성 활용
AI에게 맡기는 사람 : AI가 스스로 업무 프로세스를 완수하도록 구조를 설계</p>
<p>마인드셋 전환의 핵심
Focus 1 : 어떤 프롬프트를 입력할까 &gt; 어떤 워크플로우를 자동화 할까?
Focus 2 : 내가 직접 실행하기 &gt; AI 에이전트에게 위임하고 관리</p>
<p>AX의 목표
단순한 생산성 향상을 넘어, AI가 비즈니스의 핵심 엔진이 되는 자율운영체계 구축</p>
<p>AI의 3가지 한계 = 위험 신호 체크리스트
환각 : 없는 것을 있다고 말함
맥락 의존 : 배경 정보 없으면 평균값만 출력
최신 부재 : 학습 시점 이후는 모름</p>
<p>한계를 알면 무엇을 시킬지 판단된다 - 각 한계별 명확한 극복 방법 존재</p>
<p>AI = 다음 단어를 확률로 예측
이해가 아니라 ‘말 이어붙이기’
검색엔진 : 기존 정보 찾아주기
AI : 패턴 기반 텍스트 만들어 내기
‘잘 모르겠어요’ 대신 자신감 있게 틀림
AI는 불확실함을 드러내지 않음 = 항상 검증 필수</p>
<p>최신 :  학습 시점 이후는 모름
AI 모델 = 특정 시점까지만 학습
실시간 정보는 기본적으로 모름
해결책 : 외부 정보 주입</p>
<p>지금 당장 금지해야 할 5가지
검증 없는 숫자 인용 - AI 숫자를 그대로 쓰면 신뢰도 하락
검증없는 법령/규정 인용 - 존재하지 않는 법 조항 자연스럽게 인용 가능
민감 개인정보 입력 - 보안 규정 위반 위험
최종 의사결정 - 사람의 영역
인간적 판단이 필요한 소통 - 진심이 담겨야함</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[클라우드 컴퓨팅]]></title>
            <link>https://velog.io/@newbie_1761/%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EC%BB%B4%ED%93%A8%ED%8C%85</link>
            <guid>https://velog.io/@newbie_1761/%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EC%BB%B4%ED%93%A8%ED%8C%85</guid>
            <pubDate>Sat, 14 Mar 2026 07:25:42 GMT</pubDate>
            <description><![CDATA[<p>클라우드 컴퓨팅은 IT 리소스를 인터넷을 통해 주문형서비스로 제공하고 사용한만큼만 비용을 지불하는 것
물리적 데이터 센터와 서버 구입, 소유 및 유지 관리는 클라우드 공급가가 제공
AWS, Google, NAVER Cloud와 같은 클라우드 공급자로부터 필요에 따라 컴퓨팅 파워, 스토리지, 데이터베이스와 같은 서비스를 사용하는것</p>
<ul>
<li><p>Public Cloud
서비스 공급자가 클라우드를 구성하는 자원과 환경들을 모두 가지고 구축을 한 다음에 사용자에게 제공</p>
</li>
<li><p>Private Cloud
클라우드 서비스를 하기 위해 필요한 환경이나 데이터센터, 네트워크 장비, 서버등을 구축해서 서비스를 하는것</p>
</li>
<li><p>Hybrid Cloud
Public Cloud와 Private Cloud를 혼용해서 사용하는 클라우드</p>
</li>
</ul>
<h4 id="유연성">유연성</h4>
<p>사용자는 자신의 니즈에 맞게 서비스를 확장, 애플리케이션을 커스터마지으하고, 인터넷 연결을 통해 어디서나 클라우드 서비스를 이용할 수 있다.</p>
<h4 id="효율성">효율성</h4>
<p>사용자는 기본 인프라 비용 또는 유지보수에 대한 걱정 없이 컴퓨팅 자원을 사용하며 애플리케이션을 빠르게 구축할 수 있다
비용, 시간, 공간 등의 제한없이 사용자의 주문형 서비스 사용이 가능한 클라우드 컴퓨팅</p>
<h4 id="전략적-가치">전략적 가치</h4>
<p>클라우드 컴퓨팅 사용은 가장 최신의 컴퓨팅 기술을 제공함으로써 기업이 경쟁 우위를 확보 할 수 있도록 한다
클라우드 서비스 제공업체에서 사전에 구축, 유지보수, 관리서비스 등이 제공되는 글로벌 인프라 서비스, 인스턴스, 네트워크, 스토리지, 보안서비스등 요구에 따라 선택적으로 사용하여 시간, 비용 절약</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Tailwind CSS]]></title>
            <link>https://velog.io/@newbie_1761/Tailwind-CSS</link>
            <guid>https://velog.io/@newbie_1761/Tailwind-CSS</guid>
            <pubDate>Wed, 23 Jul 2025 07:50:24 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/newbie_1761/post/072a3be4-0df8-4f22-a0dd-d9bd90214ac4/image.png" alt=""></p>
<p>이미지 출처 : <a href="https://getlogovector.com/tailwind-css-logo-vector-svg/">https://getlogovector.com/tailwind-css-logo-vector-svg/</a></p>
<hr>
<h2 id="tailwind-css-란">Tailwind CSS 란?</h2>
<p>많은 유틸리티(utility) 클래스로 이루어진 CSS 프레임워크입니다. Tailwind가 제공하는 유틸리티 클래스들을 다양하게 조합하면 추가적인 CSS 코드 작성없이 단순히 HTML 요소의 class속성에 설정해주는 것만으로도 스타일링이 가능하게 됩니다.</p>
<p>CSS의 속성들을 클래스에 직관적으로 표현함으로써 효율적으로 사용할 수 있게 됩니다.
스타일링에 필요한 대부분의 속성들이 클래스 형태로 사전에 정의되어 있고 사용자는 클래스들을 조합해서 사용하면 됩니다.</p>
<p>여기서 유틸리티 클래스란 딱 한 가지 일만 하는 매우 적은 양의 CSS 코드를 담고 있는 클래스를 뜻하는데요. 보통 유틸리티 클래스를 단독으로 쓰기 보다는 여러 개의 유틸리티 클래스를 함께 사용해야지 의미있는 스타일링을 할 수 있습니다.</p>
<p>반복적으로 사용되는 스타일들을 컴포넌트로 추상화하여 재사용할 수 있습니다.
기본적으로 제공되는 유틸리티 클래스 외에도, 프로젝트 요구사항에 맞게 테마를 확장하거나 새로운 유틸리티 클래스를 추가하여 커스터마이징할 수 있습니다.</p>
<h2 id="장점">장점</h2>
<ul>
<li>클래스의 이름을 고민하지 않아도 됩니다.</li>
<li>쉽게 반응형 페이지를 구현할 수 있도록 지원합니다.</li>
<li>기본적으로 제공하는 BreakPoint가 존재하기 때문에 복잡한 반응형 디자인도 쉽게 구현할 수 있습니다.</li>
<li>따로 커스터마이징이 가능합니다.</li>
<li>기본 정의된 테마를 확장할 수도 있고 새로운 속성을 추가할 수 있습니다.</li>
<li>반복되는 스타일은 컴포넌트 추상화, 클래스 추상화를 통해서 재사용 가능합니다.</li>
<li>공식문서가 매우 친절하고 학습 난이도가 낮습니다.</li>
<li>다크 모드 지원 dark: 프리픽스 방식으로 지원 ( 스타일을 직접 추가 하는 방식 )
조금 불편한 방법일 수도 있지만 모듈화가 잘 이루어지면 나중에 dark 클래스 추가만으로도 손쉽게 다크모드를 적용할 수 있습니다.</li>
<li>Tailwind CSS 공식 커뮤니티가 존재하며 컴포넌트 또는 완성된 페이지들도 제공합니다.</li>
</ul>
<h2 id="단점">단점</h2>
<ul>
<li><p>코드의 직관성은 좋으나 가시성은 떨어집니다.
-&gt; <a href="https://marketplace.visualstudio.com/items?itemName=heybourn.headwind">https://marketplace.visualstudio.com/items?itemName=heybourn.headwind</a> 해당 플러그인으로 어느정도 해소가 가능합니다.</p>
</li>
<li><p>초기 학습 곡선: Tailwind의 유틸리티 클래스가 많아 익숙해지기까지 시간이 걸릴 수 있습니다.</p>
</li>
<li><p>클래스 중복: HTML 코드에 많은 클래스가 중첩될 수 있어 가독성이 떨어질 수 있습니다.</p>
</li>
<li><p>의존성 문제: 프로젝트의 스타일링이 Tailwind에 종속되므로, 다른 CSS 프레임워크로 전환하기 어려울 수 있습니다.</p>
</li>
<li><p>JSX의 가독성 저하: React 같은 프레임워크에서 JSX 코드가 복잡해질 수 있습니다.</p>
</li>
<li><p>커스터마이징 제약: 매우 구체적인 디자인 커스터마이징이 필요한 경우 Tailwind의 기본 제공 클래스만으로는 한계가 있을 수 있습니다.</p>
</li>
</ul>
<h2 id="언제-사용해야-하는가">언제 사용해야 하는가?</h2>
<p>디자이너와 협업하며 빠르게 UI를 반복해야 할 때
작은 팀이나 개인 프로젝트에서 CSS 관리 복잡도를 낮추고 싶을 때
디자인 시스템을 코드로 일관되게 유지해야 할 때</p>
<h2 id="결론">결론</h2>
<p>Tailwind CSS는 유틸리티 중심의 접근으로 &#39;어떻게 스타일을 적용할 것인가&#39;에 집중하게 해 주며, 대규모 프로젝트에서도 일관된 디자인을 유지하게 도와줍니다. 클래스가 많아지면 HTML이 복잡해질 수 있으므로, 필요할 땐 @apply 지시자를 써서 별도의 컴포넌트 클래스에 묶어 관리하는 방식도 병행해 보는거를 추천합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[최근 들어 생긴 고민]]></title>
            <link>https://velog.io/@newbie_1761/%EC%B5%9C%EA%B7%BC-%EB%93%A4%EC%96%B4-%EC%83%9D%EA%B8%B4-%EA%B3%A0%EB%AF%BC</link>
            <guid>https://velog.io/@newbie_1761/%EC%B5%9C%EA%B7%BC-%EB%93%A4%EC%96%B4-%EC%83%9D%EA%B8%B4-%EA%B3%A0%EB%AF%BC</guid>
            <pubDate>Sun, 20 Jul 2025 10:51:07 GMT</pubDate>
            <description><![CDATA[<p>최근에 들어 나의 실력이 너무 부족하다는 고민이 너무나도 크게 들기 시작했다.
자료를 찾아보고 유튜브를 보더라도 내가 모르거나 깊게 이해하지 못한 지식들을 다른 취준자들은 술술 풀어내는것을 보았고, 개인 프로젝트를 진행하면서도 문제를 해결하는데도 시간이 너무 걸리면서 결국 해결 못할때는 내가 이 길이 맞는건가 라는 고민이 점점 커진다.</p>
<p>AI로 바이브 코딩하는 것은 개발자로 성장하기에는 큰 도움이 안되는 것을 어느정도 인지하고있기에 AI로는 기본적인 틀만 참고하고 문제점은 스스로 해결하려고 하지만 시간에 쫒겨 결국 AI를 이용하면서 바이브 코딩화가 되가는 내 자신을 보게 되어 자책감도 생기고 자신감도 너무 떨어지게 되면서 그동안 해왔던 모든 준비가 부정당하는 기분이 들기 시작한다.</p>
<p>도대체 어떻게하면 남들보다 잘하지는 못하더라도 비슷하게라도 할수 있는지 큰 고민이 들기 시작했다.
백준에서 문제를 풀어볼때도 브론즈 5~3정도는 자신감있게 풀었지만 실버 이상의 문제를 풀기시작해면서 푸는데도 시간이 너무 걸리고 알고리즘 적으로도 너무 부족해보이는 내가 보이기 시작했다.</p>
<p>일주일간 기초부터 다시 다지기 위해 CS를 다시 되짚어보면서 고민하는 시간을 가져야할거 같다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[BackJoon - 2751]]></title>
            <link>https://velog.io/@newbie_1761/BackJoon-2751</link>
            <guid>https://velog.io/@newbie_1761/BackJoon-2751</guid>
            <pubDate>Thu, 10 Jul 2025 16:13:54 GMT</pubDate>
            <description><![CDATA[<h2 id="문제">문제</h2>
<br>

<p>N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.</p>
<hr>
<h2 id="입력">입력</h2>
<br>

<p>첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다. </p>
<hr>
<h2 id="출력">출력</h2>
<br>

<p>첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.</p>
<hr>
<h2 id="예제">예제</h2>
<br>

<p><img src="https://velog.velcdn.com/images/newbie_1761/post/674b9ff8-b799-474c-99d1-980bedef5fd8/image.png" alt=""></p>
<hr>
<h2 id="해결">해결</h2>
<br>

<pre><code class="language-js">const fs = require(&quot;fs&quot;);
const input = fs.readFileSync(&quot;/dev/stdin&quot;).toString().trim().split(&quot;\n&quot;).map((item) =&gt; Number(item));

const arr = input.shift();

input.sort((a,b) =&gt; a - b);

console.log(input.join(&quot;\n&quot;))</code></pre>
<blockquote>
</blockquote>
<pre><code class="language-js">const arr = input.shift();</code></pre>
<p>첫번째 값은 개수 출력 후에는 사용하지 않으므로 shift처리로 배열에서 없애줍니다.</p>
<blockquote>
</blockquote>
<pre><code class="language-js">input.sort((a, b) =&gt; a - b);</code></pre>
<p>sort의 비교 함수를 통해 숫자를 오름차순으로 정렬합니다.
(a, b) =&gt; a - b는 a가 b보다 작으면 음수, 크면 양수를 반환해서 원하는 순서를 만듭니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[BackJoon - 2741]]></title>
            <link>https://velog.io/@newbie_1761/BackJoon-2741</link>
            <guid>https://velog.io/@newbie_1761/BackJoon-2741</guid>
            <pubDate>Thu, 10 Jul 2025 16:09:15 GMT</pubDate>
            <description><![CDATA[<h2 id="문제">문제</h2>
<br>

<p>자연수 N이 주어졌을 때, 1부터 N까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오.</p>
<hr>
<h2 id="입력">입력</h2>
<br>

<p>첫째 줄에 100,000보다 작거나 같은 자연수 N이 주어진다.</p>
<hr>
<h2 id="출력">출력</h2>
<br>

<p>첫째 줄부터 N번째 줄 까지 차례대로 출력한다.</p>
<hr>
<h2 id="예제">예제</h2>
<br>

<p><img src="https://velog.velcdn.com/images/newbie_1761/post/93060f96-a75d-4b37-a98a-51ac60f07991/image.png" alt=""></p>
<hr>
<h2 id="해결">해결</h2>
<br>

<pre><code class="language-js">const fs = require(&quot;fs&quot;)
const input = fs.readFileSync(&quot;/dev/stdin&quot;).toString().split(&quot; &quot;);

const a = Number(input);

let str = &#39;&#39;
for(let i = 1; i &lt;= a; i++) {
    str = str+i+&#39;\n&#39;
    }

console.log(str);</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[BackJoon - 2738]]></title>
            <link>https://velog.io/@newbie_1761/BackJoon-2738</link>
            <guid>https://velog.io/@newbie_1761/BackJoon-2738</guid>
            <pubDate>Thu, 10 Jul 2025 16:04:46 GMT</pubDate>
            <description><![CDATA[<h2 id="문제">문제</h2>
<br>

<p>N * M크기의 두 행렬 A와 B가 주어졌을 때, 두 행렬을 더하는 프로그램을 작성하시오.</p>
<hr>
<h2 id="입력">입력</h2>
<br>

<p>첫째 줄에 행렬의 크기 N 과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 차례대로 주어진다. 이어서 N개의 줄에 행렬 B의 원소 M개가 차례대로 주어진다. N과 M은 100보다 작거나 같고, 행렬의 원소는 절댓값이 100보다 작거나 같은 정수이다.</p>
<hr>
<h2 id="출력">출력</h2>
<br>

<p>첫째 줄부터 N개의 줄에 행렬 A와 B를 더한 행렬을 출력한다. 행렬의 각 원소는 공백으로 구분한다.</p>
<hr>
<h2 id="예제">예제</h2>
<br>

<p><img src="https://velog.velcdn.com/images/newbie_1761/post/1b5d68b4-fb90-4831-963e-3d0683427c93/image.png" alt=""></p>
<hr>
<h2 id="해결">해결</h2>
<br>

<pre><code class="language-js">const fs = require(&quot;fs&quot;);
const input = fs.readFileSync(&quot;/dev/stdin&quot;).toString().trim().split(&quot;\n&quot;);

const [N, M] = input[0].split(&quot; &quot;).map(Number);
const A = [];
const B = [];

for (let i = 1; i &lt;= N; i++) {
  A.push(input[i].split(&quot; &quot;).map(Number));
}

for (let i = N + 1; i &lt;= N * 2; i++) {
  B.push(input[i].split(&quot; &quot;).map(Number));
}

const result = [];

for (let i = 0; i &lt; N; i++) {
  const row = [];
  for (let j = 0; j &lt; M; j++) {
    row.push(A[i][j] + B[i][j]);
  }
  result.push(row.join(&quot; &quot;));
}

console.log(result.join(&quot;\n&quot;));</code></pre>
<blockquote>
</blockquote>
<pre><code class="language-js">const [N, M] = input[0].split(&quot; &quot;).map(Number);</code></pre>
<p>첫 번째 줄 input[0]을 공백 기준으로 나눈 뒤 map(Number)로 숫자 배열로 변환하여, N(행 수)과 M(열 수)에 각각 할당합니다.</p>
<blockquote>
</blockquote>
<pre><code class="language-js">const A = [];
for (let i = 1; i &lt;= N; i++) {
  A.push(input[i].split(&quot; &quot;).map(Number));
}</code></pre>
<p>두 번째 줄(input[1])부터 input[N]까지 총 N줄을 순회하며,
각 줄을 공백으로 나눠 숫자 배열로 만든 뒤(.split(&quot; &quot;).map(Number)) A 배열에 한 행씩 push 합니다.</p>
<blockquote>
</blockquote>
<pre><code class="language-js">const B = [];
for (let i = N + 1; i &lt;= N * 2; i++) {
  B.push(input[i].split(&quot; &quot;).map(Number));
}</code></pre>
<p>이어서 input[N+1]부터 input[2N]까지 읽어, 같은 방식으로 2차원 배열 B를 만듭니다.</p>
<blockquote>
</blockquote>
<pre><code class="language-js">const result = [];
for (let i = 0; i &lt; N; i++) {
  const row = [];
  for (let j = 0; j &lt; M; j++) {
    row.push(A[i][j] + B[i][j]);
  }
  result.push(row.join(&quot; &quot;));
}</code></pre>
<p>빈 배열 result를 만들고, 이중 for문으로 각 행(i)과 각 열(j)을 순회하면서
A[i][j] + B[i][j]로 같은 위치 원소를 더해 row 배열에 추가합니다.
한 행의 덧셈이 끝나면 row.join(&quot; &quot;)로 공백 구분 문자열로 바꿔 result에 담습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[BackJoon - 2675]]></title>
            <link>https://velog.io/@newbie_1761/BackJoon-2675</link>
            <guid>https://velog.io/@newbie_1761/BackJoon-2675</guid>
            <pubDate>Thu, 10 Jul 2025 15:58:13 GMT</pubDate>
            <description><![CDATA[<h2 id="문제">문제</h2>
<br>

<p>문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 만든 후 출력하는 프로그램을 작성하시오. 즉, 첫 번째 문자를 R번 반복하고, 두 번째 문자를 R번 반복하는 식으로 P를 만들면 된다. S에는 QR Code &quot;alphanumeric&quot; 문자만 들어있다.</p>
<p>QR Code &quot;alphanumeric&quot; 문자는 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ$%*+-./: 이다.</p>
<hr>
<h2 id="입력">입력</h2>
<br>

<p>첫째 줄에 테스트 케이스의 개수 T(1 ≤ T ≤ 1,000)가 주어진다. 각 테스트 케이스는 반복 횟수 R(1 ≤ R ≤ 8), 문자열 S가 공백으로 구분되어 주어진다. S의 길이는 적어도 1이며, 20글자를 넘지 않는다. </p>
<hr>
<h2 id="출력">출력</h2>
<br>

<p>각 테스트 케이스에 대해 P를 출력한다.</p>
<hr>
<h2 id="예제">예제</h2>
<br>

<p><img src="https://velog.velcdn.com/images/newbie_1761/post/697f9e20-156d-44d3-8fd3-76ff1612dfae/image.png" alt=""></p>
<hr>
<h2 id="해결">해결</h2>
<br>

<pre><code class="language-js">const fs = require(&quot;fs&quot;);
const input = fs.readFileSync(&quot;/dev/stdin&quot;).toString().trim().split(&quot;\n&quot;);

const repeat = parseInt(input[0]);

for(let i = 1; i &lt;= repeat; i++) {
    const [r, s] = input[i].split(&#39; &#39;);
    let result = &#39;&#39;;
  for (const char of s) {
    for (let j = 0; j &lt; parseInt(r); j++) {
      result += char;
    }
  }
  console.log(result);
}</code></pre>
<blockquote>
</blockquote>
<pre><code class="language-js">for (let i = 1; i &lt;= repeat; i++) {
  const [r, s] = input[i].split(&#39; &#39;);
  let result = &#39;&#39;;
}</code></pre>
<p>i = 1부터 repeat까지 순회하며, 각 줄(input[i])을 공백 기준으로 나눠 [r, s]로 비구조화 할당합니다.
r: 반복 횟수 (문자 하나를 몇 번 반복할지)
s: 대상 문자열
result라는 빈 문자열을 만들어 반복 결과를 누적합니다.</p>
<blockquote>
</blockquote>
<pre><code class="language-js">for (const char of s) {
  for (let j = 0; j &lt; parseInt(r); j++) {
    result += char;
  }
}</code></pre>
<p>문자열 s의 각 문자(char)에 대해 0부터 r-1까지 반복하면서(j &lt; parseInt(r))
result += char로 저장합니다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[넓이 우선 탐색 BFS]]></title>
            <link>https://velog.io/@newbie_1761/%EB%84%93%EC%9D%B4-%EC%9A%B0%EC%84%A0-%ED%83%90%EC%83%89-BFS</link>
            <guid>https://velog.io/@newbie_1761/%EB%84%93%EC%9D%B4-%EC%9A%B0%EC%84%A0-%ED%83%90%EC%83%89-BFS</guid>
            <pubDate>Thu, 10 Jul 2025 15:51:32 GMT</pubDate>
            <description><![CDATA[<h2 id="넓이-우선-탐색bfs이란">넓이 우선 탐색(BFS)이란</h2>
<p>루트 노드(혹은 다른 임의의 노드)에서 시작해서 인접한 노드를 먼저 탐색하는 방법</p>
<p>시작 정점으로부터 가까운 정점을 먼저 방문하고 멀리 떨어져 있는 정점을 나중에 방문하는 순회 방법이다.
즉, 깊게(deep) 탐색하기 전에 넓게(wide) 탐색하는 것이다.
두 노드 사이의 최단 경로 혹은 임의의 경로를 찾고 싶을 때 이 방법을 선택한다.
넓이 우선 탐색 (BFS)이 깊이 우선 탐색 (DFS)보다 좀 더 복잡하다.</p>
<h2 id="넓이-우선-탐색bfs의-특징">넓이 우선 탐색(BFS)의 특징</h2>
<ul>
<li><p>직관적이지 않은 면이 있다.
BFS는 시작 노드에서 시작해서 거리에 따라 단계별로 탐색한다고 볼 수 있다.</p>
</li>
<li><p>BFS는 재귀적으로 동작하지 않는다.</p>
</li>
<li><p>이 알고리즘을 구현할 때 가장 큰 차이점은, 그래프 탐색의 경우 어떤 노드를 방문했었는지 여부를 반드시 검사 해야 한다는 것이다.
이를 검사하지 않을 경우 무한루프에 빠질 위험이 있다.</p>
</li>
<li><p>BFS는 방문한 노드들을 차례로 저장한 후 꺼낼 수 있는 자료 구조인 큐(Queue)를 사용한다.
즉, 선입선출(FIFO) 원칙으로 탐색
일반적으로 큐를 이용해서 반복적 형태로 구현하는 것이 가장 잘 동작한다.</p>
</li>
<li><p>한 갈림길에서 연결되는 모든 길을 한번씩 탐색하기 때문에 가중치가 없는 그래프에서는 시작점에서 끝점까지의 최단경로를 알아낼 수 있다.</p>
</li>
<li><p>‘Prim’, ‘Dijkstra’ 알고리즘과 유사하다.</p>
</li>
</ul>
<h2 id="넓이-우선-탐색bfs의-과정정">넓이 우선 탐색(BFS)의 과정정</h2>
<p>깊이가 1인 모든 노드를 방문하고 나서 그 다음에는 깊이가 2인 모든 노드를, 그 다음에는 깊이가 3인 모든 노드를 방문하는 식으로 계속 방문하다가 더 이상 방문할 곳이 없으면 탐색을 마친다.</p>
<p><img src="https://velog.velcdn.com/images/newbie_1761/post/1a0e05ac-27ef-47f6-8217-cd3218fe420f/image.png" alt=""></p>
<ol>
<li>a 노드(시작 노드)를 방문한다. (방문한 노드 체크)</li>
</ol>
<ul>
<li>큐에 방문된 노드를 삽입(enqueue)한다.</li>
<li>초기 상태의 큐에는 시작 노드만이 저장</li>
<li>즉, a 노드의 이웃 노드를 모두 방문한 다음에 이웃의 이웃들을 방문한다.</li>
</ul>
<ol start="2">
<li>큐에서 꺼낸 노드과 인접한 노드들을 모두 차례로 방문한다.</li>
</ol>
<ul>
<li>큐에서 꺼낸 노드를 방문한다.</li>
<li>큐에서 커낸 노드과 인접한 노드들을 모두 방문한다.</li>
<li>인접한 노드가 없다면 큐의 앞에서 노드를 꺼낸다(dequeue).</li>
<li>큐에 방문된 노드를 삽입(enqueue)한다.</li>
</ul>
<ol start="3">
<li>큐가 소진될 때까지 계속한다.</li>
</ol>
<h2 id="넓이-우선-탐색의-시간복잡도">넓이 우선 탐색의 시간복잡도</h2>
<ul>
<li>인접 리스트로 표현된 그래프: O(N+E)</li>
<li>인접 행렬로 표현된 그래프: O(N^2)</li>
<li>깊이 우선 탐색(DFS)과 마찬가지로 그래프 내에 적은 숫자의 간선만을 가지는 희소 그래프(Sparse Graph) 의 경우 인접 행렬보다 인접 리스트를 사용하는 것이 유리하다</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[BackJoon - 2630]]></title>
            <link>https://velog.io/@newbie_1761/BackJoon-2630</link>
            <guid>https://velog.io/@newbie_1761/BackJoon-2630</guid>
            <pubDate>Thu, 10 Jul 2025 08:07:41 GMT</pubDate>
            <description><![CDATA[<h2 id="문제">문제</h2>
<br>

<p>아래 &lt;그림 1&gt;과 같이 여러개의 정사각형칸들로 이루어진 정사각형 모양의 종이가 주어져 있고, 각 정사각형들은 하얀색으로 칠해져 있거나 파란색으로 칠해져 있다. 주어진 종이를 일정한 규칙에 따라 잘라서 다양한 크기를 가진 정사각형 모양의 하얀색 또는 파란색 색종이를 만들려고 한다.</p>
<p><img src="https://velog.velcdn.com/images/newbie_1761/post/3d06e99d-700d-4ef6-9d32-aa0a52ac0fcb/image.png" alt=""></p>
<p>전체 종이의 크기가 N×N(N=2k, k는 1 이상 7 이하의 자연수) 이라면 종이를 자르는 규칙은 다음과 같다.</p>
<p>전체 종이가 모두 같은 색으로 칠해져 있지 않으면 가로와 세로로 중간 부분을 잘라서 &lt;그림 2&gt;의 I, II, III, IV와 같이 똑같은 크기의 네 개의 N/2 × N/2색종이로 나눈다. 나누어진 종이 I, II, III, IV 각각에 대해서도 앞에서와 마찬가지로 모두 같은 색으로 칠해져 있지 않으면 같은 방법으로 똑같은 크기의 네 개의 색종이로 나눈다. 이와 같은 과정을 잘라진 종이가 모두 하얀색 또는 모두 파란색으로 칠해져 있거나, 하나의 정사각형 칸이 되어 더 이상 자를 수 없을 때까지 반복한다.</p>
<p>위와 같은 규칙에 따라 잘랐을 때 &lt;그림 3&gt;은 &lt;그림 1&gt;의 종이를 처음 나눈 후의 상태를, &lt;그림 4&gt;는 두 번째 나눈 후의 상태를, &lt;그림 5&gt;는 최종적으로 만들어진 다양한 크기의 9장의 하얀색 색종이와 7장의 파란색 색종이를 보여주고 있다.</p>
<p><img src="https://velog.velcdn.com/images/newbie_1761/post/637aa56d-a6db-4e89-bdeb-fc01306a5db3/image.png" alt=""></p>
<p>입력으로 주어진 종이의 한 변의 길이 N과 각 정사각형칸의 색(하얀색 또는 파란색)이 주어질 때 잘라진 하얀색 색종이와 파란색 색종이의 개수를 구하는 프로그램을 작성하시오.</p>
<hr>
<h2 id="입력">입력</h2>
<br>

<p>첫째 줄에는 전체 종이의 한 변의 길이 N이 주어져 있다. N은 2, 4, 8, 16, 32, 64, 128 중 하나이다. 색종이의 각 가로줄의 정사각형칸들의 색이 윗줄부터 차례로 둘째 줄부터 마지막 줄까지 주어진다. 하얀색으로 칠해진 칸은 0, 파란색으로 칠해진 칸은 1로 주어지며, 각 숫자 사이에는 빈칸이 하나씩 있다.</p>
<hr>
<h2 id="출력">출력</h2>
<br>

<p>첫째 줄에는 잘라진 햐얀색 색종이의 개수를 출력하고, 둘째 줄에는 파란색 색종이의 개수를 출력한다.</p>
<hr>
<h2 id="예제">예제</h2>
<br>

<p><img src="https://velog.velcdn.com/images/newbie_1761/post/f0c8ce55-4e9c-4412-8e66-e0e3ed4a32e4/image.png" alt=""></p>
<hr>
<h2 id="해결">해결</h2>
<br>

<pre><code class="language-js">const fs = require(&#39;fs&#39;);
const input = fs.readFileSync(&#39;/dev/stdin&#39;).toString().trim().split(/\s+/).map(Number);

const N = input[0];
const paper = [];
for (let i = 0; i &lt; N; i++) {
  paper.push(input.slice(1 + i * N, 1 + (i + 1) * N));
}

let white = 0;
let blue = 0;

function countColor(x, y, size) {
  const first = paper[y][x];
  let allSame = true;

  for (let i = y; i &lt; y + size; i++) {
    for (let j = x; j &lt; x + size; j++) {
      if (paper[i][j] !== first) {
        allSame = false;
        break;
      }
    }
    if (!allSame) break;
  }

  if (allSame) {
    if (first === 0) white++;
    else blue++;
  } else {
    const half = size / 2;
    countColor(x, y, half); // 왼쪽 위
    countColor(x + half, y, half); // 오른쪽 위
    countColor(x, y + half, half); // 왼쪽 아래
    countColor(x + half, y + half, half); // 오른쪽 아래
  }
}

countColor(0, 0, N);

console.log(white);
console.log(blue)</code></pre>
<blockquote>
</blockquote>
<pre><code class="language-js">const paper = [];
for (let i = 0; i &lt; N; i++) {
  paper.push(input.slice(1 + i * n, 1 + (i + 1) * n));
}</code></pre>
<p>뒤이어 들어오는 n×n개의 숫자를 한 줄씩 잘라 paper[y][x] 형태의 2차원 배열로 만듭니다.
0은 흰색, 1은 파란색 칸을 의미합니다.</p>
<blockquote>
</blockquote>
<pre><code class="language-js">function countColor(x, y, size) {
  const first = paper[y][x];
  let allSame = true;
   // 현재 크기(size×size) 범위 안에 칸들이 모두 first(0 또는 1)와 같은지 검사
  for (let i = y; i &lt; y + size; i++) {
    for (let j = x; j &lt; x + size; j++) {
      if (paper[i][j] !== first) {
        allSame = false;
        break;
      }
    }
    if (!allSame) break;
  }
  if (allSame) {
    // 모두 같은 색이면 해당 색 카운트 증가
    if (first === 0) white++;
    else blue++;
  } else {
    // 아니면 크기를 반으로 나누어 네 개의 분할 영역에 대해 재귀 호출
    const half = size / 2;
    countColor(x, y, half); // 왼쪽 위
    countColor(x + half, y, half); // 오른쪽 위
    countColor(x, y + half, half); // 왼쪽 아래
    countColor(x + half, y + half, half); // 오른쪽 아래
  }
}</code></pre>
<p>해당 영역이 모두 같은 색(allSame===true)이면 더 이상 분할하지 않고 바로 white 또는 blue를 1 증가시킵니다.
섞여 있는 영역이라면 size/2 크기로 4분면(쿼드트리 방식)으로 나누어 각각 검사합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[BackJoon - 1931]]></title>
            <link>https://velog.io/@newbie_1761/BackJoon-1931</link>
            <guid>https://velog.io/@newbie_1761/BackJoon-1931</guid>
            <pubDate>Thu, 10 Jul 2025 07:58:30 GMT</pubDate>
            <description><![CDATA[<h2 id="문제">문제</h2>
<br>

<p>한 개의 회의실이 있는데 이를 사용하고자 하는 N개의 회의에 대하여 회의실 사용표를 만들려고 한다. 각 회의 I에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아보자. 단, 회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다.</p>
<hr>
<h2 id="입력">입력</h2>
<br>

<p>첫째 줄에 회의의 수 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N+1 줄까지 각 회의의 정보가 주어지는데 이것은 공백을 사이에 두고 회의의 시작시간과 끝나는 시간이 주어진다. 시작 시간과 끝나는 시간은 231-1보다 작거나 같은 자연수 또는 0이다.</p>
<hr>
<h2 id="출력">출력</h2>
<br>

<p>첫째 줄에 최대 사용할 수 있는 회의의 최대 개수를 출력한다.</p>
<hr>
<h2 id="예제">예제</h2>
<br>

<p><img src="https://velog.velcdn.com/images/newbie_1761/post/478e6d62-7282-468a-91dd-639f1661c4f1/image.png" alt=""></p>
<hr>
<h2 id="해결">해결</h2>
<br>

<pre><code class="language-js">const fs = require(&#39;fs&#39;);
const input = fs.readFileSync(&#39;/dev/stdin&#39;).toString().trim().split(&#39;\n&#39;);
const N = parseInt(input[0], 10);

const meetings = input.slice(1).map(line =&gt; {
  const [start, end] = line.split(&#39; &#39;).map(Number);
  return { start, end };
});

meetings.sort((a, b) =&gt; a.end - b.end || a.start - b.start);

let count = 0;
let lastEnd = 0;
for (const { start, end } of meetings) {
  if (start &gt;= lastEnd) {
    count++;
    lastEnd = end;
  }
}

console.log(count);</code></pre>
<blockquote>
</blockquote>
<pre><code class="language-js">const meetings = input.slice(1).map(line =&gt; {
  const [start, end] = line.split(&#39; &#39;).map(Number);
  return { start, end };
});</code></pre>
<p>두 번째 줄부터 마지막 줄까지 각 줄을 시작 시간 &amp; 끝 시간 형태로 읽어
{ start: Number, end: Number } 객체 배열로 변환합니다.</p>
<blockquote>
</blockquote>
<pre><code class="language-js">meetings.sort((a, b) =&gt; a.end - b.end || a.start - b.start);</code></pre>
<p>끝나는 시간(end) 기준 오름차순 정렬합니다.
만약 끝나는 시간이 같다면, 시작 시간(start) 기준으로 오름차순 정렬해 같은 종료 시간 회의끼리는 일찍 시작하는 회의를 먼저 고려하도록 합니다.</p>
<blockquote>
</blockquote>
<pre><code class="language-js">let count = 0;
let lastEnd = 0;
for (const { start, end } of meetings) {
  if (start &gt;= lastEnd) {
    count++;
    lastEnd = end;
  }
}</code></pre>
<p>lastEnd 변수에는 이전에 선택한 회의의 종료 시각을 저장합니다.
정렬된 회의들을 순서대로 보면서 현재 회의의 시작 시간이 lastEnd값 이상이면 count를 하나 올리고
lastEnd를 현재 회의의 끝나는 시간으로 갱신합니다. 그렇지 않으면 건너뛰어 다음 회의 후보를 검사합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[깊이 우선 탐색 DFS ]]></title>
            <link>https://velog.io/@newbie_1761/%EA%B9%8A%EC%9D%B4-%EC%9A%B0%EC%84%A0-%ED%83%90%EC%83%89-DFS</link>
            <guid>https://velog.io/@newbie_1761/%EA%B9%8A%EC%9D%B4-%EC%9A%B0%EC%84%A0-%ED%83%90%EC%83%89-DFS</guid>
            <pubDate>Wed, 09 Jul 2025 14:54:52 GMT</pubDate>
            <description><![CDATA[<h2 id="깊이-우선-탐색이란">깊이 우선 탐색이란</h2>
<p>루트 노드(혹은 다른 임의의 노드)에서 시작해서 다음 분기(branch)로 넘어가기 전에 해당 분기를 완벽하게 탐색하는 방법</p>
<ul>
<li>미로를 탐색할 때 한 방향으로 갈 수 있을 때까지 계속 가다가 더 이상 갈 수 없게 되면 다시 가장 가까운 갈림길로 돌아와서 이곳으로부터 다른 방향으로 다시 탐색을 진행하는 방법과 유사하다.</li>
<li>즉, 넓게(wide) 탐색하기 전에 깊게(deep) 탐색하는 것이다.</li>
<li>사용하는 경우: 모든 노드를 방문 하고자 하는 경우에 이 방법을 선택한다.</li>
<li>깊이 우선 탐색(DFS)이 너비 우선 탐색(BFS)보다 좀 더 간단하다.</li>
<li>단순 검색 속도 자체는 너비 우선 탐색(BFS)에 비해서 느리다.</li>
</ul>
<h2 id="깊이-수선-탐색의-특징">깊이 수선 탐색의 특징</h2>
<ul>
<li>자기 자신을 호출하는 순환 알고리즘의 형태 를 가지고 있다.</li>
<li>전위 순회(Pre-Order Traversals)를 포함한 다른 형태의 트리 순회는 모두 DFS의 한 종류이다.</li>
<li>이 알고리즘을 구현할 때 가장 큰 차이점은, 그래프 탐색의 경우 어떤 노드를 방문했었는지 여부를 반드시 검사 해야 한다는 것이다.
이를 검사하지 않을 경우 무한루프에 빠질 위험이 있다.</li>
</ul>
<h4 id="장점">장점</h4>
<ul>
<li><p>단지 현 경로상의 노드들만을 기억하면 되므로 저장 공간의 수요가 비교적 적다.</p>
</li>
<li><p>목표 노드가 깊은 단계에 있을 경우 해를 빨리 구할 수 있다.</p>
</li>
</ul>
<h4 id="단점">단점</h4>
<ul>
<li><p>해가 없는 경로에 깊이 빠질 가능성이 있다. 따라서 실제로는 미리 지정한 임의 깊이까지만 탐색하고 목표 노드를 발견하지 못하면 다음 경로를 따라 탐색하는 방법이 유용할 수 있다.</p>
</li>
<li><p>얻어진 해가 최단 경로가 된다는 보장이 없다. 이는 목표에 이르는 경로가 다수인 문제에 대해 깊이우선탐색은 해에 다다르면 탐색을 끝내버리므로, 이때 얻어진 해는 최적이 아닐 수 있다는 의미이다.</p>
</li>
</ul>
<h2 id="깊이-우선-탐색의-시간-복잡도">깊이 우선 탐색의 시간 복잡도</h2>
<p>DFS는 그래프(정점의 수: N, 간선의 수: E)의 모든 간선을 조회한다.</p>
<ul>
<li>인접 리스트로 표현된 그래프: O(N+E)</li>
<li>인접 행렬로 표현된 그래프: O(N^2)
즉, 그래프 내에 적은 숫자의 간선만을 가지는 희소 그래프(Sparse Graph) 의 경우 인접 행렬보다 인접 리스트를 사용하는 것이 유리하다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[BackJoon - 1463]]></title>
            <link>https://velog.io/@newbie_1761/BackJoon-1463</link>
            <guid>https://velog.io/@newbie_1761/BackJoon-1463</guid>
            <pubDate>Wed, 09 Jul 2025 14:26:58 GMT</pubDate>
            <description><![CDATA[<h2 id="문제">문제</h2>
<br>

<p>정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.</p>
<ul>
<li>X가 3으로 나누어 떨어지면, 3으로 나눈다.</li>
<li>X가 2로 나누어 떨어지면, 2로 나눈다.</li>
<li>1을 뺀다. 
정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.</li>
</ul>
<hr>
<h2 id="입력">입력</h2>
<br>

<p>첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.</p>
<hr>
<h2 id="출력">출력</h2>
<br>

<p>첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.</p>
<hr>
<h2 id="예제">예제</h2>
<br>

<p><img src="https://velog.velcdn.com/images/newbie_1761/post/8c35c4f6-6180-4d37-802e-07a3f6ccb035/image.png" alt=""></p>
<hr>
<h2 id="해결">해결</h2>
<br>

<pre><code class="language-js">const fs = require(&quot;fs&quot;);
const input = parseInt(fs.readFileSync(&quot;/dev/stdin&quot;).toString().trim());

const a = Array(input + 1).fill(0);

for (let i = 2; i &lt;= input; i++) {
    a[i] = a[i - 1] + 1;

    if (i % 2 === 0) {
        a[i] = Math.min(a[i], a[i / 2] + 1);
    }

    if (i % 3 === 0) {
        a[i] = Math.min(a[i], a[i / 3] + 1);
    }
}

console.log(a[input]);</code></pre>
<p>a[i - 1] + 1 은
i에서 1을 빼는 연산을 한 번 한 뒤, 남은 값 ( i − 1 )를 1로 만드는 연산 횟수(a[i-1])에 더합니다.</p>
<p>i % 2 === 0
i가 2의 배수일 때 i/2에서 2를 곱해 i가 된다고보고 (a[i - 1] + 1) 중 작은 쪽을 선택합니다.</p>
<p>i % 3 === 0 이면 
i/3에서 3을 곱해 i가 된다고 보고, a[i] = min(a[i],a(i/3)+1)으로 갱신</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[BackJoon - 2609]]></title>
            <link>https://velog.io/@newbie_1761/BackJoon-2609</link>
            <guid>https://velog.io/@newbie_1761/BackJoon-2609</guid>
            <pubDate>Mon, 07 Jul 2025 16:23:02 GMT</pubDate>
            <description><![CDATA[<h2 id="문제">문제</h2>
<br>

<p>두 개의 자연수를 입력받아 최대 공약수와 최소 공배수를 출력하는 프로그램을 작성하시오.</p>
<hr>
<h2 id="입력">입력</h2>
<br>

<p>첫째 줄에는 두 개의 자연수가 주어진다. 이 둘은 10,000이하의 자연수이며 사이에 한 칸의 공백이 주어진다.</p>
<hr>
<h2 id="출력">출력</h2>
<br>

<p>첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다.</p>
<hr>
<h2 id="예제">예제</h2>
<br>

<p><img src="https://velog.velcdn.com/images/newbie_1761/post/fe02cf4b-e711-42cb-8c81-92cc11ab77fc/image.png" alt=""></p>
<hr>
<h2 id="해결">해결</h2>
<br>

<pre><code class="language-js">const fs = require(&quot;fs&quot;);
const input = fs.readFileSync(&quot;/dev/stdin&quot;).toString().trim().split(&quot; &quot;).map((item) =&gt; Number(item));

let a = input[0];
let b = input[1];

while(a % b !== 0){
    let r = a % b;

       if(r !== 0){
        a = b;
        b = r;
    }
}
console.log(b);
console.log((input[0] * input[1]) / b);</code></pre>
<p>유클리드 호제법으로 구하는 문제입니다.
유클리드 호제법에 대한 내용은 해당링크에 정리되어 있습니다.
<a href="https://ko.wikipedia.org/wiki/%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C_%ED%98%B8%EC%A0%9C%EB%B2%95">https://ko.wikipedia.org/wiki/%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C_%ED%98%B8%EC%A0%9C%EB%B2%95</a></p>
<blockquote>
</blockquote>
<pre><code class="language-js">while (a % b !== 0) {
    let r = a % b;
    if (r !== 0) {
        a = b;
        b = r;
    }
}</code></pre>
<p>a % b가 0이 아닐 동안(while (a % b !== 0)) 반복해서:
r = a % b 로 나머지를 구하고
그 나머지(r)가 0이 아니면 a &lt;- b, b &lt;- r 로 값을 갱신합니다.</p>
<blockquote>
</blockquote>
<pre><code class="language-js">console.log(b);
console.log((input[0] * input[1]) / b);</code></pre>
<p>반복이 끝난 시점의 b를 출력합니다. 이 값이 바로 최대공약수입니다.</p>
<p>두 수의 곱을 최대공약수로 나오면 최소공배수가 나오므로
console.log((input[0] * input[1]) / b); 를 출력해줍니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[유클리드 호제법]]></title>
            <link>https://velog.io/@newbie_1761/%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C-%ED%98%B8%EC%A0%9C%EB%B2%95</link>
            <guid>https://velog.io/@newbie_1761/%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C-%ED%98%B8%EC%A0%9C%EB%B2%95</guid>
            <pubDate>Mon, 07 Jul 2025 16:22:19 GMT</pubDate>
            <description><![CDATA[<h2 id="정의">정의</h2>
<p>유클리드 호제법(-互除法, Euclidean algorithm) 또는 유클리드 알고리즘은 2개의 자연수 또는 정식(整式)의 최대공약수를 구하는 알고리즘의 하나이다. 
호제법이란 말은 두 수가 서로(互) 상대방 수를 나누어(除)서 결국 원하는 수를 얻는 알고리즘을 나타낸다. 
2개의 자연수(또는 정식) a, b에 대해서 a를 b로 나눈 나머지를 r이라 하면(단, a&gt;b), a와 b의 최대공약수는 b와 r의 최대공약수와 같다. 
이 성질에 따라, b를 r로 나눈 나머지 r&#39;를 구하고, 다시 r을 r&#39;로 나눈 나머지를 구하는 과정을 반복하여 나머지가 0이 되었을 때 나누는 수가 a와 b의 최대공약수이다. 
이는 명시적으로 기술된 가장 오래된 알고리즘으로서도 알려져 있으며, 기원전 300년경에 쓰인 《원론》 제7권, 명제 1부터 3까지에 해당한다. 최소공배수, 최대공약수를 구하기 위해서는 다음과 같은 표를 쓴다.</p>
<p><img src="https://velog.velcdn.com/images/newbie_1761/post/46833cec-592e-469c-8e15-5c088bc011cf/image.gif" alt=""></p>
<p>(출처 : <a href="https://ko.wikipedia.org/wiki/%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C_%ED%98%B8%EC%A0%9C%EB%B2%95">https://ko.wikipedia.org/wiki/%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C_%ED%98%B8%EC%A0%9C%EB%B2%95</a>)</p>
<h2 id="알고리즘">알고리즘</h2>
<p>입력으로 두 수 m,n(m&gt;n)이 들어온다.
n이 0이라면, m을 출력하고 알고리즘을 종료한다.
m이 n으로 나누어 떨어지면, n을 출력하고 알고리즘을 종료한다.
그렇지 않으면, m을 n으로 나눈 나머지를 새롭게 m에 대입하고, m과 n을 바꾸고 3번으로 돌아온다.
위 과정은 “n, m에 대해서 나머지 연산을 실시할 수 있다”라는 조건에만 의존하므로, 정수환뿐 아니라, 임의의 유클리드 정역에 대해도 똑같은 과정을 거치면 공약인자가 구해진다.</p>
<h2 id="예시">예시</h2>
<p>1071과 1029의 최대공약수를 구하면,</p>
<p>1071은 1029로 나누어 떨어지지 않기 때문에, 1071을 1029로 나눈 나머지를 구한다. ≫ 42
1029는 42로 나누어 떨어지지 않기 때문에, 1029를 42로 나눈 나머지를 구한다. ≫ 21
42는 21로 나누어 떨어진다.
따라서, 최대공약수는 21이다.</p>
<p>78696과 19332의 최대공약수를 구하면,</p>
<blockquote>
<p>   78696 ＝ 19332×4 ＋ 1368
    19332 ＝ 1368×14 ＋ 180
     1368 ＝ 180×7 ＋ 108
      180 ＝ 108×1 ＋ 72
      108 ＝ 72×1 ＋ 36
       72 ＝ 36×2 ＋ 0</p>
</blockquote>
<p>따라서, 최대공약수는 36이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[BackJoon - 2566]]></title>
            <link>https://velog.io/@newbie_1761/BackJoon-2566</link>
            <guid>https://velog.io/@newbie_1761/BackJoon-2566</guid>
            <pubDate>Mon, 07 Jul 2025 16:09:46 GMT</pubDate>
            <description><![CDATA[<h2 id="문제">문제</h2>
<br>

<p>&lt;그림 1&gt;과 같이 9×9 격자판에 쓰여진 81개의 자연수 또는 0이 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 행 몇 열에 위치한 수인지 구하는 프로그램을 작성하시오.</p>
<p>예를 들어, 다음과 같이 81개의 수가 주어지면</p>
<p><img src="https://velog.velcdn.com/images/newbie_1761/post/0274941f-5512-4b4b-804f-ca1782d467a5/image.png" alt=""></p>
<p>이들 중 최댓값은 90이고, 이 값은 5행 7열에 위치한다.</p>
<hr>
<h2 id="입력">입력</h2>
<br>

<p>첫째 줄부터 아홉 번째 줄까지 한 줄에 아홉 개씩 수가 주어진다. 주어지는 수는 100보다 작은 자연수 또는 0이다.</p>
<hr>
<h2 id="출력">출력</h2>
<br>

<p>첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 위치한 행 번호와 열 번호를 빈칸을 사이에 두고 차례로 출력한다. 최댓값이 두 개 이상인 경우 그 중 한 곳의 위치를 출력한다.</p>
<hr>
<h2 id="예제">예제</h2>
<br>

<p><img src="https://velog.velcdn.com/images/newbie_1761/post/73b690d1-f79d-4a72-9730-be9aed7fd7f2/image.png" alt=""></p>
<hr>
<h2 id="해결">해결</h2>
<br>

<pre><code class="language-js">const fs = require(&quot;fs&quot;);
const input = fs.readFileSync(&quot;/dev/stdin&quot;).toString().trim().split(&quot;\n&quot;);

const matrix = input.map(line =&gt; line.split(&quot; &quot;).map(Number));
const flat = matrix.flat();
const max = Math.max.apply(null, flat);

let row = 0;
let col = 0;

for (let i = 0; i &lt; 9; i++) {
  for (let j = 0; j &lt; 9; j++) {
    if (matrix[i][j] === max) {
      row = i + 1;
      col = j + 1;
    }
  }
}

console.log(max);
console.log(${row} ${col});</code></pre>
<blockquote>
</blockquote>
<pre><code class="language-js">const matrix = input.map(line =&gt; line.split(&quot; &quot;).map(Number));</code></pre>
<p>각 줄(line)을 공백으로 나눠 숫자 문자열 배열로 만들고,
map(Number)로 다시 숫자로 변환해 2차원 배열 matrix를 구성합니다.</p>
<blockquote>
</blockquote>
<pre><code class="language-js">const flat = matrix.flat();
const max = Math.max.apply(null, flat);</code></pre>
<p>matrix.flat()로 9×9 배열을 1차원(길이 81) 배열로 펴고,
펴진 배열을 Math.max에 인자로 풀어(apply(null, flat)) 최댓값 max를 구합니다.</p>
<blockquote>
</blockquote>
<pre><code class="language-js">let row = 0;
let col = 0;
for (let i = 0; i &lt; 9; i++) {
  for (let j = 0; j &lt; 9; j++) {
    if (matrix[i][j] === max) {
      row = i + 1;
      col = j + 1;
    }
  }
}</code></pre>
<p>2중 for문으로 원본 matrix를 순회하며 각 요소가 max와 같을 때의 인덱스를 찾습니다.
i는 행, j는 열을 나타내므로, 출력은 1부터 시작하는 행과 열의 번호를 요구하므로 i+1, j+1을 저장합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[BackJoon - 2562]]></title>
            <link>https://velog.io/@newbie_1761/BackJoon-2562</link>
            <guid>https://velog.io/@newbie_1761/BackJoon-2562</guid>
            <pubDate>Mon, 07 Jul 2025 16:03:27 GMT</pubDate>
            <description><![CDATA[<h2 id="문제">문제</h2>
<br>

<p>9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오.
예를 들어, 서로 다른 9개의 자연수
3, 29, 38, 12, 57, 74, 40, 85, 61
이 주어지면, 이들 중 최댓값은 85이고, 이 값은 8번째 수이다.</p>
<hr>
<h2 id="입력">입력</h2>
<br>

<p>첫째 줄부터 아홉 번째 줄까지 한 줄에 하나의 자연수가 주어진다. 주어지는 자연수는 100 보다 작다.</p>
<hr>
<h2 id="출력">출력</h2>
<br>

<p>첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 몇 번째 수인지를 출력한다.</p>
<hr>
<h2 id="예제">예제</h2>
<br>

<p><img src="https://velog.velcdn.com/images/newbie_1761/post/72438ea6-6c6f-4902-b1be-a80f6b01a6d7/image.png" alt=""></p>
<hr>
<h2 id="해결">해결</h2>
<br>

<pre><code class="language-js">const fs = require(&quot;fs&quot;)
const input = fs.readFileSync(&quot;/dev/stdin&quot;).toString().split(&quot;\n&quot;).map(Number);
const max = Math.max(...input);

console.log(max);
console.log(input.indexOf(max)+1);</code></pre>
<p>Math.max(...input)으로 정렬된 배열의 값들 중 최대값을 뽑아냅니다.
input.indexOf(max)은 배열에서 첫 번째로 max가 등장하는 인덱스(0부터 시작)를 반환하고, 문제에서 줄은 1부터(input[1]) 세기 때문에 +1을 해 줍니다.</p>
]]></description>
        </item>
    </channel>
</rss>