<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title> </title>
    <link>https://xewaves.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Thu, 23 Jul 2026 01:55:52 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>sourceoftax</managingEditor>
    <item>
      <title>웹게임?</title>
      <link>https://xewaves.tistory.com/30</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://youtube.com/watch?v=iYbAqAclhuk&amp;amp;feature=youtu.be&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://youtube.com/watch?v=iYbAqAclhuk&amp;amp;feature=youtu.be&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=iYbAqAclhuk&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/Tqt8r/dJMb9g4665j/SGgFJ1LXHLoxkdlc2rlsQk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/bsVpQs/dJMb81GS9zA/Rnzf5smq4TDD35DIvaR6KK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/zW9js/dJMb8VNrikt/KYxQsu4E6pP7KbF7h3vUpk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;실행 영상&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/iYbAqAclhuk&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;플레이 영상&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학교 동아리 초보 코딩 대회 냈던 거&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;컨셉&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기 기획안은 다음과 같습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기 화면&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;집 배경&lt;/li&gt;
&lt;li&gt;돌아다니는 마릴리&lt;/li&gt;
&lt;li&gt;휴대폰 손에 쥐고 있음(이게 메뉴 화면) -&amp;gt; 휴대폰 앱을 클릭하면 이벤트로 넘어갈 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트 1(산책)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;공통: 화면을 걸어가며 랜덤 이벤트 조우 형식. 마릴리의 총 체력 5. 다니며 다른 포켓몬들을 조우 가능. 조우시 '선공/지켜보기/도망' 중 선택 가능. 호전적인 포켓몬을 만났을 시: '선공'시 해당 포켓몬이 가진 나무열매or조미료 습득 가능. '지켜보기' 시 50% 확률로 공격받음(마릴리의 체력-1), 50% 확률로 아무 일도 일어나지 않음. '도망' 선택시 25% 확률로 공격받음(마릴리의 체력 -1) 중립적인 포켓몬을 만났을 시: '선공'시 해당 포켓몬이 가진 나무열매or조미료 습득 가능. '지켜보기' 시 50% 확률로 공격받음(마릴리의 체력-1), 50% 확률로 온순한 포켓몬이 다가와 나무열매를 건네줌. '도망' 선택시 아무 일도 일어나지 않음 온순한 포켓몬을 만났을 시: '선공'시 해당 포켓몬이 가진 나무열매 습득 가능, '죄책감이 든다...'라는 메시지 나옴. '지켜보기' 시 50% 확률로 온순한 포켓몬이 다가와 나무열매를 건네줌, 50% 확률로 아무 일도 일어나지 않음. '도망' 선택시 아무 일도 일어나지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마릴리의 체력이 0이 되면 강제 귀가. 아래의 이벤트가 나오면(조우 확률 약 10%) 산책 성공으로 처리함. 이후 초기 화면으로 돌아감&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1-1. 숲&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대량의 나무열매를 획득 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1-2. 강&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대량의 조미료 획득 가능. 마릴리의 기분이 좋아짐&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트 2(요리)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보유한 나무열매와 조미료를 선택해 진입 가능. 소지한 나무열매 or 조미료가 하나도 없다면 진입 불가 2-1. 불 지피기: 클릭 or 스페이스바 연타를 통해 불이 꺼지지 않게 유지해야 함&lt;/li&gt;
&lt;li&gt;완성된 요리를 마릴리가 먹는 CG. 이후 초기 화면으로 돌아감&lt;/li&gt;
&lt;li&gt;여기에 나무열매와 조미료 조합에 따라 마릴리의 선호가 달라지는 변동성 넣어도 좋을듯?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트 3(목욕)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;마릴리 일러스트에 스펀지(마우스 커서)를 대고 클릭하면 거품 묻히기 가능 -&amp;gt; 이후 거품이 충분히(시스템 최대 거품 기준 70% 이상) 묻었다면 샤워기 아이콘 등장 -&amp;gt; 샤워기로 거품을 씻어내면 이벤트 완료. 초기 화면으로 돌아감&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 로직들을 구현하기 위해 코드를 크게 네 가지로 분류해 작성하였습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Python산책: 턴 수에 따라 이벤트 확률을 증가시키고, 포켓몬 조우 시 성격과 사용자의 선택에 따라 피해&amp;middot;보상 결과를 계산합니다.목욕: 진행도를 받아 샤워기 해금 여부를 판단하는 로직을 담당합니다.&lt;/li&gt;
&lt;li&gt;요리: 사용자가 투입한 재료 조합을 레시피 테이블과 비교해 결과와 기분 변화를 결정합니다.&lt;/li&gt;
&lt;li&gt;게임의 상태를 저장하고, 프론트엔드에서 필요한 정보를 API로 제공하는 백엔드 역할입니다. 각 모듈에서 해당 코드가 맡은 역할은 다음과 같습니다&lt;/li&gt;
&lt;li&gt;HTML&lt;/li&gt;
&lt;li&gt;게임 화면의 구조를 정의하는 프론트엔드 레이아웃입니다. 집&amp;middot;산책&amp;middot;요리&amp;middot;목욕을 각각 하나의 section으로 구성해 한 페이지 안에 배치하고, JavaScript가 필요한 화면만 전환하도록 설계했습니다. HUD, 대사창, 선택 버튼, 진행 바 등 주요 UI 요소를 미리 배치하며, 이미지 리소스를 불러오는 경로도 함께 정의합니다.&lt;/li&gt;
&lt;li&gt;Javascript산책: 일정 시간마다 조우 요청 + 선택 UI 표시 및 결과 메시지&amp;middot;상태 갱신을 처리합니다.요리: 재료 사용량을 서버에 전달하고, 결과에 맞는 반응 연출을 출력합니다.&lt;/li&gt;
&lt;li&gt;목욕: 포인터 이동에 따라 진행도를 증가시키고, 70% 이상일 경우 샤워 모드로 전환합니다.&lt;/li&gt;
&lt;li&gt;서버 API를 호출해 상태를 받아오고, 이를 즉시 화면에 반영하는 역할을 합니다. 화면 전환 관리와 대사 출력 로직을 담당하며, 각 기능별 동작 흐름을 제어합니다.&lt;/li&gt;
&lt;li&gt;CSS&lt;/li&gt;
&lt;li&gt;전체를 풀스크린으로 고정하고 각 장면들을 absolute로 겹쳐 올린 다음 필요한 장면들만 보이게 합니다. HUD는 반투명 패널을 사용해 다른 화면을 완전히 가리지 않게 만들었습니다. 또한 캐릭터의 흔들림 애니메이션, 목욕 커서 변경 등 시각적인 효과를 담당하는 파트입니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;후기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 전반을 작성할 때 동일한 포켓몬 소재+웹게임으로 제작된 POKEROGUE의 코드(&lt;a href=&quot;https://github.com/pagefaultgames/pokerogue&quot;&gt;https://github.com/pagefaultgames/pokerogue&lt;/a&gt;, 공식 깃허브)를 참조했습니다. 이미지는 공식 이미지/&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;javascripts 코드가 상당히 긴데, 만드는 중간에 개별 기능들을 모듈화하는게 훨씬 편했을 거라는 생각이 들어 아쉬움이 남습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 넣고 싶은 기능이 많았지만 자꾸만 오류가 나 삭제하게 된 기능들이 다수 있었습니다. 알고리즘에 대한 공부와 게임 엔진을 사용하는 법을 공부해서 다음에는 더 퀄리티 높은 게임을 만들어보고 싶습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. py&lt;/p&gt;
&lt;pre id=&quot;code_1770799914204&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from flask import Flask, render_template, jsonify, request, session
import random

app = Flask(__name__)
app.secret_key = &quot;dev-secret-change-me&quot;

POKEMON_DB = [
    {&quot;id&quot;: &quot;mankey&quot;, &quot;name&quot;: &quot;망키&quot;, &quot;temper&quot;: &quot;aggressive&quot;, &quot;loot&quot;: {&quot;berries&quot;: (0, 1), &quot;spices&quot;: (1, 2)}, &quot;weight&quot;: 12},
    {&quot;id&quot;: &quot;ekans&quot;,  &quot;name&quot;: &quot;아보&quot;, &quot;temper&quot;: &quot;aggressive&quot;, &quot;loot&quot;: {&quot;berries&quot;: (0, 1), &quot;spices&quot;: (1, 1)}, &quot;weight&quot;: 10},
    {&quot;id&quot;: &quot;zubat&quot;,  &quot;name&quot;: &quot;주뱃&quot;, &quot;temper&quot;: &quot;aggressive&quot;, &quot;loot&quot;: {&quot;berries&quot;: (0, 1), &quot;spices&quot;: (1, 1)}, &quot;weight&quot;: 8},

    {&quot;id&quot;: &quot;pidgey&quot;, &quot;name&quot;: &quot;구구&quot;, &quot;temper&quot;: &quot;neutral&quot;, &quot;loot&quot;: {&quot;berries&quot;: (1, 2), &quot;spices&quot;: (0, 1)}, &quot;weight&quot;: 14},
    {&quot;id&quot;: &quot;oddish&quot;, &quot;name&quot;: &quot;뚜벅쵸&quot;, &quot;temper&quot;: &quot;neutral&quot;, &quot;loot&quot;: {&quot;berries&quot;: (1, 1), &quot;spices&quot;: (0, 2)}, &quot;weight&quot;: 10},
    {&quot;id&quot;: &quot;sandshrew&quot;, &quot;name&quot;: &quot;모래두지&quot;, &quot;temper&quot;: &quot;neutral&quot;, &quot;loot&quot;: {&quot;berries&quot;: (1, 2), &quot;spices&quot;: (0, 1)}, &quot;weight&quot;: 8},

    {&quot;id&quot;: &quot;togepi&quot;, &quot;name&quot;: &quot;토게피&quot;, &quot;temper&quot;: &quot;gentle&quot;, &quot;loot&quot;: {&quot;berries&quot;: (1, 2)}, &quot;weight&quot;: 10},
    {&quot;id&quot;: &quot;chansey&quot;,&quot;name&quot;: &quot;럭키&quot;, &quot;temper&quot;: &quot;gentle&quot;, &quot;loot&quot;: {&quot;berries&quot;: (2, 3)}, &quot;weight&quot;: 6},
    {&quot;id&quot;: &quot;eevee&quot;,  &quot;name&quot;: &quot;이브이&quot;, &quot;temper&quot;: &quot;gentle&quot;, &quot;loot&quot;: {&quot;berries&quot;: (1, 3)}, &quot;weight&quot;: 9},
]

RECIPE_TABLE = {
    (1, 0): {&quot;name&quot;: &quot;달콤한 수프&quot;, &quot;pref&quot;: +1, &quot;message&quot;: &quot;평범한 조합이다. 마릴리가 즐거워하며 먹었다.&quot;},
    (0, 1): {&quot;name&quot;: &quot;짠맛 수프&quot;, &quot;pref&quot;: 0,  &quot;message&quot;: &quot;짠 맛이 느껴진다... 마릴리의 취향은 아닌 것 같다.&quot;},
    (1, 1): {&quot;name&quot;: &quot;이상적인 수프&quot;, &quot;pref&quot;: +2, &quot;message&quot;: &quot;성공적이다! 마릴리가 매우 기쁜 것 같다.&quot;},
    (2, 1): {&quot;name&quot;: &quot;진한 수프&quot;, &quot;pref&quot;: +3, &quot;message&quot;: &quot;진한 맛이 느껴진다. 마릴리는 기쁘게 먹었다.&quot;},
}

DEFAULT_STATE = {
    &quot;hp&quot;: 5,
    &quot;berries&quot;: 0,
    &quot;spices&quot;: 0,
    &quot;mood&quot;: &quot;idle&quot;,
    &quot;status&quot;: &quot;home&quot;,
    &quot;walk_turn&quot;: 0
}

def clamp_int(x, lo, hi):
    try:
        x = int(x)
    except:
        x = lo
    return max(lo, min(hi, x))

def pick_pokemon():
    weights = [p[&quot;weight&quot;] for p in POKEMON_DB]
    return random.choices(POKEMON_DB, weights=weights, k=1)[0]

def roll_loot(pokemon):
    loot = {}
    for k, (a, b) in pokemon[&quot;loot&quot;].items():
        loot[k] = random.randint(a, b)
    return loot

def get_state():
    if &quot;state&quot; not in session:
        session[&quot;state&quot;] = DEFAULT_STATE.copy()
    return session[&quot;state&quot;]

def save_state(state):
    session[&quot;state&quot;] = state

@app.route('/')
def home():
    return render_template('index.html')

@app.get('/api/status')
def get_status():
    return jsonify(get_state())

@app.post('/api/reset')
def api_reset():
    session[&quot;state&quot;] = DEFAULT_STATE.copy()
    return jsonify(session[&quot;state&quot;])

@app.post('/api/walk/encounter')
def walk_event():
    state = get_state()

    if state[&quot;hp&quot;] &amp;lt;= 0:
        return jsonify({&quot;type&quot;: &quot;forced_home&quot;, &quot;reason&quot;: &quot;hp_zero&quot;, &quot;state&quot;: state})

    state[&quot;walk_turn&quot;] = int(state.get(&quot;walk_turn&quot;, 0)) + 1
    turn = state[&quot;walk_turn&quot;]

    chance = 0.0
    if turn &amp;gt;= 4:
        chance = 0.10 * (turn - 3)    
        chance = min(chance, 1.0)

    if random.random() &amp;lt; chance:
        gained = random.randint(2,4)
        state[&quot;spices&quot;] += gained
        msg = f&quot;강을 발견했다! 조미료를 {gained}만큼 얻었다.&quot;

        state[&quot;status&quot;] = &quot;home&quot;
        save_state(state)
        return jsonify({&quot;type&quot;: &quot;success_spot&quot;, &quot;spot&quot;: &quot;river&quot;, &quot;message&quot;: msg, &quot;state&quot;: state})

    pokemon = pick_pokemon()
    save_state(state)  
    return jsonify({
        &quot;type&quot;: &quot;encounter&quot;,
        &quot;pokemon&quot;: {&quot;id&quot;: pokemon[&quot;id&quot;], &quot;name&quot;: pokemon[&quot;name&quot;], &quot;temper&quot;: pokemon[&quot;temper&quot;]},
        &quot;state&quot;: state
    })

@app.post(&quot;/api/walk/start&quot;)
def walk_start():
    state = get_state()
    state[&quot;walk_turn&quot;] = 0
    save_state(state)
    return jsonify({&quot;ok&quot;: True, &quot;state&quot;: state})

@app.post(&quot;/api/walk/resolve&quot;)
def walk_resolve():
    state = get_state()
    if state[&quot;hp&quot;] &amp;lt;= 0:
        state[&quot;status&quot;] = &quot;home&quot;
        save_state(state)
        return jsonify({&quot;ended&quot;: True, &quot;message&quot;: &quot;집에 갈 시간이다&quot;, &quot;state&quot;: state})

    payload = request.get_json(force=True)
    pokemon_id = payload.get(&quot;pokemon_id&quot;)
    action = payload.get(&quot;action&quot;)

    pokemon = next((p for p in POKEMON_DB if p[&quot;id&quot;] == pokemon_id), None)
    if not pokemon:
        return jsonify({&quot;error&quot;: &quot;invalid_pokemon&quot;}), 400

    temper = pokemon[&quot;temper&quot;]
    hp_delta = 0
    loot = {&quot;berries&quot;: 0, &quot;spices&quot;: 0}
    message = &quot;&quot;

    def take_damage():
        nonlocal hp_delta
        hp_delta -= 1

    def gain_loot():
        rolled = roll_loot(pokemon)
        for k, v in rolled.items():
            loot[k] += v

    if action == &quot;attack&quot;:
        gain_loot()
        message = f&quot;{pokemon['name']}에게서 재료를 얻었다!&quot; if temper != &quot;gentle&quot; else f&quot;{pokemon['name']}에게서 재료를 얻었다. 왜인지 죄책감이 든다...&quot;
    elif action == &quot;watch&quot;:
        if temper in (&quot;aggressive&quot;, &quot;neutral&quot;):
            if random.random() &amp;lt; 0.5:
                take_damage()
                message = f&quot;지켜보다가 {pokemon['name']}에게 공격받았다!&quot;
            else:
                if temper == &quot;neutral&quot;:
                    gain_loot()
                    message = f&quot;{pokemon['name']}이(가) 다가와 재료를 건네줬다!&quot;
                else:
                    message = &quot;아무 일도 일어나지 않았다.&quot;
        else:
            if random.random() &amp;lt; 0.5:
                gain_loot()
                message = f&quot;{pokemon['name']}이(가) 다가와 나무열매를 건네줬다!&quot;
            else:
                message = &quot;아무 일도 일어나지 않았다.&quot;
    elif action == &quot;run&quot;:
        if temper == &quot;aggressive&quot;:
            if random.random() &amp;lt; 0.25:
                take_damage()
                message = f&quot;도망치다 {pokemon['name']}에게 공격받았다!&quot;
            else:
                message = &quot;무사히 도망쳤다.&quot;
        else:
            message = &quot;도망쳤다. 아무 일도 일어나지 않았다.&quot;
    else:
        return jsonify({&quot;error&quot;: &quot;invalid_action&quot;}), 400

    state[&quot;hp&quot;] = max(0, state[&quot;hp&quot;] + hp_delta)
    state[&quot;berries&quot;] += loot[&quot;berries&quot;]
    state[&quot;spices&quot;] += loot[&quot;spices&quot;]

    ended = False
    if state[&quot;hp&quot;] &amp;lt;= 0:
        ended = True
        state[&quot;status&quot;] = &quot;home&quot;
        message += &quot; 마릴리가 많이 피곤한 것 같다...&quot;

    save_state(state)
    return jsonify({&quot;ended&quot;: ended, &quot;hp_delta&quot;: hp_delta, &quot;loot&quot;: loot, &quot;message&quot;: message, &quot;state&quot;: state})

@app.get(&quot;/api/cook/can_enter&quot;)
def cook_can_enter():
    state = get_state()
    can = (state[&quot;berries&quot;] &amp;gt; 0 or state[&quot;spices&quot;] &amp;gt; 0)
    return jsonify({&quot;can_enter&quot;: can, &quot;state&quot;: state})

@app.post(&quot;/api/cook/finish&quot;)
def cook_finish():
    state = get_state()
    payload = request.get_json(force=True)

    berries_used = clamp_int(payload.get(&quot;berries_used&quot;, 0), 0, state[&quot;berries&quot;])
    spices_used = clamp_int(payload.get(&quot;spices_used&quot;, 0), 0, state[&quot;spices&quot;])

    if berries_used == 0 and spices_used == 0:
        return jsonify({&quot;ok&quot;: False, &quot;message&quot;: &quot;재료가 없습니다.&quot;, &quot;state&quot;: state})

    state[&quot;berries&quot;] -= berries_used
    state[&quot;spices&quot;] -= spices_used

    recipe = RECIPE_TABLE.get((berries_used, spices_used)) or {&quot;name&quot;: &quot;이상한 요리&quot;, &quot;pref&quot;: 0, &quot;message&quot;: &quot;마릴리가 애매한 표정으로 먹었다.&quot;}

    if recipe[&quot;pref&quot;] &amp;gt;= 2:
        state[&quot;mood&quot;] = &quot;happy&quot;
    elif recipe[&quot;pref&quot;] &amp;lt;= -1:
        state[&quot;mood&quot;] = &quot;sad&quot;
    else:
        state[&quot;mood&quot;] = &quot;idle&quot;

    save_state(state)
    return jsonify({&quot;ok&quot;: True, &quot;recipe&quot;: recipe, &quot;used&quot;: {&quot;berries&quot;: berries_used, &quot;spices&quot;: spices_used}, &quot;state&quot;: state})

@app.post(&quot;/api/bath/progress&quot;)
def bath_progress():
    state = get_state()
    payload = request.get_json(force=True)
    percent = int(payload.get(&quot;percent&quot;, 0))
    percent = max(0, min(100, percent))
    return jsonify({&quot;percent&quot;: percent, &quot;unlock_shower&quot;: percent &amp;gt;= 70, &quot;state&quot;: state})

if __name__ == &quot;__main__&quot;:
    app.run(debug=True)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. html&lt;/p&gt;
&lt;pre id=&quot;code_1770799931851&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
  &amp;lt;title&amp;gt;project 1&amp;lt;/title&amp;gt;
  &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1, user-scalable=no&quot; /&amp;gt;
  &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;{{ url_for('static', filename='css/style.css') }}&quot;&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;audio id=&quot;bgmPlayer&quot; loop&amp;gt;
    &amp;lt;source id=&quot;bgmSource&quot; src=&quot;&quot; type=&quot;audio/mpeg&quot;&amp;gt;
  &amp;lt;/audio&amp;gt;

  &amp;lt;audio id=&quot;marillSound&quot;&amp;gt;
    &amp;lt;source src=&quot;{{ url_for('static', filename='sounds/marill_cry.mp3') }}&quot; type=&quot;audio/mpeg&quot;&amp;gt;
  &amp;lt;/audio&amp;gt;

  &amp;lt;div id=&quot;hud&quot;&amp;gt;
    &amp;lt;div id=&quot;hud-hp&quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;div id=&quot;hud-items&quot;&amp;gt;
      &amp;lt;span id=&quot;hud-berries&quot;&amp;gt;  0&amp;lt;/span&amp;gt;
      &amp;lt;span id=&quot;hud-spices&quot;&amp;gt;  0&amp;lt;/span&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;

&amp;lt;div id=&quot;dialogue-layer&quot; class=&quot;ui-layer&quot; style=&quot;display:none;&quot;&amp;gt;
  &amp;lt;div id=&quot;dialogue-box&quot;&amp;gt;
    &amp;lt;div id=&quot;dialogue-name&quot; style=&quot;display:none;&quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;div id=&quot;dialogue-text&quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;div id=&quot;dialogue-progress&quot; class=&quot;dialogue-progress&quot; style=&quot;display:none;&quot;&amp;gt;
      &amp;lt;div id=&quot;dialogue-progress-fill&quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div id=&quot;dialogue-hint&quot;&amp;gt;▶&amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;


  &amp;lt;div id=&quot;game-viewport&quot;&amp;gt;
    &amp;lt;section id=&quot;screen-home&quot; class=&quot;screen&quot; style=&quot;display:block;&quot;&amp;gt;
      &amp;lt;img src=&quot;{{ url_for('static', filename='images/bg_home.png') }}&quot; class=&quot;bg&quot;&amp;gt;

      &amp;lt;div id=&quot;wandering-marill-container&quot;&amp;gt;
        &amp;lt;img src=&quot;{{ url_for('static', filename='images/marill_idle.png') }}&quot; id=&quot;wandering-marill&quot; class=&quot;character&quot;&amp;gt;
      &amp;lt;/div&amp;gt;

      &amp;lt;div id=&quot;smartphone-container&quot;&amp;gt;
        &amp;lt;img src=&quot;{{ url_for('static', filename='images/ui/smartphone_frame.png') }}&quot; id=&quot;phone-frame-img&quot;&amp;gt;
        &amp;lt;div class=&quot;app-screen-overlay&quot;&amp;gt;
          &amp;lt;div class=&quot;app-grid&quot;&amp;gt;
            &amp;lt;button class=&quot;app-btn&quot; data-event=&quot;walk&quot;&amp;gt;
              &amp;lt;img src=&quot;{{ url_for('static', filename='images/ui/icon_walk.png') }}&quot; alt=&quot;산책&quot;&amp;gt;
              &amp;lt;span&amp;gt;산책&amp;lt;/span&amp;gt;
            &amp;lt;/button&amp;gt;
            &amp;lt;button class=&quot;app-btn&quot; data-event=&quot;cook&quot;&amp;gt;
              &amp;lt;img src=&quot;{{ url_for('static', filename='images/ui/icon_cook.png') }}&quot; alt=&quot;요리&quot;&amp;gt;
              &amp;lt;span&amp;gt;요리&amp;lt;/span&amp;gt;
            &amp;lt;/button&amp;gt;
            &amp;lt;button class=&quot;app-btn&quot; data-event=&quot;bath&quot;&amp;gt;
              &amp;lt;img src=&quot;{{ url_for('static', filename='images/ui/icon_bath.png') }}&quot; alt=&quot;목욕&quot;&amp;gt;
              &amp;lt;span&amp;gt;목욕&amp;lt;/span&amp;gt;
            &amp;lt;/button&amp;gt;
          &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/section&amp;gt;

    &amp;lt;section id=&quot;screen-walk&quot; class=&quot;screen&quot; style=&quot;display:none;&quot;&amp;gt;
      &amp;lt;img src=&quot;{{ url_for('static', filename='images/bg_forest.png') }}&quot; id=&quot;walk-bg&quot; class=&quot;bg&quot;&amp;gt;
      &amp;lt;img id = &quot;walk-marill&quot; src=&quot;{{ url_for('static', filename='images/marill_back.png') }}&quot; class=&quot;character walk-ani&quot;&amp;gt;
      &amp;lt;img id=&quot;enemy-img&quot; class=&quot;enemy-img&quot; style=&quot;display:none;&quot; /&amp;gt;

      &amp;lt;div id=&quot;walk-info&quot; class=&quot;toast&quot;&amp;gt;걷는 중&amp;hellip;&amp;lt;/div&amp;gt;
      &amp;lt;button id = &quot;walk-exit&quot; class=&quot;walk-exit&quot;&amp;gt;나가기&amp;lt;/button&amp;gt;

      &amp;lt;div id=&quot;encounter-ui&quot; class=&quot;modal&quot; style=&quot;display:none;&quot;&amp;gt;
        &amp;lt;p id=&quot;encounter-text&quot;&amp;gt;&amp;lt;/p&amp;gt;
        &amp;lt;div class=&quot;row&quot;&amp;gt;
          &amp;lt;button id=&quot;btn-attack&quot;&amp;gt;선공&amp;lt;/button&amp;gt;
          &amp;lt;button id=&quot;btn-watch&quot;&amp;gt;지켜보기&amp;lt;/button&amp;gt;
          &amp;lt;button id=&quot;btn-run&quot;&amp;gt;도망&amp;lt;/button&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/section&amp;gt;


&amp;lt;section id=&quot;screen-cook&quot; class=&quot;screen&quot; style=&quot;display:none;&quot;&amp;gt;
  &amp;lt;img src=&quot;{{ url_for('static', filename='images/bg_home.png') }}&quot; class=&quot;bg&quot;&amp;gt;

  &amp;lt;div id=&quot;cook-select&quot; class=&quot;panel&quot;&amp;gt;
    &amp;lt;h3&amp;gt;요리&amp;lt;/h3&amp;gt;

    &amp;lt;div class=&quot;row&quot; style=&quot;align-items:center;&quot;&amp;gt;
      &amp;lt;label&amp;gt;  &amp;lt;input id=&quot;cook-berries&quot; type=&quot;number&quot; min=&quot;0&quot; value=&quot;1&quot; /&amp;gt;&amp;lt;/label&amp;gt;
      &amp;lt;label&amp;gt;  &amp;lt;input id=&quot;cook-spices&quot; type=&quot;number&quot; min=&quot;0&quot; value=&quot;0&quot; /&amp;gt;&amp;lt;/label&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;div class=&quot;row&quot;&amp;gt;
      &amp;lt;button id=&quot;cook-confirm&quot;&amp;gt;시작&amp;lt;/button&amp;gt;
      &amp;lt;button id=&quot;cook-recipe&quot;&amp;gt;레시피 확인&amp;lt;/button&amp;gt;
      &amp;lt;button id=&quot;cook-exit&quot;&amp;gt;나가기&amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;div class=&quot;hint&quot; id=&quot;cook-select-hint&quot;&amp;gt;재료를 고르고 '확인'을 눌러야 요리를 시작합니다&amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;

  &amp;lt;div id=&quot;cook-play&quot; class=&quot;cook-stage&quot; style=&quot;display:none;&quot;&amp;gt;
    &amp;lt;img id=&quot;cook-stage-img&quot; class=&quot;cook-stage-img&quot;
         src=&quot;{{ url_for('static', filename='images/cooking.png') }}&quot; alt=&quot;cooking&quot;&amp;gt;

    &amp;lt;div id=&quot;gauge&quot; class=&quot;cook-gauge&quot;&amp;gt;
      &amp;lt;div id=&quot;gauge-fill&quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;div id=&quot;cook-phase&quot; class=&quot;cook-phase&quot;&amp;gt;불 지피기&amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;hint&quot; id=&quot;cook-hint&quot;&amp;gt;화면을 누르면 게이지가 올라갑니다&amp;lt;/div&amp;gt;

    &amp;lt;div class=&quot;row cook-bottom&quot;&amp;gt;
      &amp;lt;button id=&quot;cook-play-exit&quot;&amp;gt;나가기&amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;

  &amp;lt;div id=&quot;cook-result&quot; class=&quot;cook-stage&quot; style=&quot;display:none;&quot;&amp;gt;
    &amp;lt;img id=&quot;cook-finish-img&quot; class=&quot;cook-stage-img&quot;
         src=&quot;{{ url_for('static', filename='images/cooking_finish.png') }}&quot; alt=&quot;finish&quot;&amp;gt;

    &amp;lt;img id=&quot;cook-reaction-img&quot; class=&quot;cook-reaction-img&quot; style=&quot;display:none;&quot; alt=&quot;reaction&quot;&amp;gt;

    &amp;lt;div id=&quot;cook-result-text&quot; class=&quot;cook-result-text&quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;div class=&quot;row cook-bottom&quot;&amp;gt;
      &amp;lt;button id=&quot;cook-result-exit&quot;&amp;gt;나가기&amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/section&amp;gt;




  &amp;lt;section id=&quot;screen-bath&quot; class=&quot;screen&quot; style=&quot;display:none;&quot;&amp;gt;
  &amp;lt;img src=&quot;{{ url_for('static', filename='images/bg_bathroom.png') }}&quot; class=&quot;bg&quot;&amp;gt;

  &amp;lt;div id=&quot;bubble-layer&quot;&amp;gt;
    &amp;lt;div class=&quot;bubble&quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;bubble&quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;bubble&quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;bubble&quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;bubble&quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;bubble&quot;&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;

  &amp;lt;div class=&quot;bath-center&quot;&amp;gt;
    &amp;lt;img id=&quot;bath-marill&quot; class=&quot;bath-marill&quot;
         src=&quot;{{ url_for('static', filename='images/marill_idle.png') }}&quot;&amp;gt;

    &amp;lt;div id=&quot;bath-progress&quot; class=&quot;bath-progress&quot;&amp;gt;
      &amp;lt;div id=&quot;bath-fill&quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;

  &amp;lt;div class=&quot;panel bath-panel&quot;&amp;gt;
    &amp;lt;h3&amp;gt;목욕&amp;lt;/h3&amp;gt;
    &amp;lt;div class=&quot;hint&quot;&amp;gt;화면을 문지르면 마릴리를 씻길 수 있습니다&amp;lt;/div&amp;gt;

    &amp;lt;button id=&quot;shower-icon&quot; style=&quot;display:none;&quot;&amp;gt;샤워기&amp;lt;/button&amp;gt;
    &amp;lt;div class=&quot;row&quot;&amp;gt;
      &amp;lt;button id=&quot;bath-exit&quot;&amp;gt;나가기&amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/section&amp;gt;


  &amp;lt;script src=&quot;{{ url_for('static', filename='js/main.js') }}&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. js&lt;/p&gt;
&lt;pre id=&quot;code_1770799945645&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;async function apiGet(url) {
  const r = await fetch(url, { credentials: &quot;same-origin&quot; });
  return r.json();
}
async function apiPost(url, bodyObj = {}) {
  const r = await fetch(url, {
    method: &quot;POST&quot;,
    headers: { &quot;Content-Type&quot;: &quot;application/json&quot; },
    credentials: &quot;same-origin&quot;,
    body: JSON.stringify(bodyObj)
  });
  return r.json();
}

function renderHUD(state) {
  const hpWrap = document.getElementById(&quot;hud-hp&quot;);
  if (!hpWrap) return;

  const hp = Number(state?.hp ?? 0);
  hpWrap.innerHTML = &quot;&quot;;
  for (let i = 0; i &amp;lt; 5; i++) {
    const span = document.createElement(&quot;span&quot;);
    span.className = &quot;heart&quot; + (i &amp;lt; hp ? &quot; on&quot; : &quot; off&quot;);
    span.textContent = &quot;&amp;hearts;&quot;;
    hpWrap.appendChild(span);
  }

  const b = document.getElementById(&quot;hud-berries&quot;);
  const s = document.getElementById(&quot;hud-spices&quot;);
  if (b) b.textContent = `  ${Number(state?.berries ?? 0)}`;
  if (s) s.textContent = `  ${Number(state?.spices ?? 0)}`;
}

let currentScreen = &quot;home&quot;;

function showScreen(name) {
  document.querySelectorAll(&quot;.screen&quot;).forEach(s =&amp;gt; (s.style.display = &quot;none&quot;));
  const target = document.getElementById(`screen-${name}`);
  if (target) target.style.display = &quot;block&quot;;
  currentScreen = name;

  if (name === &quot;home&quot;) startWanderingMarill();
  else stopWandering();
}


let wanderTimer = null;
const wander = { x: 50, y: 60, vx: 0, vy: 0 };

function clamp(v, lo, hi) {
  return Math.max(lo, Math.min(hi, v));
}

function startWanderingMarill() {
  const c = document.getElementById(&quot;wandering-marill-container&quot;);
  const img = document.getElementById(&quot;wandering-marill&quot;);
  if (!c || !img) return;

  stopWandering();

  wander.x = parseFloat(c.style.left || &quot;50&quot;);
  wander.y = parseFloat(c.style.top || &quot;60&quot;);
  wander.vx = 0;
  wander.vy = 0;

  wanderTimer = setInterval(() =&amp;gt; stepWander(c, img), 120);
}

function stopWandering() {
  if (wanderTimer) clearInterval(wanderTimer);
  wanderTimer = null;
}

function stepWander(container, img) {
  const minX = 10, maxX = 80;
  const minY = 40, maxY = 75;

  const ax = (Math.random() - 0.5) * 0.67;
  const ay = (Math.random() - 0.5) * 0.5;

  wander.vx = (wander.vx + ax) * 0.82;
  wander.vy = (wander.vy + ay) * 0.82;

  wander.vx = clamp(wander.vx, -0.9, 0.9);
  wander.vy = clamp(wander.vy, -0.6, 0.6);

  const prevX = wander.x;
  wander.x += wander.vx;
  wander.y += wander.vy;

  if (wander.x &amp;lt; minX) { wander.x = minX; wander.vx *= -0.8; }
  if (wander.x &amp;gt; maxX) { wander.x = maxX; wander.vx *= -0.8; }
  if (wander.y &amp;lt; minY) { wander.y = minY; wander.vy *= -0.8; }
  if (wander.y &amp;gt; maxY) { wander.y = maxY; wander.vy *= -0.8; }

  if (wander.x &amp;lt; prevX) img.classList.add(&quot;facing-left&quot;);
  else img.classList.remove(&quot;facing-left&quot;);

  container.style.left = `${wander.x}%`;
  container.style.top = `${wander.y}%`;
}

const dialogue = {
  currentFull: &quot;&quot;,
  active: false,
  queue: [],
  typing: false,
  typeTimer: null,
  resolveWait: null,

  elLayer: null,
  elBox: null,
  elName: null,
  elText: null,
  elHint: null,

  init() {
    this.elLayer = document.getElementById(&quot;dialogue-layer&quot;);
    this.elBox   = document.getElementById(&quot;dialogue-box&quot;);
    this.elName  = document.getElementById(&quot;dialogue-name&quot;);
    this.elText  = document.getElementById(&quot;dialogue-text&quot;);
    this.elHint  = document.getElementById(&quot;dialogue-hint&quot;);

    if (!this.elLayer || !this.elBox || !this.elText || !this.elHint || !this.elName) {
      console.warn(&quot;Dialogue DOM missing&quot;);
      return;
    }

    this.elLayer.style.display = &quot;none&quot;;
    this.elLayer.style.pointerEvents = &quot;none&quot;;
    this.elBox.addEventListener(&quot;click&quot;, () =&amp;gt; this.advance());

    window.addEventListener(&quot;keydown&quot;, (e) =&amp;gt; {
      if (!this.active) return;
      if (e.key === &quot; &quot; || e.key === &quot;Enter&quot;) {
        e.preventDefault();
        this.advance();
      }
    });
  },

  async show(lines, opts = {}) {
    if (!this.elLayer) this.init();
    if (!this.elLayer) return; 

    const arr = Array.isArray(lines) ? lines : [{ text: String(lines) }];
    for (const it of arr) {
      if (typeof it === &quot;string&quot;) this.queue.push({ text: it, name: &quot;&quot; });
      else this.queue.push({ text: String(it.text ?? &quot;&quot;), name: it.name ? String(it.name) : &quot;&quot; });
    }

    if (this.active) return;

    this.active = true;
    this.elLayer.style.display = &quot;block&quot;;
    this.elLayer.style.pointerEvents = &quot;none&quot;;
    this.elBox.style.pointerEvents = &quot;auto&quot;;

    while (this.queue.length &amp;gt; 0) {
      const item = this.queue.shift();
      await this.playOne(item, opts);
    }

    this.elLayer.style.display = &quot;none&quot;;
    this.elLayer.style.pointerEvents = &quot;none&quot;;
    this.active = false;
  },

  playOne(item, opts) {
    const speed = Number.isFinite(opts.speed) ? opts.speed : 22;

    if (item.name) {
      this.elName.style.display = &quot;block&quot;;
      this.elName.textContent = item.name;
    } else {
      this.elName.style.display = &quot;none&quot;;
      this.elName.textContent = &quot;&quot;;
    }

    this.elText.textContent = &quot;&quot;;
    this.elHint.style.display = &quot;none&quot;;
    this.typing = true;

    const full = item.text;
    this.currentFull = full;
    let i = 0;

    clearInterval(this.typeTimer);
    this.typeTimer = setInterval(() =&amp;gt; {
      i++;
      this.elText.textContent = full.slice(0, i);
      if (i &amp;gt;= full.length) {
        clearInterval(this.typeTimer);
        this.typeTimer = null;
        this.typing = false;
        this.elHint.style.display = &quot;block&quot;;
      }
    }, speed);

    return new Promise((resolve) =&amp;gt; {
      this.resolveWait = resolve;
    });
  },

  advance() {
    if (!this.active) return;

    if (this.typing) {
      clearInterval(this.typeTimer);
      this.typeTimer = null;
      this.typing = false;
      this.elText.textContent = this.currentFull;
      this.elHint.style.display = &quot;block&quot;;
      return;
    }

    if (this.resolveWait &amp;amp;&amp;amp; !this.typing) {
      const r = this.resolveWait;
      this.resolveWait = null;
      r();
    }
  }
};

//산책 모듈


const walk = {
  timer: null,
  pending: null,
  exitBound: false,
  _busy: false,

  async start() {
    this.stopTimerOnly();
    this.pending = null;

    const bg = document.getElementById(&quot;walk-bg&quot;);
    const mar = document.getElementById(&quot;walk-marill&quot;);
    if (bg) bg.src = &quot;/static/images/bg_forest.png&quot;;
    if (mar) {
      mar.src = &quot;/static/images/marill_back.png&quot;;
      mar.classList.add(&quot;walk-ani&quot;);
      mar.style.left = &quot;&quot;;
      mar.style.bottom = &quot;&quot;;
      mar.style.transform = &quot;&quot;;
    }

    const enc = document.getElementById(&quot;encounter-ui&quot;);
    const enemy = document.getElementById(&quot;enemy-img&quot;);
    if (enc) enc.style.display = &quot;none&quot;;
    if (enemy) enemy.style.display = &quot;none&quot;;

    if (!this.exitBound) {
      this.exitBound = true;
      const exitBtn = document.getElementById(&quot;walk-exit&quot;);
      if (exitBtn) {
        exitBtn.addEventListener(&quot;click&quot;, () =&amp;gt; {
          this.stop();
          showScreen(&quot;home&quot;);
        });
      }
    }

    this.timer = setInterval(async () =&amp;gt; {
      if (this._busy) return;
      this._busy = true;

      let res = null;
      try {
        res = await apiPost(&quot;/api/walk/encounter&quot;, {});
      } catch (e) {
        console.error(&quot;walk encounter failed&quot;, e);
      } finally {
        this._busy = false;
      }
      if (!res) return;

      if (res.type === &quot;success_spot&quot; &amp;amp;&amp;amp; res.spot === &quot;river&quot;) {
        if (bg) bg.src = &quot;/static/images/bg_river.png&quot;;
        if (mar) {
          mar.src = &quot;/static/images/marill_happy.png&quot;;
          mar.classList.remove(&quot;walk-ani&quot;);
          mar.style.left = &quot;50%&quot;;
          mar.style.bottom = &quot;22%&quot;;
          mar.style.transform = &quot;translateX(-50%)&quot;;
        }

        renderHUD(res.state);
        await dialogue.show(res.message || &quot;&quot;);

        this.stop();
        showScreen(&quot;home&quot;);
        return;
      }

      if (res.type === &quot;encounter&quot;) {
        this.pending = {
          pokemon_id: res.pokemon.id,
          pokemon_name: res.pokemon.name,
          temper: res.pokemon.temper
        };
        this.showEncounter(res.pokemon);
        this.stopTimerOnly();
      }
    }, 3000);
  },

  stopTimerOnly() {
    if (this.timer) clearInterval(this.timer);
    this.timer = null;
  },

  stop() {
    this.stopTimerOnly();
    this.pending = null;
    const enc = document.getElementById(&quot;encounter-ui&quot;);
    const enemy = document.getElementById(&quot;enemy-img&quot;);
    if (enc) enc.style.display = &quot;none&quot;;
    if (enemy) enemy.style.display = &quot;none&quot;;
  },

  showEncounter(p) {
    const map = { aggressive: &quot;호전적인&quot;, neutral: &quot;중립적인&quot;, gentle: &quot;온순한&quot; };
    const t = document.getElementById(&quot;encounter-text&quot;);
    if (t) t.textContent = `${map[p.temper]} ${p.name}이(가) 나타났다!`;

    const enemy = document.getElementById(&quot;enemy-img&quot;);
    if (enemy) {
      enemy.src = `/static/images/walk/p_${p.id}.png`;
      enemy.style.display = &quot;block&quot;;
    }

    const enc = document.getElementById(&quot;encounter-ui&quot;);
    if (enc) enc.style.display = &quot;block&quot;;
  },

  async choose(action) {
    if (!this.pending) return;

    let res;
    try {
      res = await apiPost(&quot;/api/walk/resolve&quot;, {
        pokemon_id: this.pending.pokemon_id,
        action
      });
    } catch (e) {
      console.error(&quot;walk resolve failed&quot;, e);
      this.pending = null;
      this.start();
      return;
    }

    if (res?.error) {
      console.warn(res);
      this.pending = null;
      this.start();
      return;
    }

    const enc = document.getElementById(&quot;encounter-ui&quot;);
    const enemy = document.getElementById(&quot;enemy-img&quot;);
    if (enc) enc.style.display = &quot;none&quot;;
    if (enemy) enemy.style.display = &quot;none&quot;;

    renderHUD(res.state);
    await dialogue.show(res.message || &quot;&quot;);

    this.pending = null;

    if (res.ended) {
      this.stop();
      showScreen(&quot;home&quot;);
      return;
    }

    this.start();
  }
};

//요리 모듈

const cook = {
  gauge: 0,
  onTap: null,
  _finishing: false,
  berriesUsed: 0,
  spicesUsed: 0,
  els: null,

  bindEls() {
    if (this.els) return;
    this.els = {
      select: document.getElementById(&quot;cook-select&quot;),
      play: document.getElementById(&quot;cook-play&quot;),
      result: document.getElementById(&quot;cook-result&quot;),

      bInp: document.getElementById(&quot;cook-berries&quot;),
      sInp: document.getElementById(&quot;cook-spices&quot;),

      btnConfirm: document.getElementById(&quot;cook-confirm&quot;),
      btnRecipe: document.getElementById(&quot;cook-recipe&quot;),
      btnExitSelect: document.getElementById(&quot;cook-exit&quot;),

      stageImg: document.getElementById(&quot;cook-stage-img&quot;),
      phase: document.getElementById(&quot;cook-phase&quot;),
      hint: document.getElementById(&quot;cook-hint&quot;),
      gaugeFill: document.getElementById(&quot;gauge-fill&quot;),

      btnExitPlay: document.getElementById(&quot;cook-play-exit&quot;),

      finishImg: document.getElementById(&quot;cook-finish-img&quot;),
      reactImg: document.getElementById(&quot;cook-reaction-img&quot;),
      resultText: document.getElementById(&quot;cook-result-text&quot;),
      btnResultExit: document.getElementById(&quot;cook-result-exit&quot;),
    };

    const must = [
      &quot;select&quot;,&quot;play&quot;,&quot;result&quot;,
      &quot;bInp&quot;,&quot;sInp&quot;,
      &quot;btnConfirm&quot;,&quot;btnRecipe&quot;,&quot;btnExitSelect&quot;,
      &quot;stageImg&quot;,&quot;phase&quot;,&quot;hint&quot;,&quot;gaugeFill&quot;,
      &quot;btnExitPlay&quot;,
      &quot;finishImg&quot;,&quot;reactImg&quot;,&quot;resultText&quot;,&quot;btnResultExit&quot;
    ];
    for (const k of must) {
      if (!this.els[k]) throw new Error(&quot;COOK DOM missing: &quot; + k);
    }

    this.els.btnConfirm.addEventListener(&quot;click&quot;, () =&amp;gt; this.confirmEnter());
    this.els.btnRecipe.addEventListener(&quot;click&quot;, () =&amp;gt; this.showRecipe());

    this.els.btnExitSelect.addEventListener(&quot;click&quot;, () =&amp;gt; this.exitToHome());
    this.els.btnExitPlay.addEventListener(&quot;click&quot;, () =&amp;gt; this.exitToHome());
    this.els.btnResultExit.addEventListener(&quot;click&quot;, () =&amp;gt; this.exitToHome());
  },

  showOnly(which) {
    this.els.select.style.display = (which === &quot;select&quot;) ? &quot;block&quot; : &quot;none&quot;;
    this.els.play.style.display   = (which === &quot;play&quot;)   ? &quot;flex&quot;  : &quot;none&quot;;
    this.els.result.style.display = (which === &quot;result&quot;) ? &quot;flex&quot;  : &quot;none&quot;;
  },

  async start() {
    this.bindEls();
    this.stop();

    const can = await apiGet(&quot;/api/cook/can_enter&quot;);
    renderHUD(can.state);

    if (!can.can_enter) {
      await dialogue.show(&quot;재료가 하나도 없으면 요리할 수 없습니다.&quot;);
      showScreen(&quot;home&quot;);
      return;
    }

    this.els.bInp.max = String(can.state.berries);
    this.els.sInp.max = String(can.state.spices);

    this.els.bInp.value = can.state.berries &amp;gt; 0 ? &quot;1&quot; : &quot;0&quot;;
    this.els.sInp.value = &quot;0&quot;;

    this.showOnly(&quot;select&quot;);
  },

  async showRecipe() {
    const text =
`레시피
 1  0 : 달콤한 수프
 0  1 : 짠맛 수프
 1  1 : 이상적인 수프
 2  1 : 진한 수프
그 외 조합 : 이상한 요리`;
    await dialogue.show(text);
  },

  confirmEnter() {
    const b = parseInt(this.els.bInp.value || &quot;0&quot;, 10) || 0;
    const s = parseInt(this.els.sInp.value || &quot;0&quot;, 10) || 0;

    if (b === 0 &amp;amp;&amp;amp; s === 0) {
      alert(&quot;재료를 1개 이상 선택해야 합니다.&quot;);
      return;
    }

    this.berriesUsed = b;
    this.spicesUsed = s;

    this.enterCooking();
  },

  enterCooking() {
    this.stop();
    this.gauge = 0;
    this.renderGauge();

    this.els.stageImg.src = &quot;/static/images/cooking.png&quot;;
    this.els.phase.textContent = &quot;요리 중&quot;;
    this.els.hint.textContent = &quot;화면을 누르면 게이지가 올라갑니다&quot;;

    this.showOnly(&quot;play&quot;);

    const screen = document.getElementById(&quot;screen-cook&quot;);
    this.onTap = () =&amp;gt; {
      this.gauge = Math.min(100, this.gauge + 4.5);
      this.renderGauge();
      if (this.gauge &amp;gt;= 100) this.finish();
    };
    screen.addEventListener(&quot;pointerdown&quot;, this.onTap);
  },

  renderGauge() {
    if (this.els?.gaugeFill) this.els.gaugeFill.style.width = `${this.gauge}%`;
  },

  stop() {
    const screen = document.getElementById(&quot;screen-cook&quot;);
    if (this.onTap) screen.removeEventListener(&quot;pointerdown&quot;, this.onTap);
    this.onTap = null;
    this._finishing = false;
  },

  reactionAssetByPref(pref) {
    if (pref &amp;gt;= 2) return &quot;/static/images/cooking_react_happy.png&quot;;
    if (pref &amp;lt;= -1) return &quot;/static/images/cooking_react_sad.png&quot;;
    return &quot;/static/images/cooking_react_idle.png&quot;;
  },

  async finish() {
    if (this._finishing) return;
    this._finishing = true;

    this.stop();

    const res = await apiPost(&quot;/api/cook/finish&quot;, {
      berries_used: this.berriesUsed,
      spices_used: this.spicesUsed
    });

    this._finishing = false;

    if (!res.ok) {
      alert(res.message);
      showScreen(&quot;home&quot;);
      return;
    }

    renderHUD(res.state);

    this.showOnly(&quot;result&quot;);
    this.els.finishImg.src = &quot;/static/images/cooking_finish.png&quot;;

    const pref = Number(res.recipe?.pref ?? 0);
    const reactSrc = this.reactionAssetByPref(pref);

    this.els.reactImg.style.display = &quot;block&quot;;
    this.els.reactImg.src = reactSrc;
    this.els.reactImg.onerror = () =&amp;gt; {
      this.els.reactImg.style.display = &quot;none&quot;;
    };

    this.els.resultText.textContent = &quot;&quot;;
    this.els.resultText.style.display = &quot;none&quot;;

    await dialogue.show([
      { text: `${res.recipe.name}를 만들었다.` },
      { text: res.recipe.message }
    ]);
  },

  exitToHome() {
    this.stop();
    showScreen(&quot;home&quot;);
  }
};

// 목욕 모듈


const bath = {
  percent: 0,
  unlocked: false,
  showerMode: false,
  washProgress: 0,
  onMove: null,
  smileTimer: null,


  dProg: null,
  dFill: null,

  isNearEl(e, el, threshold = 90) {
    const r = el.getBoundingClientRect();
    const cx = r.left + r.width / 2;
    const cy = r.top + r.height / 2;
    return Math.hypot(e.clientX - cx, e.clientY - cy) &amp;lt;= threshold;
  },

  placeBubblesNearMarill() {
    const marill = document.getElementById(&quot;bath-marill&quot;);
    const layer = document.getElementById(&quot;bubble-layer&quot;);
    if (!marill || !layer) return;

    const mr = marill.getBoundingClientRect();
    const lr = layer.getBoundingClientRect();
    const cx = (mr.left + mr.right) / 2 - lr.left;
    const cy = (mr.top + mr.bottom) / 2 - lr.top;

    const bubbles = Array.from(layer.querySelectorAll(&quot;.bubble&quot;));
    bubbles.forEach((b) =&amp;gt; {
      const dx = (Math.random() - 0.5) * 260;
      const dy = (Math.random() - 0.5) * 180;
      b.style.left = `${cx + dx}px`;
      b.style.top = `${cy + dy}px`;
    });
  },

  start() {
    this.stop();

    this.dProg = document.getElementById(&quot;dialogue-progress&quot;);
    this.dFill = document.getElementById(&quot;dialogue-progress-fill&quot;);
    if (this.dProg) this.dProg.style.display = &quot;block&quot;;
    if (this.dFill) this.dFill.style.width = &quot;0%&quot;;

    this.percent = 0;
    this.unlocked = false;
    this.showerMode = false;
    this.washProgress = 0;

    const layer = document.getElementById(&quot;bubble-layer&quot;);
    if (layer) layer.style.display = &quot;none&quot;;

    const bathFill = document.getElementById(&quot;bath-fill&quot;);
    if (bathFill) bathFill.style.width = &quot;0%&quot;;

    const screen = document.getElementById(&quot;screen-bath&quot;);
    const showerBtn = document.getElementById(&quot;shower-icon&quot;);
    const marill = document.getElementById(&quot;bath-marill&quot;);
    if (!screen || !showerBtn || !marill) return;

    showerBtn.style.display = &quot;none&quot;;

    screen.classList.add(&quot;sponge-cursor&quot;);
    screen.classList.remove(&quot;shower-cursor&quot;);

    const idleSrc = &quot;/static/images/marill_idle.png&quot;;
    const smileSrc = &quot;/static/images/marill_smile.png&quot;;
    this.smileTimer = setInterval(() =&amp;gt; {
      marill.src = smileSrc;
      setTimeout(() =&amp;gt; { marill.src = idleSrc; }, 700);
    }, 4500);

    let last = 0;

    this.onMove = async (e) =&amp;gt; {
      const now = performance.now();
      if (now - last &amp;lt; 30) return;
      last = now;

      if (!this.showerMode) {
        if (!this.isNearEl(e, marill, 130)) return;

        this.percent = Math.min(100, this.percent + 1);

        if (bathFill) bathFill.style.width = `${this.percent}%`;

        if (this.dFill) this.dFill.style.width = `${this.percent}%`;

        if (layer &amp;amp;&amp;amp; this.percent &amp;gt; 0) {
          layer.style.display = &quot;block&quot;;
          this.placeBubblesNearMarill();
        }

        const res = await apiPost(&quot;/api/bath/progress&quot;, { percent: this.percent });
        if (res.unlock_shower &amp;amp;&amp;amp; !this.unlocked) {
          this.unlocked = true;
          showerBtn.style.display = &quot;inline-block&quot;;
          
        }
      } else {
        await this.washMove(e);
      }
    };

    screen.addEventListener(&quot;pointermove&quot;, this.onMove);
    showerBtn.onclick = () =&amp;gt; this.enableShowerMode();
  },

  enableShowerMode() {
    const screen = document.getElementById(&quot;screen-bath&quot;);
    const layer = document.getElementById(&quot;bubble-layer&quot;);
    if (layer) layer.style.display = &quot;block&quot;;

    this.showerMode = true;
    this.washProgress = 0;

    if (this.dFill) this.dFill.style.width = &quot;0%&quot;;

    if (screen) {
      screen.classList.remove(&quot;sponge-cursor&quot;);
      screen.classList.add(&quot;shower-cursor&quot;);
    }
  },

  async washMove(e) {
    const bubbles = Array.from(document.querySelectorAll(&quot;#bubble-layer .bubble&quot;));
    if (bubbles.length === 0) return;

    const threshold = 110;
    let near = false;
    for (const b of bubbles) {
      if (this.isNearEl(e, b, threshold)) { near = true; break; }
    }
    if (!near) return;

    this.washProgress = Math.min(100, this.washProgress + 2);

    const bathFill = document.getElementById(&quot;bath-fill&quot;);
    if (bathFill) bathFill.style.width = `${this.washProgress}%`;

    if (this.dFill) this.dFill.style.width = `${this.washProgress}%`;

    if (this.washProgress &amp;gt;= 100) {
      await dialogue.show([{ text: &quot;목욕 완료.&quot; }]);
      this.stop();
      showScreen(&quot;home&quot;);
    }
  },

  stop() {
    const screen = document.getElementById(&quot;screen-bath&quot;);
    if (this.smileTimer) clearInterval(this.smileTimer);
    this.smileTimer = null;

    if (screen &amp;amp;&amp;amp; this.onMove) screen.removeEventListener(&quot;pointermove&quot;, this.onMove);
    this.onMove = null;

    if (screen) {
      screen.classList.remove(&quot;sponge-cursor&quot;);
      screen.classList.remove(&quot;shower-cursor&quot;);
    }

    const dProg = document.getElementById(&quot;dialogue-progress&quot;);
    if (dProg) dProg.style.display = &quot;none&quot;;
  }
};


window.addEventListener(&quot;load&quot;, async () =&amp;gt; {
  try {
    const state = await apiGet(&quot;/api/status&quot;);
    renderHUD(state);
  } catch (e) {
    console.error(&quot;status fetch failed&quot;, e);
  }

  try {
    document.querySelectorAll(&quot;.app-btn&quot;).forEach(btn =&amp;gt; {
      btn.addEventListener(&quot;click&quot;, async () =&amp;gt; {
        const type = btn.dataset.event;

        if (type === &quot;walk&quot;) {
          showScreen(&quot;walk&quot;);
          await apiPost(&quot;/api/walk/start&quot;, {});
          walk.start();
        } else if (type === &quot;cook&quot;) {
          showScreen(&quot;cook&quot;);
          cook.start();
        } else if (type === &quot;bath&quot;) {
          showScreen(&quot;bath&quot;);
          bath.start();
        }
      });
    });

    const a = document.getElementById(&quot;btn-attack&quot;);
    const w = document.getElementById(&quot;btn-watch&quot;);
    const r = document.getElementById(&quot;btn-run&quot;);
    if (a) a.addEventListener(&quot;click&quot;, () =&amp;gt; walk.choose(&quot;attack&quot;));
    if (w) w.addEventListener(&quot;click&quot;, () =&amp;gt; walk.choose(&quot;watch&quot;));
    if (r) r.addEventListener(&quot;click&quot;, () =&amp;gt; walk.choose(&quot;run&quot;));

    const bathExit = document.getElementById(&quot;bath-exit&quot;);
    if (bathExit) {
      bathExit.addEventListener(&quot;click&quot;, () =&amp;gt; {
        bath.stop();
        showScreen(&quot;home&quot;);
      });
    }

    showScreen(&quot;home&quot;);
  } catch (e) {
    console.error(&quot;boot bind failed&quot;, e);
  }
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. css&lt;/p&gt;
&lt;pre id=&quot;code_1770799959309&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;body, html { margin: 0; padding: 0; width: 100%; height: 100%; overflow: hidden; }

#walk-info { display: none !important; }
.walk-exit{
  position:absolute;
  right:16px;
  top:16px;
  z-index: 60;
}

.ui-layer{
  position:absolute;
  inset:0;
  z-index:1000;
  pointer-events: none; 
}


#dialogue-layer{
  display:block;
  pointer-events: none;
  background: rgba(0,0,0,0);
}

.dialogue-progress{
  margin-top: 10px;
  width: 100%;
  height: 10px;
  background: rgba(255,255,255,0.18);
  border-radius: 999px;
  overflow: hidden;
}
#dialogue-progress-fill{
  width: 0%;
  height: 100%;
  background: rgba(120,200,255,0.9);
}


#dialogue-box{
   pointer-events:auto;
  position:absolute;
  left:50%;
  bottom:6px;
  transform:translateX(-50%);
  width:min(640px, 94vw);
  min-height:92px;
  background:rgba(0,0,0,0.75);
  border:2px solid rgba(255,255,255,0.85);
  border-radius:12px;
  padding:12px 14px;
  color:#fff;
  font-family: system-ui, -apple-system, sans-serif;
  box-sizing:border-box;
}

#encounter-ui { pointer-events: auto; z-index: 200; }
#screen-walk { z-index: 1; } 

#dialogue-name{
  font-size:13px;
  opacity:0.9;
  margin-bottom:6px;
}

#dialogue-text{
  font-size:16px;
  line-height:1.35;
  white-space:pre-wrap;
  word-break:keep-all;
}


#dialogue-hint{
  position:absolute;
  right:12px;
  bottom:10px;
  font-size:14px;
  opacity:0.85;
  animation: blink 0.9s infinite steps(2, end);
}

@keyframes blink{
  50%{ opacity:0.15; }
}


#screen-bath.sponge-cursor { cursor: url(&quot;/static/images/ui/cursor_sponge.png&quot;) 16 16, auto; }
#screen-bath.shower-cursor { cursor: url(&quot;/static/images/ui/cursor_shower.png&quot;) 16 16, auto; }

#screen-bath .bg{ z-index: 1;}
#bubble-layer { display: none;position:absolute;
  inset:0;
  z-index:20;
  pointer-events:none;}

.bubble{ position:absolute;
  width:72px;
  height:72px;
  background: url(&quot;/static/images/ui/bubble.png&quot;) center/contain no-repeat;
  opacity: 0.95;}
  
#bath-marill{position:absolute;
  left:50%;
  top:56%;
  transform:translate(-50%,-50%);
  width:220px;
  z-index:40;}
#bath-ui{ position:absolute;
  left:50%;
  top:72%;
  transform:translateX(-50%);
  width:min(520px, 92vw);
  display:flex;
  flex-direction:column;
  gap:10px;
  align-items:flex-start;
  pointer-events:auto;}



#game-viewport { position: relative; width: 100vw; height: 100vh; }
.screen { position: absolute; inset: 0; }
.bg { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }

.character { position: absolute; bottom: 20%; left: 45%; width: 140px; }
.walk-ani { animation: walkbob 0.6s infinite alternate; }
@keyframes walkbob { from { transform: translateY(0); } to { transform: translateY(-6px); } }

.walk-marill{
  position:absolute;
  left:50%;
  top:60%;
  transform:translate(-50%,-50%);
  width:160px;
  animation: walkJitter 0.35s infinite alternate;
  z-index: 30;
}

@keyframes walkJitter{
  from { transform: translate(-50%,-50%) translate(-2px,-2px); }
  to   { transform: translate(-50%,-50%) translate(2px,2px); }
}

.enemy-img{
  position:absolute;
  left:50%;
  top:18%;
  transform:translateX(-50%);
  width:140px;
  z-index: 35;
}

#wandering-marill-container {
  position: absolute;
  top: 60%;
  left: 50%;
  transform: translate(-50%, -50%);
  transition: top 0.25s linear, left 0.25s linear;
  transform-origin: 50% 70%;
  animation: waddle 0.9s infinite ease-in-out;
}

@keyframes waddle {
  0%   { transform: translate(-50%, -50%) translateY(0) rotate(-3deg); }
  50%  { transform: translate(-50%, -50%) translateY(-2px) rotate(3deg); }
  100% { transform: translate(-50%, -50%) translateY(0) rotate(-3deg); }
}

#wandering-marill.facing-left { transform: scaleX(-1); }

.bubble {
  position: absolute;
  width: 72px;
  height: 72px;
  border-radius: 50%;
  background: url(&quot;/static/images/ui/bubble.png&quot;) center/contain no-repeat;
  opacity: 0.95;
}

#smartphone-container {
  position: absolute;
  bottom: 20px;
  right: 20px;
  width: 300px;
  height: auto;
}
#phone-frame-img { width: 100%; display: block; }

.app-screen-overlay {
  position: absolute;
  top: 12%;
  left: 8%;
  width: 84%;
  height: 75%;
  overflow: hidden;
}
.app-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 15px;
  padding: 10px;
}
.app-btn {
  background: none;
  border: none;
  cursor: pointer;
  transition: transform 0.1s;
}
.app-btn img { width: 100%; max-width: 60px; -webkit-user-drag: none; user-select: none; }
.app-btn span { display: block; color: white; font-size: 12px; margin-top: 5px; }
.app-btn:active { transform: scale(0.9); filter: brightness(0.8); }

#hud {
  position: absolute;
  top: 10px; left: 10px;
  z-index: 50;
  background: rgba(0,0,0,0.35);
  padding: 8px 10px;
  border-radius: 10px;
  color: #fff;
  font-family: system-ui, -apple-system, sans-serif;
  display: flex;
  align-items: center;
  gap: 12px;
}
#hud-hp { display: flex; gap: 3px; }
.heart { font-size: 18px; }
.heart.off { opacity: 0.25; }
#hud-items { display: flex; gap: 10px; }

.modal {
  position: absolute;
  left: 50%; top: 55%;
  transform: translate(-50%, -50%);
  background: rgba(0,0,0,0.65);
  color: white;
  padding: 14px 16px;
  border-radius: 12px;
  z-index: 40;
  min-width: 260px;
}
.panel {
  position: absolute;
  left: 50%; top: 50%;
  transform: translate(-50%, -50%);
  background: rgba(0,0,0,0.55);
  color: white;
  padding: 16px 16px;
  border-radius: 12px;
  z-index: 30;
  width: min(420px, 92vw);
}
.row { display: flex; gap: 8px; margin-top: 10px; flex-wrap: wrap; }
button { padding: 10px 12px; border-radius: 10px; border: none; cursor: pointer; }
.hint { opacity: 0.9; font-size: 13px; margin-top: 6px; }

.toast {
  position: absolute;
  left: 50%; top: 20%;
  transform: translateX(-50%);
  background: rgba(0,0,0,0.45);
  color: white;
  padding: 10px 14px;
  border-radius: 999px;
  z-index: 25;
}


#gauge { width: 100%; height: 16px; background: rgba(255,255,255,0.2); border-radius: 999px; overflow: hidden; margin-top: 10px; }
#gauge-fill { width: 50%; height: 100%; background: rgba(255,200,0,0.9); }

.feed .post { display: grid; gap: 8px; }
.post-img { width: 100%; height: 180px; object-fit: cover; border-radius: 10px; opacity: 0.9; }

.bath-center{
  position:absolute;
  left:50%;
  top:54%;
  transform:translate(-50%,-50%);
  z-index: 45;
  display:flex;
  flex-direction:column;
  align-items:center;
  gap:12px;
  pointer-events:none; 
}

.bath-marill{
  width:220px; 
  display:block; position: static; transform: none;
}

.bath-progress{
  display:block;
  width:min(360px, 86vw);
  height:16px;
  background: rgba(255,255,255,0.35);
  border-radius:999px;
  overflow:hidden;
  z-index:9999;
  position:relative;
}

#bath-fill{
  display:block;
  width:0%;
  height:100%;
  background: rgba(120,200,255,0.9);
}

#bath-marill{
  position: static !important;
  left:auto !important;
  top:auto !important;
  transform:none !important;
  z-index: auto !important;
}

.bath-panel{
  top:78% !important;
}

.cook-stage{
  position:absolute;
  left:50%;
  top:50%;
  transform:translate(-50%,-50%);
  width:min(520px, 92vw);
  z-index: 35;
  display:flex;
  flex-direction:column;
  align-items:center;
  gap:12px;
  pointer-events:auto;
  background: rgba(0,0,0,0.55);
  border-radius:12px;
  padding:16px;
  box-sizing:border-box;
}

.cook-stage-img{
  width:min(320px, 70vw);
  display:block;
}

.cook-gauge{
  width:100%;
  height:16px;
  background: rgba(255,255,255,0.2);
  border-radius:999px;
  overflow:hidden;
}

.cook-phase{
  font-size:14px;
  opacity:0.95;
}

.cook-bottom{
  justify-content:center;
}

.cook-reaction-img{
  width:min(220px, 50vw);
  display:block;
  opacity:0.98;
}

.cook-result-text{
  width:100%;
  white-space:pre-wrap;
  word-break:keep-all;
  font-size:14px;
  line-height:1.35;
  opacity:0.95;
}

#cook-phase,
#cook-hint,
.cook-result-text {
  color: #ffffff;
  text-shadow:
    0 1px 2px rgba(0,0,0,0.8),
    0 0 6px rgba(0,0,0,0.6);
}

.cook-stage {
  background: rgba(0, 0, 0, 0.65);
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>공부</category>
      <author>sourceoftax</author>
      <guid isPermaLink="true">https://xewaves.tistory.com/30</guid>
      <comments>https://xewaves.tistory.com/30#entry30comment</comments>
      <pubDate>Wed, 11 Feb 2026 17:56:46 +0900</pubDate>
    </item>
    <item>
      <title>[알고리즘 스터디] 9주차 결</title>
      <link>https://xewaves.tistory.com/29</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;한 학기 동안의 알고리즘 스터디 끝...&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1537&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgR1Ei/dJMcah32l11/dCf07MERVZV303AD0Kzmu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgR1Ei/dJMcah32l11/dCf07MERVZV303AD0Kzmu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgR1Ei/dJMcah32l11/dCf07MERVZV303AD0Kzmu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgR1Ei%2FdJMcah32l11%2FdCf07MERVZV303AD0Kzmu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1537&quot; height=&quot;600&quot; data-origin-width=&quot;1537&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 시작 실버3에서 골드5 달성 성공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1129&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1375&quot; data-origin-height=&quot;817&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rsGkl/dJMcaajxDd7/B6GHdWdtcWui0dkjFEI820/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rsGkl/dJMcaajxDd7/B6GHdWdtcWui0dkjFEI820/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rsGkl/dJMcaajxDd7/B6GHdWdtcWui0dkjFEI820/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrsGkl%2FdJMcaajxDd7%2FB6GHdWdtcWui0dkjFEI820%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1375&quot; height=&quot;817&quot; data-origin-width=&quot;1375&quot; data-origin-height=&quot;817&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765885564780&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;bits/stdc++.h&amp;gt;
using namespace std;

int main() {
double xA, yA, xB, yB, xC, yC;
cin &amp;gt;&amp;gt; xA &amp;gt;&amp;gt; yA &amp;gt;&amp;gt; xB &amp;gt;&amp;gt; yB &amp;gt;&amp;gt; xC &amp;gt;&amp;gt; yC;

double cross = (xB - xA) * (yC - yA) - (yB - yA) * (xC - xA);


if (cross == 0) {
cout &amp;lt;&amp;lt; -1 &amp;lt;&amp;lt; '\n';
return 0;
}

auto dist = [&amp;amp;](double x1, double y1, double x2, double y2) {
return hypot(x1 - x2, y1 - y2);
};

double AB = dist(xA, yA, xB, yB);
double BC = dist(xB, yB, xC, yC);
double AC = dist(xA, yA, xC, yC);

double P1 = 2 * (AB + BC);
double P2 = 2 * (AB + AC);
double P3 = 2 * (AC + BC);

double mx = max({P1, P2, P3});
double mn = min({P1, P2, P3});

cout &amp;lt;&amp;lt; fixed &amp;lt;&amp;lt; setprecision(10) &amp;lt;&amp;lt; (mx - mn) &amp;lt;&amp;lt; &quot;\n&quot;;
return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1130&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1350&quot; data-origin-height=&quot;902&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k6f8L/dJMcaiPm4dV/uUCAFaLKqDI6pP8m1uy311/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k6f8L/dJMcaiPm4dV/uUCAFaLKqDI6pP8m1uy311/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k6f8L/dJMcaiPm4dV/uUCAFaLKqDI6pP8m1uy311/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk6f8L%2FdJMcaiPm4dV%2FuUCAFaLKqDI6pP8m1uy311%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1350&quot; height=&quot;902&quot; data-origin-width=&quot;1350&quot; data-origin-height=&quot;902&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765885575527&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;A, B = input().split()
n, m = len(A), len(B)

min_diff = float('inf')

for i in range(m - n + 1):
    diff = 0
    for j in range(n):
        if A[j] != B[i + j]:
            diff += 1
    min_diff = min(min_diff, diff)

print(min_diff)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1201&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1433&quot; data-origin-height=&quot;867&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/evcQWE/dJMcajncs4I/LOZOfKMPI6EenbBGYbo4pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/evcQWE/dJMcajncs4I/LOZOfKMPI6EenbBGYbo4pk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/evcQWE/dJMcajncs4I/LOZOfKMPI6EenbBGYbo4pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FevcQWE%2FdJMcajncs4I%2FLOZOfKMPI6EenbBGYbo4pk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1433&quot; height=&quot;867&quot; data-origin-width=&quot;1433&quot; data-origin-height=&quot;867&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765885842997&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;x, y, w, s = map(int, input().split())

if s &amp;gt; 2 * w:
    print((x + y) * w)

elif s &amp;lt;= w:
    if abs(x - y) % 2 == 0:
        print(max(x, y) * s)
    else:
        print((max(x, y) - 1) * s + w)

else:
    block = min(x, y)
    rest = abs(x - y)
    print(block * s + rest * w)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1202&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1382&quot; data-origin-height=&quot;848&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgteSD/dJMcaihAbH7/itg2szKV3Mn6kIlXJzkYbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgteSD/dJMcaihAbH7/itg2szKV3Mn6kIlXJzkYbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgteSD/dJMcaihAbH7/itg2szKV3Mn6kIlXJzkYbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgteSD%2FdJMcaihAbH7%2Fitg2szKV3Mn6kIlXJzkYbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1382&quot; height=&quot;848&quot; data-origin-width=&quot;1382&quot; data-origin-height=&quot;848&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765885850828&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;S = input().strip()

suffixes = [S[i:] for i in range(len(S))]  
suffixes.sort()                           

for suf in suffixes:
    print(suf)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1203&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;707&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxHkeD/dJMcag48IOb/ifwk1D9N7EAr8lLun4bk0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxHkeD/dJMcag48IOb/ifwk1D9N7EAr8lLun4bk0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxHkeD/dJMcag48IOb/ifwk1D9N7EAr8lLun4bk0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxHkeD%2FdJMcag48IOb%2Fifwk1D9N7EAr8lLun4bk0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1178&quot; height=&quot;707&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;707&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765885860256&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;n = int(input())
numbers = list(map(int, input().split()))

unique_numbers = sorted(set(numbers))

print(*unique_numbers)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1204&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1253&quot; data-origin-height=&quot;808&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pwydZ/dJMcajgqV2P/CV8Wzgjv32u0GKK3G9jtB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pwydZ/dJMcajgqV2P/CV8Wzgjv32u0GKK3G9jtB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pwydZ/dJMcajgqV2P/CV8Wzgjv32u0GKK3G9jtB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpwydZ%2FdJMcajgqV2P%2FCV8Wzgjv32u0GKK3G9jtB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1253&quot; height=&quot;808&quot; data-origin-width=&quot;1253&quot; data-origin-height=&quot;808&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765885868145&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;n, m= map(int, input().split())

visited = [False] * (n+1)
stack = []

def dfs():
    if len(stack) == m:
        print(*stack)
        return
        
    for num in range(1, n+1):
        if not visited[num]:
            visited[num] = True
            stack.append(num)

            dfs()

            visited[num] = False
            stack.pop()

dfs()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1207&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1432&quot; data-origin-height=&quot;946&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dNBW3i/dJMcadAwcya/fT7HiITtsUWTOiRzK6Zpt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dNBW3i/dJMcadAwcya/fT7HiITtsUWTOiRzK6Zpt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dNBW3i/dJMcadAwcya/fT7HiITtsUWTOiRzK6Zpt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdNBW3i%2FdJMcadAwcya%2FfT7HiITtsUWTOiRzK6Zpt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1432&quot; height=&quot;946&quot; data-origin-width=&quot;1432&quot; data-origin-height=&quot;946&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765885875609&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
input = sys.stdin.readline

N, M = map(int, input().split())
mat = [list(map(int, input().split())) for _ in range(N)]

ans = -10**15

for left in range(M):
    temp = [0] * N
    for right in range(left, M):
        for i in range(N):
            temp[i] += mat[i][right]

        current = temp[0]
        best = temp[0]
        for i in range(1, N):
            current = max(temp[i], current + temp[i])
            best = max(best, current)

        ans = max(ans, best)

print(ans)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>공부/코딩</category>
      <author>sourceoftax</author>
      <guid isPermaLink="true">https://xewaves.tistory.com/29</guid>
      <comments>https://xewaves.tistory.com/29#entry29comment</comments>
      <pubDate>Tue, 16 Dec 2025 20:57:35 +0900</pubDate>
    </item>
    <item>
      <title>[알고리즘 스터디] 8주차 결산</title>
      <link>https://xewaves.tistory.com/28</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1122&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1431&quot; data-origin-height=&quot;1087&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKlcpI/dJMcaf6d26W/0S7vheFfUFGu3XkGS9vsK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKlcpI/dJMcaf6d26W/0S7vheFfUFGu3XkGS9vsK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKlcpI/dJMcaf6d26W/0S7vheFfUFGu3XkGS9vsK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKlcpI%2FdJMcaf6d26W%2F0S7vheFfUFGu3XkGS9vsK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1431&quot; height=&quot;1087&quot; data-origin-width=&quot;1431&quot; data-origin-height=&quot;1087&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765884922551&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def d(n):
    return n + sum(map(int, str(n)))

generated = set()

for i in range(1, 10001):
    generated.add(d(i))

for i in range(1, 10001):
    if i not in generated:
        print(i)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1123&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;1127&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tKWqJ/dJMb9950Zkk/ggCujOpluinEiou1y5eC7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tKWqJ/dJMb9950Zkk/ggCujOpluinEiou1y5eC7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tKWqJ/dJMb9950Zkk/ggCujOpluinEiou1y5eC7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtKWqJ%2FdJMb9950Zkk%2FggCujOpluinEiou1y5eC7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1290&quot; height=&quot;1127&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;1127&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765884933097&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;num = int(input())

line = 1
while num &amp;gt; line * (line + 1) // 2:
    line += 1

line_sum = line * (line + 1) // 2
pos = line_sum - num

if line % 2 == 0:  
    numerator = 1 + pos
    denominator = line - pos
else:  
    numerator = line - pos
    denominator = 1 + pos

print(f&quot;{numerator}/{denominator}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1124&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1437&quot; data-origin-height=&quot;736&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pJXqc/dJMcagxh1JS/wunyJHwDmJb8MOqkSL2fr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pJXqc/dJMcagxh1JS/wunyJHwDmJb8MOqkSL2fr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pJXqc/dJMcagxh1JS/wunyJHwDmJb8MOqkSL2fr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpJXqc%2FdJMcagxh1JS%2FwunyJHwDmJb8MOqkSL2fr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1437&quot; height=&quot;736&quot; data-origin-width=&quot;1437&quot; data-origin-height=&quot;736&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765884945344&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;string&amp;gt;
using namespace std;

int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);

int N, M;
cin &amp;gt;&amp;gt; N &amp;gt;&amp;gt; M;

vector&amp;lt;string&amp;gt; board(N);
for (int i = 0; i &amp;lt; N; i++) {
cin &amp;gt;&amp;gt; board[i];
}

int maxSize = 1; 


for (int i = 0; i &amp;lt; N; i++) {
for (int j = 0; j &amp;lt; M; j++) {


for (int size = 1; i + size &amp;lt; N &amp;amp;&amp;amp; j + size &amp;lt; M; size++) {

if (board[i][j] == board[i][j + size] &amp;amp;&amp;amp;
board[i][j] == board[i + size][j] &amp;amp;&amp;amp;
board[i][j] == board[i + size][j + size])
{
maxSize = max(maxSize, size + 1);}
}
}
}

cout &amp;lt;&amp;lt; maxSize * maxSize &amp;lt;&amp;lt; &quot;\n&quot;;
return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1125&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1437&quot; data-origin-height=&quot;1192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csmhsi/dJMcah32l0F/WKE2TVttTRaCpNlogVUyR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csmhsi/dJMcah32l0F/WKE2TVttTRaCpNlogVUyR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csmhsi/dJMcah32l0F/WKE2TVttTRaCpNlogVUyR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcsmhsi%2FdJMcah32l0F%2FWKE2TVttTRaCpNlogVUyR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1437&quot; height=&quot;1192&quot; data-origin-width=&quot;1437&quot; data-origin-height=&quot;1192&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765884997794&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int N, K;
    cin &amp;gt;&amp;gt; N &amp;gt;&amp;gt; K;

    vector&amp;lt;int&amp;gt; temp(N);
    for (int i = 0; i &amp;lt; N; i++) {
        cin &amp;gt;&amp;gt; temp[i];
    }

    int currentSum = 0;
    for (int i = 0; i &amp;lt; K; i++) {
        currentSum += temp[i];
    }

    int maxSum = currentSum;

    for (int i = K; i &amp;lt; N; i++) {
        currentSum += temp[i] - temp[i - K];
        if (currentSum &amp;gt; maxSum) {
            maxSum = currentSum;
        }
    }

    cout &amp;lt;&amp;lt; maxSum &amp;lt;&amp;lt; &quot;\n&quot;;

    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1126&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1447&quot; data-origin-height=&quot;917&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dZINXN/dJMcacIrm6q/kWC2SIy0Pv0LgN81CHDznK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dZINXN/dJMcacIrm6q/kWC2SIy0Pv0LgN81CHDznK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dZINXN/dJMcacIrm6q/kWC2SIy0Pv0LgN81CHDznK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdZINXN%2FdJMcacIrm6q%2FkWC2SIy0Pv0LgN81CHDznK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1447&quot; height=&quot;917&quot; data-origin-width=&quot;1447&quot; data-origin-height=&quot;917&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765885011128&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;stack&amp;gt;
#include &amp;lt;string&amp;gt;
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int N;
    cin &amp;gt;&amp;gt; N;

    int answer = 0;

    while (N--) {
        string s;
        cin &amp;gt;&amp;gt; s;

        stack&amp;lt;char&amp;gt; st;
        for (char c : s) {
            if (!st.empty() &amp;amp;&amp;amp; st.top() == c) {
                st.pop(); 
            } else {
                st.push(c);
            }
        }

        if (st.empty())
            answer++;
    }

    cout &amp;lt;&amp;lt; answer &amp;lt;&amp;lt; &quot;\n&quot;;
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1128&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1447&quot; data-origin-height=&quot;928&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sAT01/dJMcabvZltj/aByR3FsqzNyv6NLbX8hhm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sAT01/dJMcabvZltj/aByR3FsqzNyv6NLbX8hhm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sAT01/dJMcabvZltj/aByR3FsqzNyv6NLbX8hhm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsAT01%2FdJMcabvZltj%2FaByR3FsqzNyv6NLbX8hhm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1447&quot; height=&quot;928&quot; data-origin-width=&quot;1447&quot; data-origin-height=&quot;928&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765885021795&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;bits/stdc++.h&amp;gt;
using namespace std;

const int INF = 1e9;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m;
    cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m;

    vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; dist(n+1, vector&amp;lt;int&amp;gt;(n+1, INF));
    vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; next(n+1, vector&amp;lt;int&amp;gt;(n+1, 0));

    for (int i = 1; i &amp;lt;= n; i++) dist[i][i] = 0;

    for (int i = 0; i &amp;lt; m; i++) {
        int a, b, c;
        cin &amp;gt;&amp;gt; a &amp;gt;&amp;gt; b &amp;gt;&amp;gt; c;
        if (dist[a][b] &amp;gt; c) {
            dist[a][b] = c;
            next[a][b] = b;   
        }
    }

    for (int k = 1; k &amp;lt;= n; k++) {
        for (int i = 1; i &amp;lt;= n; i++) {
            for (int j = 1; j &amp;lt;= n; j++) {
                if (dist[i][j] &amp;gt; dist[i][k] + dist[k][j]) {
                    dist[i][j] = dist[i][k] + dist[k][j];
                    next[i][j] = next[i][k];  
                }
            }
        }
    }

    for (int i = 1; i &amp;lt;= n; i++) {
        for (int j = 1; j &amp;lt;= n; j++) {
            if (dist[i][j] == INF) cout &amp;lt;&amp;lt; 0 &amp;lt;&amp;lt; &quot; &quot;;
            else cout &amp;lt;&amp;lt; dist[i][j] &amp;lt;&amp;lt; &quot; &quot;;
        }
        cout &amp;lt;&amp;lt; &quot;\n&quot;;
    }

    for (int i = 1; i &amp;lt;= n; i++) {
        for (int j = 1; j &amp;lt;= n; j++) {
            if (dist[i][j] == INF || i == j) {
                cout &amp;lt;&amp;lt; 0 &amp;lt;&amp;lt; &quot;\n&quot;;
                continue;
            }

            vector&amp;lt;int&amp;gt; path;
            int cur = i;
            while (cur != j) {
                path.push_back(cur);
                cur = next[cur][j];
            }
            path.push_back(j);

            cout &amp;lt;&amp;lt; path.size() &amp;lt;&amp;lt; &quot; &quot;;
            for (int x : path) cout &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &quot; &quot;;
            cout &amp;lt;&amp;lt; &quot;\n&quot;;
        }
    }

    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>공부/코딩</category>
      <author>sourceoftax</author>
      <guid isPermaLink="true">https://xewaves.tistory.com/28</guid>
      <comments>https://xewaves.tistory.com/28#entry28comment</comments>
      <pubDate>Tue, 16 Dec 2025 20:39:46 +0900</pubDate>
    </item>
    <item>
      <title>[알고리즘 스터디] 7주차 결산</title>
      <link>https://xewaves.tistory.com/27</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1116&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;806&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceQhxg/dJMcadmYsbg/p5tLuH5bw56OzbboOgkTkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceQhxg/dJMcadmYsbg/p5tLuH5bw56OzbboOgkTkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceQhxg/dJMcadmYsbg/p5tLuH5bw56OzbboOgkTkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceQhxg%2FdJMcadmYsbg%2Fp5tLuH5bw56OzbboOgkTkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1448&quot; height=&quot;806&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;806&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765803131470&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;bits/stdc++.h&amp;gt;
using namespace std;

long long n, l, w, h;

bool can(double a) {
    return (long long)(l / a) * (long long)(w / a) * (long long)(h / a) &amp;gt;= n;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; l &amp;gt;&amp;gt; w &amp;gt;&amp;gt; h;

    double low = 0, high = max({l, w, h});
    
    for (int i = 0; i &amp;lt; 10000; i++) {  
        double mid = (low + high) / 2;
        if (can(mid))
            low = mid;
        else
            high = mid;
    }

    cout &amp;lt;&amp;lt; fixed &amp;lt;&amp;lt; setprecision(10) &amp;lt;&amp;lt; low &amp;lt;&amp;lt; &quot;\n&quot;;
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1117&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1482&quot; data-origin-height=&quot;982&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGmzXL/dJMcahCXqN1/LsUJRlM6hXxyrmcspCbF60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGmzXL/dJMcahCXqN1/LsUJRlM6hXxyrmcspCbF60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGmzXL/dJMcahCXqN1/LsUJRlM6hXxyrmcspCbF60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGmzXL%2FdJMcahCXqN1%2FLsUJRlM6hXxyrmcspCbF60%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1482&quot; height=&quot;982&quot; data-origin-width=&quot;1482&quot; data-origin-height=&quot;982&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765803161674&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;stack&amp;gt;
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    string word;
    cin &amp;gt;&amp;gt; word;

    int n;
    cin &amp;gt;&amp;gt; n;

    stack&amp;lt;char&amp;gt; left, right;

    for (char c : word) left.push(c);

    while (n--) {
        char cmd;
        cin &amp;gt;&amp;gt; cmd;
        
        if (cmd == 'L') {
            if (!left.empty()) {
                right.push(left.top());
                left.pop();
            }
        }
        else if (cmd == 'D') {
            if (!right.empty()) {
                left.push(right.top());
                right.pop();
            }
        }
        else if (cmd == 'B') {
            if (!left.empty()) left.pop();
        }
        else if (cmd == 'P') {
            char x;
            cin &amp;gt;&amp;gt; x;
            left.push(x);
        }
    }

    string result;
    while (!left.empty()) {
        right.push(left.top());
        left.pop();
    }
    while (!right.empty()) {
        result += right.top();
        right.pop();
    }

    cout &amp;lt;&amp;lt; result;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1118&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1292&quot; data-origin-height=&quot;908&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kQbug/dJMcabQhrDS/PmmHYHOilQoeg4913gKLnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kQbug/dJMcabQhrDS/PmmHYHOilQoeg4913gKLnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kQbug/dJMcabQhrDS/PmmHYHOilQoeg4913gKLnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkQbug%2FdJMcabQhrDS%2FPmmHYHOilQoeg4913gKLnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1292&quot; height=&quot;908&quot; data-origin-width=&quot;1292&quot; data-origin-height=&quot;908&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765803192461&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;algorithm&amp;gt;
#include &amp;lt;vector&amp;gt;

using namespace std;

int main() {
int num;
const int Max = 2 * 123456;
vector&amp;lt;bool&amp;gt; arr(Max, true);
arr[0] = arr[1] = false;

for (int i = 2; i * i &amp;lt; Max; i++){
if(arr[i]){
for (int j = i*i; j &amp;lt; Max; j += i){
arr[j] = false;}
				}
}

while (true){
cin &amp;gt;&amp;gt; num;
if(num == 0) break;

int count = 0;
for(int k = num+1; k &amp;lt; (num *2) +1;k++){
if(arr[k]) count++;
}
cout &amp;lt;&amp;lt; count &amp;lt;&amp;lt; &quot;\n&quot;;
}


return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1119&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1455&quot; data-origin-height=&quot;1012&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/T3F4a/dJMcadAvPJ8/be7Uv8EGAZsKMKLrtK7AyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/T3F4a/dJMcadAvPJ8/be7Uv8EGAZsKMKLrtK7AyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/T3F4a/dJMcadAvPJ8/be7Uv8EGAZsKMKLrtK7AyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FT3F4a%2FdJMcadAvPJ8%2Fbe7Uv8EGAZsKMKLrtK7AyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1455&quot; height=&quot;1012&quot; data-origin-width=&quot;1455&quot; data-origin-height=&quot;1012&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765803224803&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int num, newscore, p;
    cin &amp;gt;&amp;gt; num &amp;gt;&amp;gt; newscore &amp;gt;&amp;gt; p;

    vector&amp;lt;int&amp;gt; arr(num);   
    for (int i = 0; i &amp;lt; num; i++)
        cin &amp;gt;&amp;gt; arr[i];

    if (num == 0) {
        cout &amp;lt;&amp;lt; 1;
        return 0;
    }

    if (num == p &amp;amp;&amp;amp; newscore &amp;lt;= arr[num - 1]) {
        cout &amp;lt;&amp;lt; -1;
        return 0;
    }

    int rank = 1;
    for (int i = 0; i &amp;lt; num; i++) {
        if (arr[i] &amp;gt; newscore) rank++;
        else break;
    }

    cout &amp;lt;&amp;lt; rank;
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1120&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1436&quot; data-origin-height=&quot;857&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lqwBs/dJMcadHifA0/5wEVpnAUBAshOq5odizd61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lqwBs/dJMcadHifA0/5wEVpnAUBAshOq5odizd61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lqwBs/dJMcadHifA0/5wEVpnAUBAshOq5odizd61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlqwBs%2FdJMcadHifA0%2F5wEVpnAUBAshOq5odizd61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1436&quot; height=&quot;857&quot; data-origin-width=&quot;1436&quot; data-origin-height=&quot;857&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765803254225&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;algorithm&amp;gt;
#include &amp;lt;numeric&amp;gt;   
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int num;
    cin &amp;gt;&amp;gt; num;
    vector&amp;lt;long long&amp;gt; arr(num);
    for (int i = 0; i &amp;lt; num; i++)
        cin &amp;gt;&amp;gt; arr[i];

    vector&amp;lt;int&amp;gt; idx(num);
    iota(idx.begin(), idx.end(), 0);

    sort(idx.begin(), idx.end(), [&amp;amp;](int x, int y) {
        if (arr[x] == arr[y]) return x &amp;lt; y;
        return arr[x] &amp;lt; arr[y];
    });

    vector&amp;lt;int&amp;gt; p(num);

    for (int pos = 0; pos &amp;lt; num; pos++) {
        p[idx[pos]] = pos;
    }

    for (int i = 0; i &amp;lt; num; i++)
        cout &amp;lt;&amp;lt; p[i] &amp;lt;&amp;lt; &quot; &quot;;
    cout &amp;lt;&amp;lt; &quot;\n&quot;;

    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1121&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1446&quot; data-origin-height=&quot;776&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G32Bu/dJMcab3OMd3/TJKqlyhufICv7LETadqYY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G32Bu/dJMcab3OMd3/TJKqlyhufICv7LETadqYY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G32Bu/dJMcab3OMd3/TJKqlyhufICv7LETadqYY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG32Bu%2FdJMcab3OMd3%2FTJKqlyhufICv7LETadqYY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1446&quot; height=&quot;776&quot; data-origin-width=&quot;1446&quot; data-origin-height=&quot;776&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765803276718&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;num, s = map(int, input().split())
arr = list(map(int, input().split()))

left = 0
sum_val = 0
answer = float('inf')

for right in range(num):
    sum_val += arr[right]

    while sum_val &amp;gt;= s:
        answer = min(answer, right - left + 1)
        sum_val -= arr[left]
        left += 1

print(0 if answer == float('inf') else answer)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>공부/코딩</category>
      <author>sourceoftax</author>
      <guid isPermaLink="true">https://xewaves.tistory.com/27</guid>
      <comments>https://xewaves.tistory.com/27#entry27comment</comments>
      <pubDate>Mon, 15 Dec 2025 21:55:01 +0900</pubDate>
    </item>
    <item>
      <title>[알고리즘 스터디] 6주차 결산</title>
      <link>https://xewaves.tistory.com/26</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1108&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1421&quot; data-origin-height=&quot;892&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSyFCa/dJMcaaX86AG/Ra4EtMsnosRdr6NcXRqbVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSyFCa/dJMcaaX86AG/Ra4EtMsnosRdr6NcXRqbVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSyFCa/dJMcaaX86AG/Ra4EtMsnosRdr6NcXRqbVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSyFCa%2FdJMcaaX86AG%2FRa4EtMsnosRdr6NcXRqbVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1421&quot; height=&quot;892&quot; data-origin-width=&quot;1421&quot; data-origin-height=&quot;892&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765802795393&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
using namespace std;

long long p[101]; 

int main() {


    int k;
    cin &amp;gt;&amp;gt; k;

    p[1] = p[2] = p[3] = 1;
    p[4] = p[5] = 2;

    for (int i = 6; i &amp;lt;= 100; i++) {
        p[i] = p[i - 1] + p[i - 5];
    }

    while (k--) {
        int n;
        cin &amp;gt;&amp;gt; n;
        cout &amp;lt;&amp;lt; p[n] &amp;lt;&amp;lt; '\n';
    }

    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1109&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;916&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Q9jaC/dJMcaihzOcF/f74vaOjXDw201s1NVkwaY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Q9jaC/dJMcaihzOcF/f74vaOjXDw201s1NVkwaY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Q9jaC/dJMcaihzOcF/f74vaOjXDw201s1NVkwaY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQ9jaC%2FdJMcaihzOcF%2Ff74vaOjXDw201s1NVkwaY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1232&quot; height=&quot;916&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;916&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765802804206&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;num, n = map(int, input().split())
count = 0
arr = set()  

for _ in range(num):
    arr.add(input())

for _ in range(n):
    word = input()
    if word in arr:
        count += 1

print(count)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1110&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1346&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dpRO6S/dJMcaaKBxQS/haIOXvtgeevFFo1xeK3pK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dpRO6S/dJMcaaKBxQS/haIOXvtgeevFFo1xeK3pK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dpRO6S/dJMcaaKBxQS/haIOXvtgeevFFo1xeK3pK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdpRO6S%2FdJMcaaKBxQS%2FhaIOXvtgeevFFo1xeK3pK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1346&quot; height=&quot;748&quot; data-origin-width=&quot;1346&quot; data-origin-height=&quot;748&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765802813289&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;n, k = map(int, input().split())
arr = list(map(int, input().split()))

count = 0
found = False

for i in range(n - 1, 0, -1):  
    max_idx = i
    for j in range(i - 1, -1, -1):
        if arr[j] &amp;gt; arr[max_idx]:
            max_idx = j

    if max_idx != i:
        arr[i], arr[max_idx] = arr[max_idx], arr[i]
        count += 1
        if count == k:
            print(arr[max_idx], arr[i])
            found = True
            break

if not found:
    print(-1)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1111&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1438&quot; data-origin-height=&quot;888&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfpvTm/dJMcag48lAi/QqByKyugwe8PkkUn8k0kI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfpvTm/dJMcag48lAi/QqByKyugwe8PkkUn8k0kI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfpvTm/dJMcag48lAi/QqByKyugwe8PkkUn8k0kI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfpvTm%2FdJMcag48lAi%2FQqByKyugwe8PkkUn8k0kI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1438&quot; height=&quot;888&quot; data-origin-width=&quot;1438&quot; data-origin-height=&quot;888&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765802820992&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;algorithm&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;map&amp;gt;
using namespace std;

int main() {
int casenum, num;

cin &amp;gt;&amp;gt; casenum;

for (int i = 0; i &amp;lt; casenum; i++){
int count(1);
cin &amp;gt;&amp;gt; num;
vector&amp;lt;pair&amp;lt;string, string&amp;gt;&amp;gt; arr(num);
map&amp;lt;string, int&amp;gt; typeCount;

for (int j = 0; j &amp;lt; num; j++){
cin &amp;gt;&amp;gt; arr[j].first &amp;gt;&amp;gt; arr[j].second;
typeCount[arr[j].second]++;
}

for (auto &amp;amp;p : typeCount) {
count *= (p.second + 1);
}

count -= 1;

cout &amp;lt;&amp;lt; count &amp;lt;&amp;lt; &quot;\n&quot;;

}


return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1112&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1421&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bscNA0/dJMcagjKATd/kveA1ecRxVtcnVNoOe1ku0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bscNA0/dJMcagjKATd/kveA1ecRxVtcnVNoOe1ku0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bscNA0/dJMcagjKATd/kveA1ecRxVtcnVNoOe1ku0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbscNA0%2FdJMcagjKATd%2FkveA1ecRxVtcnVNoOe1ku0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1421&quot; height=&quot;748&quot; data-origin-width=&quot;1421&quot; data-origin-height=&quot;748&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765802833599&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
using namespace std;

int main() {

    int num(0), caseNum(0), k(0);
    scanf(&quot;%d %d&quot;, &amp;amp;num, &amp;amp;caseNum);

    vector&amp;lt;int&amp;gt; arr(num + 1, 0); 
    for (int i = 1; i &amp;lt;= num; i++) {
        scanf(&quot;%d&quot;, &amp;amp;k);
        arr[i] = arr[i - 1] + k; 
    }

    for (int i = 0; i &amp;lt; caseNum; i++) {
        int startNum(0), endNum(0);
        scanf(&quot;%d %d&quot;, &amp;amp;startNum, &amp;amp;endNum);
        printf(&quot;%d\n&quot;, arr[endNum] - arr[startNum - 1]);
    }
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1113&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1477&quot; data-origin-height=&quot;1086&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4SmQJ/dJMcaiIBh1h/Kvs07zTKZePxuY8tv2WQXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4SmQJ/dJMcaiIBh1h/Kvs07zTKZePxuY8tv2WQXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4SmQJ/dJMcaiIBh1h/Kvs07zTKZePxuY8tv2WQXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4SmQJ%2FdJMcaiIBh1h%2FKvs07zTKZePxuY8tv2WQXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1477&quot; height=&quot;1086&quot; data-origin-width=&quot;1477&quot; data-origin-height=&quot;1086&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765802841197&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def cutSum(arr, height):
total = 0
for ch in arr:
if ch &amp;gt; height:
total += ch - height
return total

def binary_search(arr, minsum):
left = 0
right = max(arr)
result = 0

while left &amp;lt;= right:
mid = (left + right) // 2
cutsum = cutSum(arr, mid)

if cutsum &amp;gt;= minsum:
result = mid
left = mid +1
else:
right = mid -1

return result

num, minsum = map(int, input().split())
arr = list(map(int, input().split()))


print(binary_search(arr, minsum))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1114&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1482&quot; data-origin-height=&quot;973&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdf2fB/dJMcajnb7D4/EKPqQjyxx1ZbFYI4Z4OTyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdf2fB/dJMcajnb7D4/EKPqQjyxx1ZbFYI4Z4OTyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdf2fB/dJMcajnb7D4/EKPqQjyxx1ZbFYI4Z4OTyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbdf2fB%2FdJMcajnb7D4%2FEKPqQjyxx1ZbFYI4Z4OTyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1482&quot; height=&quot;973&quot; data-origin-width=&quot;1482&quot; data-origin-height=&quot;973&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765802852290&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def func(start):
    heap = []
    dist[start] = 0
    heapq.heappush(heap, (0, start))

    while heap:
        current_cost, now = heapq.heappop(heap)

        if dist[now] &amp;lt; current_cost:
            continue

        for nxt, cost in graph[now]:
            new_cost = current_cost + cost
            if new_cost &amp;lt; dist[nxt]:
                dist[nxt] = new_cost
                prev[nxt] = now
                heapq.heappush(heap, (new_cost, nxt))

import sys
import heapq
input = sys.stdin.readline

n = int(input())
m = int(input())

graph = [[] for _ in range(n+1)]
for _ in range(m):
    a, b, cost = map(int, input().split())
    graph[a].append((b, cost))

start, end = map(int, input().split())

nf = float('inf')
dist = [nf] * (n+1)
prev = [0] * (n+1)

func(start)


path = []
cur = end
while cur != 0:
    path.append(cur)
    cur = prev[cur]

path.reverse()


print(dist[end])         
print(len(path))         
print(*path)&lt;/code&gt;&lt;/pre&gt;</description>
      <author>sourceoftax</author>
      <guid isPermaLink="true">https://xewaves.tistory.com/26</guid>
      <comments>https://xewaves.tistory.com/26#entry26comment</comments>
      <pubDate>Mon, 15 Dec 2025 21:50:15 +0900</pubDate>
    </item>
    <item>
      <title>[알고리즘 스터디] 5주차 결산</title>
      <link>https://xewaves.tistory.com/25</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;왜 갑자기 11월로 점프함? 나태함 미쳤네&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라는 말은 스톱&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중간고사 기간에는 스터디도 쉬어갑니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1101&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1341&quot; data-origin-height=&quot;1157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dMUp7L/dJMcagjKANz/HxVTz0UKFCdnUb6Qo2QDYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dMUp7L/dJMcagjKANz/HxVTz0UKFCdnUb6Qo2QDYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dMUp7L/dJMcagjKANz/HxVTz0UKFCdnUb6Qo2QDYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdMUp7L%2FdJMcagjKANz%2FHxVTz0UKFCdnUb6Qo2QDYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1341&quot; height=&quot;1157&quot; data-origin-width=&quot;1341&quot; data-origin-height=&quot;1157&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765538837249&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;casenum = int(input())

dp = [(0, 0)] * 41
dp[0] = (1, 0) 
dp[1] = (0, 1)  

for i in range(2, 41):
    dp[i] = (dp[i-1][0] + dp[i-2][0], dp[i-1][1] + dp[i-2][1])

for _ in range(casenum):
    n = int(input())
    print(dp[n][0], dp[n][1])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1102&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1013&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ch3pzH/dJMcacn7D1F/OSmPddPykH6KkXS0zbmpeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ch3pzH/dJMcacn7D1F/OSmPddPykH6KkXS0zbmpeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ch3pzH/dJMcacn7D1F/OSmPddPykH6KkXS0zbmpeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fch3pzH%2FdJMcacn7D1F%2FOSmPddPykH6KkXS0zbmpeK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1448&quot; height=&quot;1013&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1013&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765538846287&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
using namespace std;

int main() {
	int num;
	int sum(0);
	int count(0);
	int stick = 64;
	cin &amp;gt;&amp;gt; num;
	
	while (sum != num){
		if (stick &amp;gt; num - sum){
			stick /= 2;
		}
		else{
			sum += stick;
			count ++;
			}
	}
	cout &amp;lt;&amp;lt; count;
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1103&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1471&quot; data-origin-height=&quot;931&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTEE0O/dJMcabiscBu/zb2JZ5ya2kSNB61ji1lsp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTEE0O/dJMcabiscBu/zb2JZ5ya2kSNB61ji1lsp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTEE0O/dJMcabiscBu/zb2JZ5ya2kSNB61ji1lsp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTEE0O%2FdJMcabiscBu%2Fzb2JZ5ya2kSNB61ji1lsp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1471&quot; height=&quot;931&quot; data-origin-width=&quot;1471&quot; data-origin-height=&quot;931&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765802390457&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;num = int(input())

dp = [0] * (num + 2)
dp[1] = 1
dp[2] = 2

for i in range(3, num + 1):
    dp[i] = (dp[i - 1] + dp[i - 2]) % 15746  

print(dp[num])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1104&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1303&quot; data-origin-height=&quot;767&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eN6ban/dJMcac2GpWJ/3xRy2xKzxtJqhK2VRXJsWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eN6ban/dJMcac2GpWJ/3xRy2xKzxtJqhK2VRXJsWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eN6ban/dJMcac2GpWJ/3xRy2xKzxtJqhK2VRXJsWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeN6ban%2FdJMcac2GpWJ%2F3xRy2xKzxtJqhK2VRXJsWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1303&quot; height=&quot;767&quot; data-origin-width=&quot;1303&quot; data-origin-height=&quot;767&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765802400695&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;algorithm&amp;gt;
#include &amp;lt;vector&amp;gt;
using namespace std;

int main() {
	int num, count;
	scanf(&quot;%d %d&quot;, &amp;amp;num, &amp;amp;count);
	vector&amp;lt;int&amp;gt; arr(num);
	
	for (int i = 0; i &amp;lt; num; i++){
		scanf(&quot;%d&quot;, &amp;amp;arr[i]);
	}
	nth_element(arr.begin(), arr.begin() + (count - 1), arr.end());
	printf(&quot;%d&quot;, arr[count-1]);
	
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1105&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1438&quot; data-origin-height=&quot;892&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdR5gb/dJMcagqwg8r/NJW6M7L2a2N3s0mkTUsGA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdR5gb/dJMcagqwg8r/NJW6M7L2a2N3s0mkTUsGA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdR5gb/dJMcagqwg8r/NJW6M7L2a2N3s0mkTUsGA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdR5gb%2FdJMcagqwg8r%2FNJW6M7L2a2N3s0mkTUsGA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1438&quot; height=&quot;892&quot; data-origin-width=&quot;1438&quot; data-origin-height=&quot;892&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765802409822&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;algorithm&amp;gt;
#include &amp;lt;vector&amp;gt;
using namespace std;

bool compare(int i, int j){
	return i &amp;gt; j;
}

int main() {
	int num, people, count = 0;
	int result = 0;
	cin &amp;gt;&amp;gt; num &amp;gt;&amp;gt; people;
	
	vector&amp;lt;int&amp;gt; arr(people);
	vector&amp;lt;int&amp;gt; sum(people);
	
	for (int i = 0; i &amp;lt; people; i++){
		cin &amp;gt;&amp;gt; arr[i];
	}
	sort(arr.begin(), arr.end(), compare);
	
	for (int i = 0; i &amp;lt; people; i++){
		sum[i] = min(num, i + 1) * arr[i];
		
		if (sum[i] &amp;gt; result) {            
			result = sum[i];
			count = arr[i];
	}
	}
	cout &amp;lt;&amp;lt; count &amp;lt;&amp;lt; &quot; &quot; &amp;lt;&amp;lt; result;
	
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1106&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1382&quot; data-origin-height=&quot;736&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QStv0/dJMcafd5dUt/BAqhS0CtTXR96qTlUhyTNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QStv0/dJMcafd5dUt/BAqhS0CtTXR96qTlUhyTNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QStv0/dJMcafd5dUt/BAqhS0CtTXR96qTlUhyTNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQStv0%2FdJMcafd5dUt%2FBAqhS0CtTXR96qTlUhyTNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1382&quot; height=&quot;736&quot; data-origin-width=&quot;1382&quot; data-origin-height=&quot;736&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765802425821&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def merge(arr, p, q, r):
i = p
j = q+1
t = 0
global count, answer, n

while (i &amp;lt;= q and j &amp;lt;= r):
if (arr[i] &amp;lt;= arr[j]):
tmp[t] = arr[i]
t += 1
i += 1
else:
tmp[t] = arr[j]
t += 1
j += 1

#하나가 i=q, j=r 둘이 같은 경우, 근데 만약 하나 더 짧으면
while (i &amp;lt;= q):
tmp[t] = arr[i]
t = t+1
i=i+1
while(j &amp;lt;= r):
tmp[t] = arr[j]
t = t+1
j = j+1
i = p
t = 0
while (i &amp;lt;= r):
arr[i] = tmp[t]
count += 1

if(count == n):
answer = arr[i]
t += 1
i += 1



def mergesort(arr, p, r):
if (p &amp;lt; r):
q = (p + r) // 2

mergesort(arr, p, q)
mergesort(arr,q+1, r)
merge(arr, p, q, r)



length, n = map(int, input().split())
arr = list(map(int, input().split()))

tmp = [0]*(len(arr))
count = 0
p = 0
r = len(arr)-1
answer = -1
mergesort(arr, p, r)
print(answer)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1107&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;807&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b69CGT/dJMcaihzN6i/at0aq1TpLbIULMQlHnVUVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b69CGT/dJMcaihzN6i/at0aq1TpLbIULMQlHnVUVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b69CGT/dJMcaihzN6i/at0aq1TpLbIULMQlHnVUVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb69CGT%2FdJMcaihzN6i%2Fat0aq1TpLbIULMQlHnVUVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1072&quot; height=&quot;807&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;807&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765802458282&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;cmath&amp;gt;
using namespace std;

bool func(long long num) {
long long numRoot = sqrt(num);
return num == numRoot * numRoot;
}

int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);

int caseNum;
cin &amp;gt;&amp;gt; caseNum;

for (int i = 0; i &amp;lt; caseNum; i++) {
long long num;
cin &amp;gt;&amp;gt; num;
cout &amp;lt;&amp;lt; func(num);
if (i != caseNum - 1) cout &amp;lt;&amp;lt; &quot; &quot;;
}

return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>공부/코딩</category>
      <author>sourceoftax</author>
      <guid isPermaLink="true">https://xewaves.tistory.com/25</guid>
      <comments>https://xewaves.tistory.com/25#entry25comment</comments>
      <pubDate>Mon, 15 Dec 2025 21:43:27 +0900</pubDate>
    </item>
    <item>
      <title>[알고리즘 스터디] 4주차 결산</title>
      <link>https://xewaves.tistory.com/24</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1012&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1452&quot; data-origin-height=&quot;707&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ku0o6/dJMcadgb5UI/9qvGJ5F4s9LhH5o6G2G7n0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ku0o6/dJMcadgb5UI/9qvGJ5F4s9LhH5o6G2G7n0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ku0o6/dJMcadgb5UI/9qvGJ5F4s9LhH5o6G2G7n0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKu0o6%2FdJMcadgb5UI%2F9qvGJ5F4s9LhH5o6G2G7n0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1452&quot; height=&quot;707&quot; data-origin-width=&quot;1452&quot; data-origin-height=&quot;707&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765538296411&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def func(word):
    seen = set()
    prev = ''
    for ch in word:
        if ch != prev:
            if ch in seen:
                return False
            seen.add(prev)
        prev = ch
    return True

num = int(input())
count = 0

for i in range(num):
    word = input()
    if func(word):
        count += 1

print(count)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1013&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1463&quot; data-origin-height=&quot;910&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJBPT7/dJMcaaRmzWv/KI2jk7baOKSmV82q9GF6W1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJBPT7/dJMcaaRmzWv/KI2jk7baOKSmV82q9GF6W1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJBPT7/dJMcaaRmzWv/KI2jk7baOKSmV82q9GF6W1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJBPT7%2FdJMcaaRmzWv%2FKI2jk7baOKSmV82q9GF6W1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1463&quot; height=&quot;910&quot; data-origin-width=&quot;1463&quot; data-origin-height=&quot;910&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765538306851&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;num = int(input())
arr = []
for i in range(num):
    word = input()

    if(word in arr):
        pass
    else:
        arr.append(word)

arr.sort(key=lambda x: (len(x), x))

for ch in arr:
    print(ch)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1015&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1407&quot; data-origin-height=&quot;728&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brrMZ0/dJMcagKN9db/MmxtdKX2XMbBWz28nm09e1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brrMZ0/dJMcagKN9db/MmxtdKX2XMbBWz28nm09e1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brrMZ0/dJMcagKN9db/MmxtdKX2XMbBWz28nm09e1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrrMZ0%2FdJMcagKN9db%2FMmxtdKX2XMbBWz28nm09e1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1407&quot; height=&quot;728&quot; data-origin-width=&quot;1407&quot; data-origin-height=&quot;728&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765538315738&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;num, length = map(int, input().split())

for l in range(length, 101):  
    num2 = num - (l * (l - 1) // 2)

    if num2 &amp;lt; 0:
        break  

    if num2r % l == 0:  
        start = num2 // l
        print(*[start + i for i in range(l)])
        exit()

print(-1)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1016&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1418&quot; data-origin-height=&quot;890&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mlPvX/dJMcah30WBH/kRt1ZbIvsFLr91vhe9IQD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mlPvX/dJMcah30WBH/kRt1ZbIvsFLr91vhe9IQD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mlPvX/dJMcah30WBH/kRt1ZbIvsFLr91vhe9IQD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmlPvX%2FdJMcah30WBH%2FkRt1ZbIvsFLr91vhe9IQD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1418&quot; height=&quot;890&quot; data-origin-width=&quot;1418&quot; data-origin-height=&quot;890&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765538324026&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;num = int(input())
arr = set(input().split())

num2 = int(input())
cards = input().split()

for card in cards:
    if card in arr:
        print(1, end=' ')
    else:
        print(0, end=' ')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1017&lt;/b&gt;&lt;/p&gt;</description>
      <category>공부/코딩</category>
      <author>sourceoftax</author>
      <guid isPermaLink="true">https://xewaves.tistory.com/24</guid>
      <comments>https://xewaves.tistory.com/24#entry24comment</comments>
      <pubDate>Fri, 12 Dec 2025 20:20:05 +0900</pubDate>
    </item>
    <item>
      <title>[알고리즘 스터디] 3주차 결산</title>
      <link>https://xewaves.tistory.com/23</link>
      <description>&lt;pre id=&quot;code_1765538169021&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;num = int(input())
d = [0] * (num+1)

for i in range(1, num + 1):
    d[i] = i  
    j = 1
    while j * j &amp;lt;= i:
        d[i] = min(d[i], d[i - j * j] + 1)
        j += 1

print(d[num])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1004&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1456&quot; data-origin-height=&quot;892&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQKouO/dJMcagxgGrE/6OX4a5LBNKQqIrx2tjwoX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQKouO/dJMcagxgGrE/6OX4a5LBNKQqIrx2tjwoX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQKouO/dJMcagxgGrE/6OX4a5LBNKQqIrx2tjwoX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQKouO%2FdJMcagxgGrE%2F6OX4a5LBNKQqIrx2tjwoX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1456&quot; height=&quot;892&quot; data-origin-width=&quot;1456&quot; data-origin-height=&quot;892&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765537924673&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import collections

caseNum = int(input())
arr = input().split()
counter = collections.Counter(arr)

num = int(input())
searchNums = input().split()

for s in searchNums:
    print(counter[s], end=' ')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1005&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1501&quot; data-origin-height=&quot;1100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bT4mQn/dJMcagKN86r/ixgR8PYYnQZupcXd19ZfoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bT4mQn/dJMcagKN86r/ixgR8PYYnQZupcXd19ZfoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bT4mQn/dJMcagKN86r/ixgR8PYYnQZupcXd19ZfoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbT4mQn%2FdJMcagKN86r%2FixgR8PYYnQZupcXd19ZfoK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1501&quot; height=&quot;1100&quot; data-origin-width=&quot;1501&quot; data-origin-height=&quot;1100&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765537954680&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;utility&amp;gt;
#include &amp;lt;algorithm&amp;gt;
using namespace std;

int main() {
	int num(0);
	cin &amp;gt;&amp;gt; num;
	int x, y;
    vector &amp;lt;pair&amp;lt;int, int&amp;gt;&amp;gt; arr;
	
	for (int i = 0; i &amp;lt; num; i++){
		cin &amp;gt;&amp;gt; x &amp;gt;&amp;gt; y;
		arr.push_back({x,y});
	}
	sort(arr.begin(),arr.end());
	
	for (auto &amp;amp;v : arr) {
        cout &amp;lt;&amp;lt; v.first &amp;lt;&amp;lt; &quot; &quot; &amp;lt;&amp;lt; v.second &amp;lt;&amp;lt; &quot;\n&quot;;
    }
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1006&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1462&quot; data-origin-height=&quot;1011&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dBwHxN/dJMcaiPlCfh/LbNeDIzKfaIFAr68jRrmi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dBwHxN/dJMcaiPlCfh/LbNeDIzKfaIFAr68jRrmi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dBwHxN/dJMcaiPlCfh/LbNeDIzKfaIFAr68jRrmi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdBwHxN%2FdJMcaiPlCfh%2FLbNeDIzKfaIFAr68jRrmi0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1462&quot; height=&quot;1011&quot; data-origin-width=&quot;1462&quot; data-origin-height=&quot;1011&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765537998182&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;num, maxWeight = map(int, input().split())

d = [0] * (maxWeight+1)
for i in range(num):
    weight, value = map(int, input().split())
    for w in range(maxWeight, weight - 1, -1): 
        d[w] = max(d[w], d[w - weight]+ value)
print(d[maxWeight])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1007&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;1092&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbuwoQ/dJMcabiq2sx/BMd0lANSbgnPaJOjy9nZyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbuwoQ/dJMcabiq2sx/BMd0lANSbgnPaJOjy9nZyK/img.png&quot; data-alt=&quot;이날 레제 극장판을 너무 감명깊게 봐서 폭발하는 문제를 찾아서 풀었음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbuwoQ/dJMcabiq2sx/BMd0lANSbgnPaJOjy9nZyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbuwoQ%2FdJMcabiq2sx%2FBMd0lANSbgnPaJOjy9nZyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1366&quot; height=&quot;1092&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;1092&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이날 레제 극장판을 너무 감명깊게 봐서 폭발하는 문제를 찾아서 풀었음&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765538035458&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;text = input()
bomb = input()

stack = []
bomb_len = len(bomb)

for ch in text:
    stack.append(ch)

    if len(stack) &amp;gt;= bomb_len and ''.join(stack[-bomb_len:]) == bomb:
        del stack[-bomb_len:]

    
result = ''.join(stack)
print(result if result else &quot;FRULA&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1008&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1270&quot; data-origin-height=&quot;1021&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfsvwg/dJMcadtJOfy/vKgZixHmT9dZWvnjLIbX3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfsvwg/dJMcadtJOfy/vKgZixHmT9dZWvnjLIbX3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfsvwg/dJMcadtJOfy/vKgZixHmT9dZWvnjLIbX3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbfsvwg%2FdJMcadtJOfy%2FvKgZixHmT9dZWvnjLIbX3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1270&quot; height=&quot;1021&quot; data-origin-width=&quot;1270&quot; data-origin-height=&quot;1021&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765538124380&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;casenum = int(input())

for i in range(casenum):
    num = int(input())
    d = [0] * (num + 1)

    d[1] = 1
    if num &amp;gt;= 2:
        d[2] = 2
    if num &amp;gt;= 3:
        d[3] = 4

    for j in range(4, num +1):
        d[j] = d[j-1] + d[j-2] + d[j-3]
    print(d[num])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1009&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1282&quot; data-origin-height=&quot;721&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v2V1h/dJMb99Ssl6A/QBMXwQdAn6WiL4TBDJqMJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v2V1h/dJMb99Ssl6A/QBMXwQdAn6WiL4TBDJqMJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v2V1h/dJMb99Ssl6A/QBMXwQdAn6WiL4TBDJqMJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv2V1h%2FdJMb99Ssl6A%2FQBMXwQdAn6WiL4TBDJqMJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1282&quot; height=&quot;721&quot; data-origin-width=&quot;1282&quot; data-origin-height=&quot;721&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1765538139342&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def func(num):
    if(num &amp;lt;= 1):
        return 1
    return num * func(num-1)

num = int(input())
facNum = func(num)
count = 0

while facNum % 10 == 0:
    count += 1
    facNum //= 10

print(count)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1010&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1417&quot; data-origin-height=&quot;832&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtM3w1/dJMcadtJOf3/xuQzEsH0Eg426RtT68spek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtM3w1/dJMcadtJOf3/xuQzEsH0Eg426RtT68spek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtM3w1/dJMcadtJOf3/xuQzEsH0Eg426RtT68spek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtM3w1%2FdJMcadtJOf3%2FxuQzEsH0Eg426RtT68spek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1417&quot; height=&quot;832&quot; data-origin-width=&quot;1417&quot; data-origin-height=&quot;832&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765538203386&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;num = int(input())
d = [0] * (num+1)

for i in range(1, num + 1):
    d[i] = i  
    j = 1
    while j * j &amp;lt;= i:
        d[i] = min(d[i], d[i - j * j] + 1)
        j += 1

print(d[num])&lt;/code&gt;&lt;/pre&gt;</description>
      <category>공부/코딩</category>
      <author>sourceoftax</author>
      <guid isPermaLink="true">https://xewaves.tistory.com/23</guid>
      <comments>https://xewaves.tistory.com/23#entry23comment</comments>
      <pubDate>Fri, 12 Dec 2025 20:17:10 +0900</pubDate>
    </item>
    <item>
      <title>아주 유용하고 편리한 생년월일 입력 프로그램</title>
      <link>https://xewaves.tistory.com/22</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;여러분의 실력을 뽐내보세요&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;사용 코드 1(음악 넣고 노드 뽑는 프로그램)&lt;/p&gt;
&lt;pre id=&quot;code_1765199419195&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import librosa
import numpy as np
import json
import os


WAV_FILE = &quot;fantaisie.wav&quot;
OUTPUT_FILE = &quot;beatmap.json&quot;

def create_beatmap():
    if not os.path.exists(WAV_FILE):
        print(f&quot;오류. {WAV_FILE} 파일이 없습니다&quot;)
        return

    print(&quot;음악 분석 중&quot;)
    
    y, sr = librosa.load(WAV_FILE, sr=22050)

    onset_env = librosa.onset.onset_strength(y=y, sr=sr)
    onset_frames = librosa.onset.onset_detect(
        onset_envelope=onset_env, 
        sr=sr, 
        wait=3,      
        delta=0.04   
    )
    
    timestamps = librosa.frames_to_time(onset_frames, sr=sr)
    
    timestamps_list = timestamps.tolist()

    with open(OUTPUT_FILE, 'w') as f:
        json.dump(timestamps_list, f)

    print(f&quot;{len(timestamps_list)}개의 노트가 생성되었습니다&quot;)
    print(f&quot;결과가 {OUTPUT_FILE}에 저장되었습니다&quot;)

if __name__ == &quot;__main__&quot;:
    create_beatmap()&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;사용 코드 2(메인 코드)&lt;/p&gt;
&lt;pre id=&quot;code_1765199353298&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
import os
import time
import json
import random
from PyQt5.QtWidgets import (QApplication, QWidget, QLabel, QPushButton, 
                             QVBoxLayout, QHBoxLayout, QStackedWidget)
from PyQt5.QtCore import QTimer, Qt, QUrl
from PyQt5.QtGui import QPainter, QColor, QFont, QPen
from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent

WINDOW_WIDTH = 400
WINDOW_HEIGHT = 600
NOTE_SPEED = 8
HIT_Y = 500
HIT_RANGE = 70


class RhythmGameWidget(QWidget):
    def __init__(self, main_window):
        super().__init__()
        self.main_window = main_window
        self.score = 0
        self.notes = []
        self.is_playing = False
        self.is_game_over = False

        self.timer = QTimer()
        self.timer.timeout.connect(self.game_loop)

        self.score_font = QFont(&quot;Arial&quot;, 24, QFont.Bold)
        self.gameover_font = QFont(&quot;Arial&quot;, 36, QFont.Bold)

        self.player = QMediaPlayer()
        self.hit_player = QMediaPlayer()

        bgm = QUrl.fromLocalFile(os.path.abspath(&quot;fantaisie.wav&quot;))
        hit = QUrl.fromLocalFile(os.path.abspath(&quot;hit.mp3&quot;))

        self.player.setMedia(QMediaContent(bgm))
        self.hit_player.setMedia(QMediaContent(hit))

        self.map_file = &quot;beatmap.json&quot;
        self.note_timestamps = []

        if os.path.exists(self.map_file):
            with open(self.map_file, 'r') as f:
                self.note_timestamps = json.load(f)

        self.current_note_index = 0
        self.start_time = 0

    def start_game(self):
        if not self.note_timestamps:
            self.main_window.show_status(&quot;오류. beatmap.json 파일이 없습니다&quot;)
            self.main_window.back_to_form()
            return

        self.score = 0
        self.notes = []
        self.current_note_index = 0
        self.is_playing = True
        self.is_game_over = False

        self.start_time = time.time()

        self.timer.start(16)
        self.setFocus()

        self.player.stop()
        self.player.play()

    def stop_game(self):
        if not self.is_playing:
            return

        self.is_playing = False
        self.is_game_over = True

        QTimer.singleShot(20, self._finish_stop)

    def _finish_stop(self):
        self.timer.stop()
        self.player.stop()
        self.update()

        QTimer.singleShot(700, self._safe_return)

    def _safe_return(self):
        self.main_window.finish_game(self.score)

    def play_hit_sound(self):
        self.hit_player.stop()
        self.hit_player.play()

    def game_loop(self):
        if not self.is_playing:
            return

        now = time.time() - self.start_time

        while self.current_note_index &amp;lt; len(self.note_timestamps):
            t = self.note_timestamps[self.current_note_index]
            if t &amp;lt;= now:
                x = random.randint(0, WINDOW_WIDTH - 50)
                self.notes.append({'x': x, 'y': -20})
                self.current_note_index += 1
            else:
                break

        for note in self.notes:
            note['y'] += NOTE_SPEED
            if note['y'] &amp;gt; WINDOW_HEIGHT:  
                self.stop_game()
                return

        self.update()

    def paintEvent(self, event):
        p = QPainter(self)
        p.setRenderHint(QPainter.Antialiasing)

        p.fillRect(self.rect(), QColor(&quot;#222222&quot;))

        if self.is_game_over:
            p.setPen(QColor(&quot;#FF4444&quot;))
            p.setFont(self.gameover_font)
            p.drawText(self.rect(), Qt.AlignCenter, &quot;입력 완료&quot;)

            p.setPen(QColor(&quot;white&quot;))
            p.setFont(self.score_font)
            p.drawText(self.rect().adjusted(0, 90, 0, 0),
                       Qt.AlignCenter, f&quot;입력된 정보: {self.score}&quot;)
            return

        pen = QPen(QColor(255, 255, 255))
        pen.setWidth(2)
        p.setPen(pen)
        p.drawLine(0, HIT_Y, WINDOW_WIDTH, HIT_Y)

        p.setBrush(QColor(&quot;#66CCFF&quot;))
        p.setPen(Qt.NoPen)
        for note in self.notes:
            p.drawRect(note['x'], note['y'], 50, 20)

        p.setPen(QColor(&quot;#66CCFF&quot;))
        p.setFont(self.score_font)
        p.drawText(self.rect(),
                   Qt.AlignTop | Qt.AlignHCenter,
                   f&quot;COMBO: {self.score}&quot;)

    def keyPressEvent(self, event):
        if not self.is_playing:
            return

        if event.key() == Qt.Key_Space:
            for note in self.notes[:]:
                if HIT_Y - HIT_RANGE &amp;lt; note['y'] &amp;lt; HIT_Y + HIT_RANGE:
                    self.notes.remove(note)
                    self.score += 1
                    self.play_hit_sound()
                    break


class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle(&quot;Input System&quot;)
        self.setFixedSize(WINDOW_WIDTH, WINDOW_HEIGHT)
        self.setStyleSheet(&quot;background-color: #f9f9f9; font-family: 'Malgun Gothic';&quot;)

        self.stack = QStackedWidget(self)
        self.form_widget = QWidget()
        self.setup_form_ui()
        self.game_widget = RhythmGameWidget(self)

        self.stack.addWidget(self.form_widget)
        self.stack.addWidget(self.game_widget)

        layout = QVBoxLayout(self)
        layout.addWidget(self.stack)
        layout.setContentsMargins(0, 0, 0, 0)

        self.current_target = None

    def setup_form_ui(self):
        layout = QVBoxLayout()
        layout.setAlignment(Qt.AlignCenter)
        layout.setSpacing(20)

        title = QLabel(&quot;생년월일 입력&quot;)
        title.setStyleSheet(&quot;font-size: 24px; font-weight: bold; color: #333;&quot;)
        title.setAlignment(Qt.AlignCenter)

        self.status_label = QLabel(&quot;입력된 정보는 사용 후 파기됩니다&quot;)
        self.status_label.setStyleSheet(&quot;font-size: 14px; color: #666;&quot;)
        self.status_label.setAlignment(Qt.AlignCenter)

        input_layout = QHBoxLayout()
        self.btn_year = self.create_input_btn(&quot;YYYY&quot;)
        self.btn_month = self.create_input_btn(&quot;MM&quot;)
        self.btn_day = self.create_input_btn(&quot;DD&quot;)

        input_layout.addWidget(self.btn_year)
        input_layout.addWidget(self.btn_month)
        input_layout.addWidget(self.btn_day)

        btn_submit = QPushButton(&quot;제출하기&quot;)
        btn_submit.setStyleSheet(&quot;&quot;&quot;
            background-color: #333; color: white; border-radius: 8px;
            padding: 12px; font-weight: bold;
        &quot;&quot;&quot;)

        layout.addStretch()
        layout.addWidget(title)
        layout.addWidget(self.status_label)
        layout.addLayout(input_layout)
        layout.addWidget(btn_submit)
        layout.addStretch()

        self.form_widget.setLayout(layout)

    def create_input_btn(self, text):
        btn = QPushButton(text)
        btn.setFixedSize(90, 60)
        btn.setStyleSheet(&quot;&quot;&quot;
            QPushButton {
                border: 2px solid #ddd;
                border-radius: 12px;
                background: white;
                font-size: 18px;
                color: #555;
            }
            QPushButton:hover { border-color: #66CCFF; }
        &quot;&quot;&quot;)
        btn.clicked.connect(lambda: self.start_game_sequence(btn))
        return btn

    def start_game_sequence(self, btn):
        self.current_target = btn
        self.stack.setCurrentWidget(self.game_widget)
        self.game_widget.start_game()

    def back_to_form(self):
        self.stack.setCurrentWidget(self.form_widget)

    def show_status(self, msg):
        self.status_label.setText(msg)

    def finish_game(self, score):
        QTimer.singleShot(10, lambda: self._finish(score))

    def _finish(self, score):
        self.stack.setCurrentWidget(self.form_widget)

        if self.current_target:
            self.current_target.setText(str(score))
            self.current_target.setStyleSheet(&quot;&quot;&quot;
                border: 2px solid #FF4444;
                border-radius: 12px;
                background: #FFF0F0;
                color: #FF4444;
                font-size: 20px;
                font-weight: bold;
            &quot;&quot;&quot;)

        self.status_label.setText(&quot;입력 완료&quot;)
        self.status_label.setStyleSheet(
            &quot;font-size: 16px; color: #FF4444; font-weight: bold;&quot;
        )

if __name__ == &quot;__main__&quot;:
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())&lt;/code&gt;&lt;/pre&gt;</description>
      <category>공부/코딩</category>
      <category>파이썬</category>
      <author>sourceoftax</author>
      <guid isPermaLink="true">https://xewaves.tistory.com/22</guid>
      <comments>https://xewaves.tistory.com/22#entry22comment</comments>
      <pubDate>Mon, 8 Dec 2025 22:10:55 +0900</pubDate>
    </item>
    <item>
      <title>알고리즘 스터디 2주차 결산</title>
      <link>https://xewaves.tistory.com/21</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;0927&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1461&quot; data-origin-height=&quot;787&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tDc86/btsQ1XscOyb/dXdzABYrwiPVBD0a6lzdgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tDc86/btsQ1XscOyb/dXdzABYrwiPVBD0a6lzdgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tDc86/btsQ1XscOyb/dXdzABYrwiPVBD0a6lzdgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtDc86%2FbtsQ1XscOyb%2FdXdzABYrwiPVBD0a6lzdgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1461&quot; height=&quot;787&quot; data-origin-width=&quot;1461&quot; data-origin-height=&quot;787&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1759669383709&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
using namespace std;

int main() {
    long long min, max;
    cin &amp;gt;&amp;gt; min &amp;gt;&amp;gt; max;

    long long length = max - min + 1;
    vector&amp;lt;bool&amp;gt; isSquareFree(length, true);  

    for (long long i = 2; i * i &amp;lt;= max; i++) {
        long long square = i * i;

        long long start = (min + square - 1) / square * square;

        for (long long j = start; j &amp;lt;= max; j += square) {
            isSquareFree[j - min] = false; 
        }
    }

    int count = 0;
    for (int i = 0; i &amp;lt; length; i++) {
        if (isSquareFree[i]) count++;
    }

    cout &amp;lt;&amp;lt; count &amp;lt;&amp;lt; '\n';
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0928&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1452&quot; data-origin-height=&quot;901&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tfrCD/btsQ2bDKB9L/8C8kVAPfAseLXhWfx3Eef0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tfrCD/btsQ2bDKB9L/8C8kVAPfAseLXhWfx3Eef0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tfrCD/btsQ2bDKB9L/8C8kVAPfAseLXhWfx3Eef0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtfrCD%2FbtsQ2bDKB9L%2F8C8kVAPfAseLXhWfx3Eef0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1452&quot; height=&quot;901&quot; data-origin-width=&quot;1452&quot; data-origin-height=&quot;901&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1759669402362&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;num = int(input())
d = [0] * (num + 1)

for x in range(2, num + 1):
    d[x] = d[x - 1] + 1         
    if x % 2 == 0:              
        d[x] = min(d[x], d[x // 2] + 1)
    if x % 3 == 0:              
        d[x] = min(d[x], d[x // 3] + 1)

print(d[num])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;풀이과정: dp 알고리즘 중 상향식 dp를 사용하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d[x]는 1로 만드는데 필요한 최소 연산 횟수로 설정하ㅗㄱ,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;본인이 참고한 자료(블로그, 논문 등)가 있으면 꼭 출처를 남기시기 바랍니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 블로그: &lt;a href=&quot;https://velog.io/@jxlhe46/알고리즘-다이나믹-프로그래밍&quot;&gt;https://velog.io/@jxlhe46/알고리즘-다이나믹-프로그래밍&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배운 점: 해당 문제를 풀며 새로 공부한 내용을 간략하게 작성하면 됩니다. (예시 : Gaussian Elimination을 응용해 역행렬을 계산하지 않고 LU분해를 하는 방법을 배웠다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0929&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;몸이 안좋아서 그냥 잠........&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0930&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1507&quot; data-origin-height=&quot;1012&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mazUV/btsQ4NH3WvZ/RCq47kcryVMmFgTrlXWCdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mazUV/btsQ4NH3WvZ/RCq47kcryVMmFgTrlXWCdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mazUV/btsQ4NH3WvZ/RCq47kcryVMmFgTrlXWCdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmazUV%2FbtsQ4NH3WvZ%2FRCq47kcryVMmFgTrlXWCdk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1507&quot; height=&quot;1012&quot; data-origin-width=&quot;1507&quot; data-origin-height=&quot;1012&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1759669428132&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;num, caseNum = map(int, input().split())
d = {}

for _ in range(caseNum):
    s = input().strip()
    if s in d:
        del d[s]
    d[s] = True

for x in list(d.keys())[:num]:
    print(x)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;풀이과정 : 단순하게 입력받은 당시 이미 해당 값이 존재하면 기존 값을 지운다. 반복문이 끝나면 제시된 수만큼 차례대로 출력한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배운 점: 문제 자체는 간단하지만 시간 제한이 빡빡한 편이다. 처음에 일반적인 방식으로 in 연산과 remove 연산을 사용했더니 최악의 경우 O(n^2)가 나오기에 시간 초과에 걸렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고치기 위해 dict를 사용했다. 다만 파이썬 버전이 낮으면 일반 dict가 순서를 기억하지 못하기에 주의가 필요하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1001&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1462&quot; data-origin-height=&quot;1070&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUkGYQ/btsQ1Y5Jc6S/HntC22Kz8PA7Fiq3jyKj8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUkGYQ/btsQ1Y5Jc6S/HntC22Kz8PA7Fiq3jyKj8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUkGYQ/btsQ1Y5Jc6S/HntC22Kz8PA7Fiq3jyKj8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUkGYQ%2FbtsQ1Y5Jc6S%2FHntC22Kz8PA7Fiq3jyKj8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1462&quot; height=&quot;1070&quot; data-origin-width=&quot;1462&quot; data-origin-height=&quot;1070&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1759669448451&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;tuple&amp;gt;
using namespace std;

int main(){
	int num(0), height(0), weight(0), score(1);
	vector &amp;lt;tuple&amp;lt;int, int, int&amp;gt;&amp;gt; arr;
	cin &amp;gt;&amp;gt; num;
	
	for(int i = 0; i &amp;lt; num; i++){
		cin &amp;gt;&amp;gt; weight &amp;gt;&amp;gt; height;
		arr.push_back({weight, height, score});
	}
	
	for(int i = 0; i &amp;lt; num; i++){
		for(int j = 0; j &amp;lt; num; j++){
			if(i==j) continue;
			
			 if (get&amp;lt;0&amp;gt;(arr[j]) &amp;gt; get&amp;lt;0&amp;gt;(arr[i]) &amp;amp;&amp;amp;
                get&amp;lt;1&amp;gt;(arr[j]) &amp;gt; get&amp;lt;1&amp;gt;(arr[i])) {
                get&amp;lt;2&amp;gt;(arr[i])++;
		}
		}
	}

	for (int i = 0; i &amp;lt; num; i++) {
	cout &amp;lt;&amp;lt; get&amp;lt;2&amp;gt;(arr[i]) &amp;lt;&amp;lt; &quot; &quot;;
	}

return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;풀이과정 : tuple을 통해 벡터에 세 개의 분류를 생성했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 반복문 연산을 통해 몸무게, 키가 모두 큰 경우에만 덩치가 크다고 판정한다. 이 경우 최악의 상황에서도 시간 복잡도는 O(n^2)이 된다. 문제의 시간 조건이 2초며 제한에 주어진 최대 수가 작은 편이기에 해당 방식을 사용했다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1002&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1462&quot; data-origin-height=&quot;1102&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGjexw/btsQ2bwZFnR/rmGJMyXoXKAnv8qgz5i4aK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGjexw/btsQ2bwZFnR/rmGJMyXoXKAnv8qgz5i4aK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGjexw/btsQ2bwZFnR/rmGJMyXoXKAnv8qgz5i4aK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGjexw%2FbtsQ2bwZFnR%2FrmGJMyXoXKAnv8qgz5i4aK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1462&quot; height=&quot;1102&quot; data-origin-width=&quot;1462&quot; data-origin-height=&quot;1102&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1759669466293&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;num = int(input())
arr = [0]  

for _ in range(num):
    arr.append(int(input()))

d = [0] * (num + 1)

d[1] = arr[1]
if num &amp;gt;= 2:
    d[2] = arr[1] + arr[2]
if num &amp;gt;= 3:
    d[3] = max(arr[1] + arr[3], arr[2] + arr[3])

for i in range(4, num+1):
    d[i] = max(d[i-2] + arr[i], d[i-3] + arr[i-1] + arr[i])

print(d[num])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;풀이과정 : d[i]는 i번째 계단까지 올라갔을 때 얻을 수 있는 최대 점수를 저장하는 배열이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d[i]를 반복문 내에서 돌릴 때, 이전 계단에서 바로 올라오기 or 두 계단 뛰고 올라오기 중 더 큰 값을 골라 값에 집어 넣는다. 마지막에는 d[num]값을 출력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배운 점: dp를 적용시키는 것에 익숙해지려 노력 중이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1003&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1472&quot; data-origin-height=&quot;932&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xxFeM/btsQ4ldVNeE/D3HPfifVcrmNb4bKvm6Ft1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xxFeM/btsQ4ldVNeE/D3HPfifVcrmNb4bKvm6Ft1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xxFeM/btsQ4ldVNeE/D3HPfifVcrmNb4bKvm6Ft1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxxFeM%2FbtsQ4ldVNeE%2FD3HPfifVcrmNb4bKvm6Ft1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1472&quot; height=&quot;932&quot; data-origin-width=&quot;1472&quot; data-origin-height=&quot;932&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1759669488268&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;bits/stdc++.h&amp;gt;
using namespace std;

int main() {
    int N, M;
    cin &amp;gt;&amp;gt; N &amp;gt;&amp;gt; M;
    vector&amp;lt;string&amp;gt; grid(N);
    for (int i = 0; i &amp;lt; N; i++) cin &amp;gt;&amp;gt; grid[i];
    
    vector&amp;lt;vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt;&amp;gt; visited(N, vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt;(M, vector&amp;lt;int&amp;gt;(2, 0)));
    queue&amp;lt;tuple&amp;lt;int,int,int,int&amp;gt;&amp;gt; q;
    q.push({0, 0, 1, 0}); 
    visited[0][0][0] = 1;

    int dx[4] = {-1, 1, 0, 0};
    int dy[4] = {0, 0, -1, 1};

    while (!q.empty()) {
        auto [x, y, dist, broken] = q.front();
        q.pop();

        if (x == N-1 &amp;amp;&amp;amp; y == M-1) {
            cout &amp;lt;&amp;lt; dist &amp;lt;&amp;lt; &quot;\n&quot;;
            return 0;
        }

        for (int dir = 0; dir &amp;lt; 4; dir++) {
            int nx = x + dx[dir];
            int ny = y + dy[dir];

            if (nx &amp;lt; 0 || ny &amp;lt; 0 || nx &amp;gt;= N || ny &amp;gt;= M) continue;

            if (grid[nx][ny] == '0' &amp;amp;&amp;amp; !visited[nx][ny][broken]) {
                visited[nx][ny][broken] = 1;
                q.push({nx, ny, dist + 1, broken});
            }

            if (grid[nx][ny] == '1' &amp;amp;&amp;amp; broken == 0 &amp;amp;&amp;amp; !visited[nx][ny][1]) {
                visited[nx][ny][1] = 1;
                q.push({nx, ny, dist + 1, 1});
            }
        }
    }

    cout &amp;lt;&amp;lt; -1 &amp;lt;&amp;lt; &quot;\n&quot;;
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;풀이과정 : 기초 코드는 ppt 그대로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;while문을 통해 bfs 탐색을 진행한다. 현재의 위치와 이동 거리, 벽이 부숴졌는지의 여부를 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 if문을 통해서는 도착 여부를 확인한다. 만일 목표 지점에 도달하였다면 현재 dist 값을 출력한 다음에 종료한다. bfs를 이용하였기에, 처음 도착한 경우가 최단 거리가 된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 아래에 깔린 코드는 빈칸 이동/벽 부수고 이동에 관한 내용이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 만일 도착점에 도달하지 못했다면 -1을 출력한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 블로그: &lt;a href=&quot;https://gmlwjd9405.github.io/2018/08/15/algorithm-bfs.html&quot;&gt;https://gmlwjd9405.github.io/2018/08/15/algorithm-bfs.html&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배운 점: 지난 주 ppt에서 제공해주신 기초 코드를 토대로 풀이했다. bfs 관련 문제는 풀어보지 않았는데, 이번에 풀어보게 되어 좋았다.&lt;/p&gt;</description>
      <category>공부/코딩</category>
      <author>sourceoftax</author>
      <guid isPermaLink="true">https://xewaves.tistory.com/21</guid>
      <comments>https://xewaves.tistory.com/21#entry21comment</comments>
      <pubDate>Sun, 5 Oct 2025 22:05:24 +0900</pubDate>
    </item>
  </channel>
</rss>