<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>phanre의 tistory</title>
    <link>https://phanre.tistory.com/</link>
    <description>SSAFY 9th
https://github.com/pxxnxx</description>
    <language>ko</language>
    <pubDate>Fri, 24 Jul 2026 22:31:00 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>phanre</managingEditor>
    <image>
      <title>phanre의 tistory</title>
      <url>https://tistory1.daumcdn.net/tistory/5370668/attach/df40a2adea3a4ea69b712511fee30f89</url>
      <link>https://phanre.tistory.com</link>
    </image>
    <item>
      <title>[DB] - DB의 특징 및 트랜잭션</title>
      <link>https://phanre.tistory.com/40</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;DB의 4가지 특징&lt;/h3&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. 실시간 접근성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 데이터베이스는 비정형적인 질의에 대해 실시간 처리에 의한 응답이 가능해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 지속적인 변화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 데이터베이스의 상태는 동적으로, 즉 새로운 데이터의 삽입, 삭제, 갱신으로 항상 최신의 데이터를 유지해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 동시 공용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 데이터베이스는 서로 다른 목적을 가진 여러 사용자들을 위한 것이므로, 다수의 사용자가 동시에 같은 내용의 데이터를 이용할 수 있어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 내용에 의한 참조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SQL 4가지 데이터 언어&lt;/h3&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. DDL (Data Definition Language)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 데이터베이스 구조를 정의, 수정, 삭제하는 언어입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; create(생성), alter(수정), drop(삭제), truncate(초기화), rename(이름 변경)이 있습니다.&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;2. DML (Data Manipulation Language)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 데이터베이스 내 자료 조회, 삽입, 수정, 삭제하는 언어입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; select(조회), insert(삽입), update(수정), delete(삭제)가 있습니다.&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;3. DCL (Data Control Language)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 데이터베이스에 대한 접근 권한 제어에 사용하는 언어입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; grant(권한 부여), revoke(권한 회수)가 있습니다.&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;4. TCL (Transaction Control Language)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; DCL에서 트랜잭션을 컨트롤 하는 명령어로, DCL로 분류하는 경우도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; commit(영구 반영), rollback(복구), savepoint(복구 위한 저장점 지정)이 있습니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;트랜잭션&lt;/h3&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;작업이 하나라도 실패하면 트랜잭션은 실패합니다.&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;트랜잭션의 종류로는 3가지가 있습니다.&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. 자동 커밋 트랜잭션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 데이터 변경이 성공적으로 끝나면 자동으로 commit, 실패하면 자동 rollback 처리 됩니다.&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;2. 묵시적 트랜잭션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 자동 커밋 트랜잭션과 정 반대되는 개념으로, 사용자가 commit 혹은 rollback을 입력하기 전까지의 명령어들을 하나의 트랜잭션으로 간주합니다.&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;3. 명시적 트랜잭션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;트랜잭션의 4가지 특성 (ACID)&lt;/h3&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. Atomic (원자성)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 트랜잭션이 부분적으로 성공 또는 실패하지 않는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 작업이 모두 반영되거나, 모두 반영되지 않음으로써 결과를 예측할 수 있어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; ex) 계좌이체에서 A의 통장에서 출금만 되고 B의 통장에 입금이 안되는 경우, 롤백시켜 데이터를 보호합니다.&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;2. Consistency (일관성)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 트랜잭션 이후 DB의 무결성이 유지되어야 하는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 다시 말해, 트랜잭션이 일어난 이후의 데이터베이스는 데이터베이스의 제약이나 규칙을 만족해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; ex) 모든 고객은 반드시 이름을 가져야 한다는 제약이 있을 때, 기존 고객의 이름을 삭제하는 쿼리나 이름 없는 새로운 고객을 추가하는 쿼리는 일관성에 위반됩니다.&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;3. Isolation (고립성)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 하나의 트랜잭션 사이에 다른 트랜잭션이 끼어들 수 없는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 모든 트랜잭션은 다른 트랜잭션으로부터 독립되어야 한다는 뜻입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 각 트랜잭션은 철저히 독립적이기 때문에, 다른 트랜잭션의 작업 내용을 알 수 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; ex) 만원이 있는 계좌에서 동시에 B와 C에게 8천원을 송금할 때, B에게 먼저 송금한 뒤 C에게 송금하여, B, C 모두에게 송금하는 것을 실패하게 해야 합니다.&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;4. Durability (지속성)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 트랜잭션이 영구히 데이터베이스에 반영되어야 하는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 하나의 트랜잭션이 성공적으로 수행되었다면, 해당 트랜잭션에 대한 로그가 남아야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 만약 런타임 오류나 시스템 오류가 발생하더라도, 해당 기록은 영구적이어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; ex) 은행에서 계좌이체를 성공적으로 실행한 뒤에, 해당 은행 데이터베이스에 오류가 발생해 종료되더라도 계좌이체 내역은 기록으로 남아야 합니다. 마찬가지로 계좌이체를 기록하기 전에 오류로 종료가 된다면, 이체는 실패 처리하고 각 계좌들은 이체 이전 상태로 롤백해야 합니다.&lt;/p&gt;</description>
      <category>스터디 (Study)</category>
      <category>ACID</category>
      <category>db</category>
      <category>dcl</category>
      <category>ddl</category>
      <category>dml</category>
      <category>tcl</category>
      <category>transaction</category>
      <category>데이터베이스</category>
      <category>트랜잭션</category>
      <author>phanre</author>
      <guid isPermaLink="true">https://phanre.tistory.com/40</guid>
      <comments>https://phanre.tistory.com/40#entry40comment</comments>
      <pubDate>Wed, 10 May 2023 22:03:31 +0900</pubDate>
    </item>
    <item>
      <title>[Python/파이썬] - 백준(BOJ) 3221번 : 개미의 이동</title>
      <link>https://phanre.tistory.com/39</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/3221&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/3221&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657462593461&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;3221번: 개미의 이동&quot; data-og-description=&quot;첫째 줄에 줄의 길이 L과 T가 주어진다. (2 &amp;le; L &amp;le; 200,000, 1 &amp;le; T &amp;le; 1,000,000) T의 단위는 초이다. 둘째 줄에는 개미의 수 N이 주어진다. (1 &amp;le; N &amp;le; 70,000, N &amp;lt; L) 다음 N개 줄에는 개미의 처음 위치 (줄의 &quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/3221&quot; data-og-url=&quot;https://www.acmicpc.net/problem/3221&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bvFWKP/hyO3rT0Sqi/gvNKI7I9R3oR5YrpL4Xg4K/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/3221&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/3221&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bvFWKP/hyO3rT0Sqi/gvNKI7I9R3oR5YrpL4Xg4K/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;3221번: 개미의 이동&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 줄의 길이 L과 T가 주어진다. (2 &amp;le; L &amp;le; 200,000, 1 &amp;le; T &amp;le; 1,000,000) T의 단위는 초이다. 둘째 줄에는 개미의 수 N이 주어진다. (1 &amp;le; N &amp;le; 70,000, N &amp;lt; L) 다음 N개 줄에는 개미의 처음 위치 (줄의&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1초 마다 1씩 이동하는데 T초 후의 개미의 위치를 파악하는 문제입니다.&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;/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;어차피 처음의 개미가 왼쪽부터 오른쪽까지 1번 ~ N번 이고 그 상대적인 위치는 변하지 않는다는 것을 알게되었습니다.&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;/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;개미의 위치를 sort하여 나타내었습니다.&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;pre id=&quot;code_1657462578025&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
input = sys.stdin.readline

l, t = map(int,input().split())
n = int(input())
loc = []
vec = []

for _ in range(n):
    a, b = map(str, input().split())
    loc.append(int(a))
    if b == 'L':
        vec.append(-1)
    else:
        vec.append(1)

for i in range(n):
    loc[i] += vec[i] * t
    while loc[i] &amp;gt; l or loc[i] &amp;lt; 0:
        if loc[i] &amp;gt; l:
            loc[i] = 2*l - loc[i]
        elif loc[i] &amp;lt; 0:
            loc[i] = -loc[i]
        vec[i] = -vec[i]

print(*sorted(loc),sep=' ')&lt;/code&gt;&lt;/pre&gt;</description>
      <category>백준(BOJ)</category>
      <category>3211</category>
      <category>ADHOC</category>
      <category>BOJ</category>
      <category>PYTHON</category>
      <category>개미의 이동</category>
      <category>백준</category>
      <category>파이썬</category>
      <author>phanre</author>
      <guid isPermaLink="true">https://phanre.tistory.com/39</guid>
      <comments>https://phanre.tistory.com/39#entry39comment</comments>
      <pubDate>Tue, 12 Jul 2022 08:24:15 +0900</pubDate>
    </item>
    <item>
      <title>[Python/파이썬] - 백준(BOJ) 14500번 : 테트로미노</title>
      <link>https://phanre.tistory.com/38</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/14500&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/14500&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657460963513&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;14500번: 테트로미노&quot; data-og-description=&quot;폴리오미노란 크기가 1&amp;times;1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/14500&quot; data-og-url=&quot;https://www.acmicpc.net/problem/14500&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dr1kDr/hyO3qt08F8/yPt8lTwCktqbEIGoXKTG7K/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480,https://scrap.kakaocdn.net/dn/QgQHp/hyO3qHyUYp/lHfK4MAdjrmNEK2oo2HZU0/img.png?width=500&amp;amp;height=333&amp;amp;face=0_0_500_333&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/14500&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/14500&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dr1kDr/hyO3qt08F8/yPt8lTwCktqbEIGoXKTG7K/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480,https://scrap.kakaocdn.net/dn/QgQHp/hyO3qHyUYp/lHfK4MAdjrmNEK2oo2HZU0/img.png?width=500&amp;amp;height=333&amp;amp;face=0_0_500_333');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;14500번: 테트로미노&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;폴리오미노란 크기가 1&amp;times;1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&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;&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;정사각형 네칸으로 만든 테트로미노의 모양으로 탐색을 하여 answer값을 max로 만드는 문제입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 처음에 모든 테트로미노가 네칸이므로 dy, dx 배열을 만들어 만들어질 수 있는 경우의 수를 DFS로 탐색하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DFS로 네 방향 모두 탐색을 하며 탐색을 시작할 때 visit 배열의 값을 1로 만들어 중복을 피하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;탐색이 끝난 경우 visit을 다시 0으로 전환하여 모든 경우의 수를 탐색하도록 하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네칸을 탐색하였다면 저장해둔 값과 answer값을 max함수를 이용하여 비교하여 최대값으로 저장해줍니다.&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;이 알고리즘을 통하여 모두 탐색할 수 있을 줄 알았는데 T자 모양은 DFS로 탐색이 불가능하여 따로 함수를 생성해주었습니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1657460945973&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
input = sys.stdin.readline

answer = 0
def DFS(y, x, s, v):
    global answer
    if v == 4:
        answer = max(answer, s)
        return
    visit[y][x] = 1
    for i in range(4):
        yy = y + dy[i]
        xx = x + dx[i]
        if 0 &amp;lt;= yy &amp;lt; n and 0 &amp;lt;= xx &amp;lt; m and visit[yy][xx] == 0:
            DFS(yy, xx, s+arr[yy][xx], v+1)
    visit[y][x] = 0
def T(y, x):
    global answer
    for k in range(4):
        s = arr[y][x]
        b = 1
        for i in range(4):
            if i == k:
                continue
            yy = y + dy[i]
            xx = x + dx[i]
            if yy &amp;lt; 0 or xx &amp;lt; 0 or yy &amp;gt;= n or xx &amp;gt;= m:
                b = 0
                break
            s += arr[yy][xx]
        if b:
            answer = max(answer, s)
n, m = map(int,input().split())
arr = [list(map(int,input().split())) for _ in range(n)]
visit = [[0 for _ in range(m)] for _ in range(n)]
dy = [0,1,0,-1]
dx = [1,0,-1,0]
for i in range(n):
    for j in range(m):
        DFS(i, j, 0, 0)
        T(i, j)
print(answer)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>백준(BOJ)</category>
      <category>14500</category>
      <category>BOJ</category>
      <category>DFS</category>
      <category>implementation</category>
      <category>PYTHON</category>
      <category>구현</category>
      <category>백준</category>
      <category>테트로미노</category>
      <category>파이썬</category>
      <author>phanre</author>
      <guid isPermaLink="true">https://phanre.tistory.com/38</guid>
      <comments>https://phanre.tistory.com/38#entry38comment</comments>
      <pubDate>Mon, 11 Jul 2022 08:55:20 +0900</pubDate>
    </item>
    <item>
      <title>[Python/파이썬] - 백준(BOJ) 2583번 : 영역 구하기</title>
      <link>https://phanre.tistory.com/37</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2583&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/2583&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657460433836&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;2583번: 영역 구하기&quot; data-og-description=&quot;첫째 줄에 M과 N, 그리고 K가 빈칸을 사이에 두고 차례로 주어진다. M, N, K는 모두 100 이하의 자연수이다. 둘째 줄부터 K개의 줄에는 한 줄에 하나씩 직사각형의 왼쪽 아래 꼭짓점의 x, y좌표값과 오&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/2583&quot; data-og-url=&quot;https://www.acmicpc.net/problem/2583&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bv8VzV/hyO3seizlD/ViuYxZOV2HJN7asOIYnP51/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480,https://scrap.kakaocdn.net/dn/yQf6Z/hyO3s6rxUH/YkSaGCinxYI6tHPDaeP041/img.png?width=589&amp;amp;height=224&amp;amp;face=0_0_589_224&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2583&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/2583&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bv8VzV/hyO3seizlD/ViuYxZOV2HJN7asOIYnP51/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480,https://scrap.kakaocdn.net/dn/yQf6Z/hyO3s6rxUH/YkSaGCinxYI6tHPDaeP041/img.png?width=589&amp;amp;height=224&amp;amp;face=0_0_589_224');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;2583번: 영역 구하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 M과 N, 그리고 K가 빈칸을 사이에 두고 차례로 주어진다. M, N, K는 모두 100 이하의 자연수이다. 둘째 줄부터 K개의 줄에는 한 줄에 하나씩 직사각형의 왼쪽 아래 꼭짓점의 x, y좌표값과 오&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 BFS를 이용하는 문제입니다.&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;arr 배열에 영역의 정보를 저장하고&amp;nbsp;이미 탐색한 지역인지를 확인하는 visit 배열을 만듭니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 arr 전체 탐색을 하며 arr[i][j] == 0인 경우 queue에 넣은 뒤 visit을 1로 하고 s값을 0으로 세팅합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BFS로 탐색하여 arr 정보가 0이고 visit 정보가 0인 경우 queue에 추가하고 visit을 1로 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;queue에서 popleft 할 때마다 s값을 1씩 증가시키며 queue가 빌 때까지 반복합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;queue가 비면 answer 배열에 s 값을 추가하고 arr 다음값 탐색을 반복합니다.&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;모든 탐색이 끝나면 answer를 출력합니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1657460406629&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
from collections import deque
input = sys.stdin.readline

m, n, k = map(int,input().split())
arr = [[0 for _ in range(n)] for _ in range(m)]
dy = [0,-1,0,1]
dx = [1,0,-1,0]
for _ in range(k):
    x1, y1, x2, y2 = map(int,input().split())
    for i in range(y1, y2):
        for j in range(x1, x2):
            arr[i][j] = 1
queue = deque([])
answer = []
for i in range(m):
    for j in range(n):
        if arr[i][j] == 0:
            queue.append([i, j])
            arr[i][j] = 1
            s = 0
            while queue:
                y, x = queue.popleft()
                s += 1
                for k in range(4):
                    yy = y + dy[k]
                    xx = x + dx[k]
                    if 0 &amp;lt;= yy &amp;lt; m and 0 &amp;lt;= xx &amp;lt; n and arr[yy][xx] == 0:
                        queue.append([yy, xx])
                        arr[yy][xx] = 1
            answer.append(s)
print(len(answer))
print(*sorted(answer),sep=' ')&lt;/code&gt;&lt;/pre&gt;</description>
      <category>백준(BOJ)</category>
      <category>2583</category>
      <category>BFS</category>
      <category>BOJ</category>
      <category>PYTHON</category>
      <category>너비 우선 탐색</category>
      <category>백준</category>
      <category>영역 구하기</category>
      <category>파이썬</category>
      <author>phanre</author>
      <guid isPermaLink="true">https://phanre.tistory.com/37</guid>
      <comments>https://phanre.tistory.com/37#entry37comment</comments>
      <pubDate>Sun, 10 Jul 2022 22:47:33 +0900</pubDate>
    </item>
    <item>
      <title>[Python/파이썬] - 백준(BOJ) 11559번 : Puyo Puyo</title>
      <link>https://phanre.tistory.com/36</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/11559&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/11559&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655324973508&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;11559번: Puyo Puyo&quot; data-og-description=&quot;총 12개의 줄에 필드의 정보가 주어지며, 각 줄에는 6개의 문자가 있다. 이때 .은 빈공간이고 .이 아닌것은 각각의 색깔의 뿌요를 나타낸다. R은 빨강, G는 초록, B는 파랑, P는 보라, Y는 노랑이다. &quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/11559&quot; data-og-url=&quot;https://www.acmicpc.net/problem/11559&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/8QSUQ/hyOME0E83T/J3GQxk6s2a9EKr6fIWakQk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/11559&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/11559&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/8QSUQ/hyOME0E83T/J3GQxk6s2a9EKr6fIWakQk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;11559번: Puyo Puyo&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;총 12개의 줄에 필드의 정보가 주어지며, 각 줄에는 6개의 문자가 있다. 이때 .은 빈공간이고 .이 아닌것은 각각의 색깔의 뿌요를 나타낸다. R은 빨강, G는 초록, B는 파랑, P는 보라, Y는 노랑이다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&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;/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;같은 색깔이 4개 이상 확인 하는 코드를 Check 함수로 만들었고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Check한 원소들을 '.'으로 바꿔주는 코드를 Pop 함수로 만들었고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빈칸을 채우는 코드를 Gravity로 만들었습니다.&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;우선 Check 함수에서는 DFS로 탐색하며 같은 색깔의 원소를 q라는 배열에 담아둡니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 함수가 종료되면 q 배열을 Puyo라는 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;그리고 Pop 함수를 실행하여 Puyo를 for문으로 색깔별로 4개 이상 있으면 그 좌표의 원소를 '.'으로 바꿔줍니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pop을 한번도 하지 않는다면 종료를 시켜야 하기 때문에 종료 조건인 p를 return 해줍니다.&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;이후 Gravity 함수를 실행하여 아래에서부터 '.'을 체크하고 가장 가까운 같은 열의 원소와 바꿔줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 맨 위까지 탐색했는데 '.'만 있는 경우 윗칸에 있는원소를 탐색하지 않아도 되기 때문에 0을 return 해줍니다.&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;이 사이클을 Pop이 더이상 되지 않을때까지 반복한 후 반복한 회수를 print 해줍니다.&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;코드 :&lt;/p&gt;
&lt;pre id=&quot;code_1655324100245&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def Check(y, x, q):
    visit[y][x] = 1
    q.append([y, x])
    for i in range(4):
        yy = y + dy[i]
        xx = x + dx[i]
        if 0 &amp;lt;= yy &amp;lt; 12 and 0 &amp;lt;= xx &amp;lt; 6 and visit[yy][xx] == 0 and arr[yy][xx] == arr[y][x]:
            Check(yy, xx, q)

def Pop():
    p = 0
    for i in Puyo:
        for j in Puyo[i]:
            if len(j) &amp;lt; 4:
                continue
            for yy, xx in j:
                arr[yy][xx] = '.'
            p = 1
        Puyo[i] = []
    return p

def Gravity(y, x):
    for yy in range(y-1, -1, -1):
        if arr[yy][x] != '.':
            arr[y][x] = arr[yy][x]
            arr[yy][x] = '.'
            return 1
    return 0

arr = [list(map(str,input())) for _ in range(12)]
Puyo = {'R' : [], 'G' : [], 'B' : [], 'P' : [], 'Y' : []}

dy = [0,1,0,-1]
dx = [1,0,-1,0]
answer = 0
while True:
    visit = [[0 for _ in range(6)] for _ in range(12)]
    for j in range(6):
        for i in range(11, -1, -1):
            if arr[i][j] == '.':
                break
            if visit[i][j] == 0:
                temp = []
                Check(i, j, temp)
                Puyo[arr[i][j]].append(temp)
    if not Pop():
        break
    answer += 1
    for j in range(6):
        for i in range(11, -1, -1):
            if arr[i][j] == '.':
                if not Gravity(i, j):
                    break
print(answer)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>백준(BOJ)</category>
      <category>14500</category>
      <category>PYTHON</category>
      <category>Simulation</category>
      <category>구현</category>
      <category>백준</category>
      <category>테트로미노</category>
      <category>파이썬</category>
      <author>phanre</author>
      <guid isPermaLink="true">https://phanre.tistory.com/36</guid>
      <comments>https://phanre.tistory.com/36#entry36comment</comments>
      <pubDate>Thu, 16 Jun 2022 05:27:42 +0900</pubDate>
    </item>
    <item>
      <title>[Python/파이썬] - 백준(BOJ) 14500번 : 테트로미노</title>
      <link>https://phanre.tistory.com/35</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/14500&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/14500&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655229283746&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;14500번: 테트로미노&quot; data-og-description=&quot;폴리오미노란 크기가 1&amp;times;1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/14500&quot; data-og-url=&quot;https://www.acmicpc.net/problem/14500&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/CQlQN/hyOK2Ia0km/7LkK0JqxKpC5qZxdNUcpNK/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480,https://scrap.kakaocdn.net/dn/4VbLW/hyOMJ1i5ua/p2qZYnk15zrWkPr7Vn7QOk/img.png?width=500&amp;amp;height=333&amp;amp;face=0_0_500_333&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/14500&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/14500&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/CQlQN/hyOK2Ia0km/7LkK0JqxKpC5qZxdNUcpNK/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480,https://scrap.kakaocdn.net/dn/4VbLW/hyOMJ1i5ua/p2qZYnk15zrWkPr7Vn7QOk/img.png?width=500&amp;amp;height=333&amp;amp;face=0_0_500_333');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;14500번: 테트로미노&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;폴리오미노란 크기가 1&amp;times;1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&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;DFS를 이용하여 4칸 탐색을 하면 T자 모양 테트로미노 제외한 모든 모양을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DFS를 이용해 T자 제외 테트로미노의 최대합을 max함수를 이용하여 전역변수 answer에 저장해둔 후&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;T자 테트로미노를 탐색하여 answer의 최댓값을 조정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후에 answer값을 출력하면 된다.&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;DFS를 이용할 때는 중복 체크를 위해 함수 시작부분에 visit[y][x] = 1을 하였고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 모양의 테트로미노를 사용할 때 잘못된 중복체크를 막기 위해 종료 전 visit[y][x] = 0을 하였다.&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;/p&gt;
&lt;pre id=&quot;code_1655229265206&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
input = sys.stdin.readline

answer = 0
def DFS(y, x, s, v):
    global answer
    if v == 4:
        answer = max(answer, s)
        return
    visit[y][x] = 1
    for i in range(4):
        yy = y + dy[i]
        xx = x + dx[i]
        if 0 &amp;lt;= yy &amp;lt; n and 0 &amp;lt;= xx &amp;lt; m and visit[yy][xx] == 0:
            DFS(yy, xx, s+arr[yy][xx], v+1)
    visit[y][x] = 0
def T(y, x):
    global answer
    for k in range(4):
        s = arr[y][x]
        b = 1
        for i in range(4):
            if i == k:
                continue
            yy = y + dy[i]
            xx = x + dx[i]
            if yy &amp;lt; 0 or xx &amp;lt; 0 or yy &amp;gt;= n or xx &amp;gt;= m:
                b = 0
                break
            s += arr[yy][xx]
        if b:
            answer = max(answer, s)
n, m = map(int,input().split())
arr = [list(map(int,input().split())) for _ in range(n)]
visit = [[0 for _ in range(m)] for _ in range(n)]
dy = [0,1,0,-1]
dx = [1,0,-1,0]
for i in range(n):
    for j in range(m):
        DFS(i, j, 0, 0)
        T(i, j)
print(answer)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>백준(BOJ)</category>
      <category>14500</category>
      <category>BOJ</category>
      <category>bruteforce</category>
      <category>PYTHON</category>
      <category>구현</category>
      <category>백준</category>
      <category>브루트포스</category>
      <category>파이썬</category>
      <author>phanre</author>
      <guid isPermaLink="true">https://phanre.tistory.com/35</guid>
      <comments>https://phanre.tistory.com/35#entry35comment</comments>
      <pubDate>Wed, 15 Jun 2022 03:00:25 +0900</pubDate>
    </item>
    <item>
      <title>[Python/파이썬] - 백준(BOJ) 1806번 : 부분합</title>
      <link>https://phanre.tistory.com/34</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1806&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/1806&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1654452819084&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;1806번: 부분합&quot; data-og-description=&quot;첫째 줄에 N (10 &amp;le; N &amp;lt; 100,000)과&amp;nbsp;S (0 &amp;lt; S &amp;le; 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/1806&quot; data-og-url=&quot;https://www.acmicpc.net/problem/1806&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bvzQLe/hyOFDmW1mM/lMW5N6sMgWI7aaYktsZE00/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1806&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/1806&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bvzQLe/hyOFDmW1mM/lMW5N6sMgWI7aaYktsZE00/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;1806번: 부분합&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 N (10 &amp;le; N &amp;lt; 100,000)과&amp;nbsp;S (0 &amp;lt; S &amp;le; 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에 1 2 3 4 5 를 받는다면 누적합을 구하여 1 3 6 10 15 를 배열에 저장한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 포인터를 두개 생성하여 왼쪽 포인터는 0, 오른쪽 포인터는 1을 가리키게 한다.&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사이의 합이 m(문제에서는 S)을 넘지 않았을 때 오른쪽 포인터가 배열의 크기를 넘어가지 않으면 오른쪽 포인터를 한칸 증가시키고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;넘어간다면 왼쪽 포인터를 한칸 증가시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 만약 사이의 합이 m을 넘어간다면 answer에 정보를 저장하고 왼쪽 포인터를 한칸 증가시킨다.&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;반복하며 한번도 answer에 정보를 저장하지 않으면 0을 출력하고, 정보를 저장했다면 answer를 출력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1654452804526&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
input = sys.stdin.readline
n, m = map(int,input().split())
arr = list(map(int,input().split()))
s = [0]
for i in range(n):
    s.append(s[i] + arr[i])
answer = sys.maxsize
l = 0
r = 1
while l &amp;lt; n:
    if s[r] - s[l] &amp;lt; m:
        if r &amp;lt; n:
            r += 1
        else:
            l += 1
    else:
        answer = min(answer, r-l)
        l += 1

if answer == sys.maxsize:
    print(0)
else:
    print(answer)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>백준(BOJ)</category>
      <category>1806</category>
      <category>BOJ</category>
      <category>PYTHON</category>
      <category>two pointer</category>
      <category>누적합</category>
      <category>두 포인터</category>
      <category>백준</category>
      <category>부분합</category>
      <category>투 포인터</category>
      <category>파이썬</category>
      <author>phanre</author>
      <guid isPermaLink="true">https://phanre.tistory.com/34</guid>
      <comments>https://phanre.tistory.com/34#entry34comment</comments>
      <pubDate>Mon, 6 Jun 2022 08:50:42 +0900</pubDate>
    </item>
    <item>
      <title>[Python/파이썬] - 백준(BOJ) 17499번 : 수열과 시프트 쿼리</title>
      <link>https://phanre.tistory.com/33</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/17499&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/17499&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1654444022043&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;17499번: 수열과 시프트 쿼리&quot; data-og-description=&quot;첫 번째 줄에 Q개의 연산을 차례대로 수행한 후&amp;nbsp;a1, a2, &amp;hellip;, aN&amp;nbsp;을 공백을 사이에 두고 출력합니다.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/17499&quot; data-og-url=&quot;https://www.acmicpc.net/problem/17499&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fPOBt/hyOEqbEOtB/5Ab7LMpkuNN0J8HZAHe8X1/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/17499&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/17499&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fPOBt/hyOEqbEOtB/5Ab7LMpkuNN0J8HZAHe8X1/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;17499번: 수열과 시프트 쿼리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫 번째 줄에 Q개의 연산을 차례대로 수행한 후&amp;nbsp;a1, a2, &amp;hellip;, aN&amp;nbsp;을 공백을 사이에 두고 출력합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순 append, pop을 이용하면 시간초과가 나오므로 포인터를 활용해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 p를 index 0으로 잡고 오른쪽으로 시프트하면 -, 왼쪽으로 시프트하면 + 하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 p값을 배열의 첫번째 인덱스라고 생각하고 더하고, 프린트하면 된다.&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;처음에 시간초과가 떠서 문제를 확인해보니 input에서 시간을 너무 잡아먹는 것 같아&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sys 라이브러리의 sys.stdin.readline을 이용해서 input에 시간을 줄였더니 AC를 받았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1654444033694&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
input = sys.stdin.readline
n, q = map(int,input().split())
arr = list(map(int,input().split()))
p = 0

for i in range(q):
    query = list(map(int,input().split()))
    if query[0] == 1:
        arr[(p+query[1]-1)%n] += query[2]
    elif query[0] == 2:
        p -= query[1]
    else:
        p += query[1]
        
for i in range(p, p+n):
    print(arr[i%n], end=' ')&lt;/code&gt;&lt;/pre&gt;</description>
      <category>백준(BOJ)</category>
      <category>17499</category>
      <category>BOJ</category>
      <category>PYTHON</category>
      <category>Simulation</category>
      <category>sys</category>
      <category>sys.stdin.readline</category>
      <category>구현</category>
      <category>백준</category>
      <category>수열과 시프트 쿼리</category>
      <category>파이썬</category>
      <author>phanre</author>
      <guid isPermaLink="true">https://phanre.tistory.com/33</guid>
      <comments>https://phanre.tistory.com/33#entry33comment</comments>
      <pubDate>Mon, 6 Jun 2022 00:52:01 +0900</pubDate>
    </item>
    <item>
      <title>[Python/파이썬] - 백준(BOJ) 2467번 : 용액</title>
      <link>https://phanre.tistory.com/32</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2467&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/2467&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1654363965319&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;2467번: 용액&quot; data-og-description=&quot;첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 오름차순으로 입력되며, 이 수들은 모두 -&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/2467&quot; data-og-url=&quot;https://www.acmicpc.net/problem/2467&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/mnCRT/hyOEgGeOln/P9KY9asuXyekPIq7Naj8GK/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2467&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/2467&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/mnCRT/hyOEgGeOln/P9KY9asuXyekPIq7Naj8GK/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;2467번: 용액&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 오름차순으로 입력되며, 이 수들은 모두 -&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&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;/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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포인터값이 양수이면 오른쪽 포인터를 왼쪽으로 한칸 옮기면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 포인터가 가리키는 값끼리의 합의 절대값을 min값과 비교하여 더 작다면 변경해준다.&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;합이 0이면 더이상 작아 질 수 없기 때문에 바로 프린트하고 종료하며&amp;nbsp;while문을 탈출하면 저장해둔 값을 프린트한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1654363936512&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
input = sys.stdin.readline
n = int(input())
arr = list(map(int,input().split()))
l, r = 0, n-1
m = sys.maxsize
while l &amp;lt; r:
    s = arr[l] + arr[r]
    if m &amp;gt; abs(s):
        answer = [arr[l], arr[r]]
        m = abs(s)
    if s &amp;lt; 0:
        l += 1
    elif s &amp;gt; 0:
        r -= 1
    else:
        break
print(*answer,sep=' ')&lt;/code&gt;&lt;/pre&gt;</description>
      <category>백준(BOJ)</category>
      <category>2467</category>
      <category>BOJ</category>
      <category>PYTHON</category>
      <category>two pointer</category>
      <category>두 포인터</category>
      <category>백준</category>
      <category>용액</category>
      <category>이분 탐색</category>
      <category>투 포인터</category>
      <category>파이썬</category>
      <author>phanre</author>
      <guid isPermaLink="true">https://phanre.tistory.com/32</guid>
      <comments>https://phanre.tistory.com/32#entry32comment</comments>
      <pubDate>Sun, 5 Jun 2022 02:37:57 +0900</pubDate>
    </item>
    <item>
      <title>[Python/파이썬] - 백준(BOJ) 14442번 : 벽 부수고 이동하기 2</title>
      <link>https://phanre.tistory.com/31</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/14442&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/14442&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1654273337689&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;14442번: 벽 부수고 이동하기 2&quot; data-og-description=&quot;첫째 줄에 N(1 &amp;le; N &amp;le; 1,000), M(1 &amp;le; M &amp;le; 1,000), K(1 &amp;le; K &amp;le; 10)이 주어진다. 다음 N개의 줄에 M개의 숫자로 맵이 주어진다. (1, 1)과 (N, M)은 항상 0이라고 가정하자.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/14442&quot; data-og-url=&quot;https://www.acmicpc.net/problem/14442&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/U8Fz0/hyOEhqJgkd/5hrq8nRdzak1oQPU0KEKek/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/14442&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/14442&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/U8Fz0/hyOEhqJgkd/5hrq8nRdzak1oQPU0KEKek/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;14442번: 벽 부수고 이동하기 2&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 N(1 &amp;le; N &amp;le; 1,000), M(1 &amp;le; M &amp;le; 1,000), K(1 &amp;le; K &amp;le; 10)이 주어진다. 다음 N개의 줄에 M개의 숫자로 맵이 주어진다. (1, 1)과 (N, M)은 항상 0이라고 가정하자.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&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;BFS로 (0,0)에서 시작하여 (n-1, m-1)에 도착할 때 까지 K개 이하의 벽을 부수고 진행하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vst, brk 배열을 생성하여 각각 이동 블록 개수와 부순 벽 개수를 저장하고&amp;nbsp;brk가 k를 넘으면 멈추게 한다.&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;pre id=&quot;code_1654273342094&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
from collections import deque
input = sys.stdin.readline

def bfs():
    while queue:
        y, x = queue.popleft()
        for i in range(4):
            yy = y + dy[i]
            xx = x + dx[i]
            if 0 &amp;lt;= yy &amp;lt; n and 0 &amp;lt;= xx &amp;lt; m:
                if yy == n-1 and xx == m-1:
                    print(vst[y][x]+1)
                    return
                if arr[yy][xx] == 1:
                    if brk[yy][xx] &amp;lt;= brk[y][x]+1 and vst[yy][xx] &amp;lt;= vst[y][x]+1:
                        continue
                    if brk[y][x]+1 &amp;gt; k:
                        continue
                    vst[yy][xx] = vst[y][x]+1
                    brk[yy][xx] = brk[y][x]+1
                    queue.append([yy, xx])

                else:
                    if brk[yy][xx] &amp;lt;= brk[y][x] and vst[yy][xx] &amp;lt;= vst[y][x]+1:
                        continue
                    vst[yy][xx] = vst[y][x]+1
                    brk[yy][xx] = brk[y][x]
                    queue.append([yy, xx])
    print(-1)

n, m, k = map(int,input().split())
arr = [list(map(int, input().strip())) for _ in range(n)]
vst = [[sys.maxsize for _ in range(m)] for _ in range(n)]
brk = [[0 for _ in range(m)] for _ in range(n)]
dy = [0,1,0,-1]
dx = [1,0,-1,0]
queue = deque([[0, 0]])
vst[0][0] = 1
if n == 1 and m == 1:
    print(1)
else:
    bfs()&lt;/code&gt;&lt;/pre&gt;</description>
      <category>백준(BOJ)</category>
      <category>14442</category>
      <category>BFS</category>
      <category>BOJ</category>
      <category>PYTHON</category>
      <category>너비 우선 탐색</category>
      <category>백준</category>
      <category>벽 부수고 이동하기2</category>
      <category>파이썬</category>
      <author>phanre</author>
      <guid isPermaLink="true">https://phanre.tistory.com/31</guid>
      <comments>https://phanre.tistory.com/31#entry31comment</comments>
      <pubDate>Sat, 4 Jun 2022 21:14:25 +0900</pubDate>
    </item>
  </channel>
</rss>