<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>딩딩크롱의 블로그</title>
    <link>https://dingdingcrong.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 21 Jul 2026 18:51:50 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>딩딩크롱</managingEditor>
    <image>
      <title>딩딩크롱의 블로그</title>
      <url>https://tistory1.daumcdn.net/tistory/5446931/attach/37418244d351426eaec603d56e7e5388</url>
      <link>https://dingdingcrong.tistory.com</link>
    </image>
    <item>
      <title>개념 #12. 트리 순회(Tree traversal) 후위 순회, 전위 순회, 중위 순회</title>
      <link>https://dingdingcrong.tistory.com/291</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;트리 순회&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트리 순회(Tree traversal)는 트리 구조에서 각각의 노드를 정확히 한 번만, 체계적인 방법으로 방문하는 과정을 말한다. 이는 노드를 방문하는 순서에 따라 후위 순회, 전위 순회, 중위 순회, 레벨 순회가 있다. 보통 설명할 때는 이진 트리를 기반으로 설명하지만 다른 모든 트리에서 일반화를 시킬 수 있다.&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;후위 순회(postorder traversal)는 자식들 노드를 방문하고 자신의 노드를 방문하는 것을 말한다.&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1690563587682&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;postorder( node )
    if (node.visited == false) 
        postorder( node-&amp;gt;left ) 
        postorder( node-&amp;gt;right )
        node.visited = true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;전위 순회&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전위&amp;nbsp;순회(preorder&amp;nbsp;traversal)는&amp;nbsp;먼저&amp;nbsp;자신의&amp;nbsp;노드를&amp;nbsp;방문하고&amp;nbsp;그&amp;nbsp;다음&amp;nbsp;노드들을&amp;nbsp;방문하는&amp;nbsp;것을&amp;nbsp;말한다.&amp;nbsp;(DFS)&lt;/p&gt;
&lt;pre id=&quot;code_1690563673789&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;preorder( node )
    if (node.visited == false)
        node.visited = true
        preorder( node-&amp;gt;left )
        preorder( node-&amp;gt;right )&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;중위 순회&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중위&amp;nbsp;순회(inorder&amp;nbsp;traversal)는&amp;nbsp;왼쪽&amp;nbsp;노드를&amp;nbsp;먼저&amp;nbsp;방문&amp;nbsp;그&amp;nbsp;다음의&amp;nbsp;자신의&amp;nbsp;노드를&amp;nbsp;방문하고&amp;nbsp;그&amp;nbsp;다음&amp;nbsp;오른쪽&amp;nbsp;노드를&amp;nbsp;방문하는&amp;nbsp;것을&amp;nbsp;말한다.&lt;/p&gt;
&lt;pre id=&quot;code_1690563725688&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;inorder( node )
    if (node.visited == false) 
        inorder( node-&amp;gt;left )
        node.visited = true
        inorder( node-&amp;gt;right )&lt;/code&gt;&lt;/pre&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;레벨 순회(lever traversal)는 BFS&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;Q. 아래의 그래프가 주어졌을 때 preorder, inorder, postorder를 구현하라.&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;403&quot; data-origin-height=&quot;465&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEKKz7/btsplL5iHu5/rE1fdKRK3g8iE0YJliaXu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEKKz7/btsplL5iHu5/rE1fdKRK3g8iE0YJliaXu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEKKz7/btsplL5iHu5/rE1fdKRK3g8iE0YJliaXu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEKKz7%2FbtsplL5iHu5%2FrE1fdKRK3g8iE0YJliaXu1%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;403&quot; height=&quot;465&quot; data-origin-width=&quot;403&quot; data-origin-height=&quot;465&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1690564075963&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;adj = [[] for _ in range(1004)]
visited = [0] * 1004

def postOrder(here):
    if visited[here] == 0:
        if len(adj[here]) == 1:
            postOrder(adj[here][0])
        if len(adj[here]) == 2:
            postOrder(adj[here][0])
            postOrder(adj[here][1])
        visited[here] = 1
        print(here, end=' ')

def preOrder(here):
    if visited[here] == 0:
        visited[here] = 1
        print(here, end=' ')
        if len(adj[here]) == 1:
            preOrder(adj[here][0])
            
        if len(adj[here]) == 2:
            preOrder(adj[here][0])
            preOrder(adj[here][1])

def inOrder(here):
    if visited[here] == 0:
        if len(adj[here]) == 1:
            inOrder(adj[here][0])
            visited[here] = 1
            print(here, end=' ')
        elif len(adj[here]) == 2:
            inOrder(adj[here][0])
            visited[here] = 1
            print(here, end=' ')
            inOrder(adj[here][1])
        else:
            visited[here] = 1
            print(here, end=' ')

adj[1].extend([2, 3])
adj[2].extend([4, 5])
root = 1
print(&quot;\n트리순회 : postOrder&quot;)
postOrder(root)
visited = [0] * 1004  # Reset visited array
print(&quot;\n트리순회 : preOrder&quot;)
preOrder(root)
visited = [0] * 1004  # Reset visited array
print(&quot;\n트리순회 : inOrder&quot;)
inOrder(root)

'''
트리순회 : postOrder
4 5 2 3 1
트리순회 : preOrder
1 2 4 5 3
트리순회 : inOrder
4 2 5 1 3
'''&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;466&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/soeyA/btspk8Nixm4/Ky6bGDVYV4Gz8D95592wP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/soeyA/btspk8Nixm4/Ky6bGDVYV4Gz8D95592wP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/soeyA/btspk8Nixm4/Ky6bGDVYV4Gz8D95592wP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsoeyA%2Fbtspk8Nixm4%2FKy6bGDVYV4Gz8D95592wP0%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;966&quot; height=&quot;466&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;466&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>☢️ CT</category>
      <category>코딩테스트</category>
      <author>딩딩크롱</author>
      <guid isPermaLink="true">https://dingdingcrong.tistory.com/291</guid>
      <comments>https://dingdingcrong.tistory.com/291#entry291comment</comments>
      <pubDate>Sat, 29 Jul 2023 02:11:55 +0900</pubDate>
    </item>
    <item>
      <title>[AWS EC2 + Docker + Github Actions + Spring Boot] 자동 배포 환경</title>
      <link>https://dingdingcrong.tistory.com/289</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;540&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l6mn9/btsnGZ5cHSb/uPHvQPIEb3QNiPELb88rg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l6mn9/btsnGZ5cHSb/uPHvQPIEb3QNiPELb88rg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l6mn9/btsnGZ5cHSb/uPHvQPIEb3QNiPELb88rg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl6mn9%2FbtsnGZ5cHSb%2FuPHvQPIEb3QNiPELb88rg0%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;960&quot; height=&quot;540&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;540&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Dockerfile 생성하기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;Dockerfile&lt;/code&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1689440511539&quot; class=&quot;gradle&quot; data-ke-language=&quot;gradle&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FROM openjdk:17-jdk
COPY build/libs/*.jar app.jar
EXPOSE 8080
ENTRYPOINT [&quot;java&quot;, &quot;-jar&quot;, &quot;-Dspring.profiles.active=prod&quot;, &quot;/app.jar&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;build.gradle&lt;/code&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1689440612422&quot; class=&quot;gradle&quot; data-ke-language=&quot;gradle&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;jar {
    enabled = false
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Github 리포지토리 생성 후 push&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;AWS EC2 인스턴스 생성하기&lt;/b&gt;&lt;/h2&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;탄력적 IP 주소
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;인스턴스의 Publid IP&lt;/b&gt;는 고정된 IP 주소가 아니라 &lt;b&gt;유동적인 IP 주소&lt;/b&gt;이다.&lt;/li&gt;
&lt;li&gt;EC2 인스턴스를 STOP 하고 중지 상태에서 새롭게 실행 상태로 변경하면, &lt;b&gt;기존에 할당받은 IP 주소가 변경&lt;/b&gt;되어 버린다.&lt;/li&gt;
&lt;li&gt;이를 해결하고자 AWS에서는 한 번 할당받으면 절대 바뀌지 않는 &lt;b&gt;Elastic IP&lt;/b&gt;를 제공한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;  &lt;/b&gt;&lt;/b&gt;EC2 &amp;times; Docker&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1689441416991&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 패키지 원격 설치 도구인 YUM 업데이트한다.
sudo yum update -y

# YUM을 이용해 docker 설치한다.
sudo yum install -y docker

# 리눅스 계정인 ec2-user에 docker 사용 시 sudo를 붙이지 않고도 사용할 수 있게 한다.
sudo usermod -aG docker ec2-user

# docker 데몬 부팅 시 자동 시작 서비스로 등록하고 재시작한 뒤 EC2를 재시작한다.
sudo systemctl enable docker
sudo systemctl restart docker
sudo reboot

# 재시작을 확인한 뒤 putty를 재접속한 다음 docker version의 서버(Server:)를 통해 정상 동작하는 도커를 확인한다.
docker version&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 중인 모든 컨테이너를 종료하려면&lt;/p&gt;
&lt;pre id=&quot;code_1689444394647&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker kill $(docker ps -a -q)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  EC2 &amp;times; Git&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1689441565665&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# git 패키지를 설치한다.
sudo yum -y install git

# git을 다운로드 한다.
git clone [URL]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Git Actions를 사용해 자동 배포하기&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Actions &amp;gt; New workflow &amp;gt; Java with Gradle 선택&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;./github/workflows/github-actions.yml&lt;/code&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1689441802475&quot; class=&quot;yml yaml&quot; data-ke-language=&quot;yml&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;name: Java CI with Gradle

on:
  push:
    branches: [ &quot;main&quot; ]
  pull_request:
    branches: [ &quot;main&quot; ]

permissions:
  contents: read

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3
    
    - name: Setup Java JDK 17
      uses: actions/setup-java@v3
      with:
        java-version: '17'
        distribution: 'temurin'        
      
    - name: Make application.yml
      run: |
        cd ./src/main/resources
        touch ./application.yml
        echo &quot;${{ secrets.APPLICATION_YML }}&quot; &amp;gt; ./application.yml
        
    - name: Run chmod to make gradlew executable
      run: chmod +x gradlew
        
    - name: Gradle Build Action
      uses: gradle/gradle-build-action@v2.6.0
      with:
        arguments: clean build
      
    - name: Docker Login
      uses: docker/login-action@v2.2.0
      with:
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_PASSWORD }}
        
    - name: Build and push Docker images
      uses: docker/build-push-action@v4.1.1
      with:
        context: .
        push: true
        tags: ${{ secrets.DOCKER_USERNAME }}/spring-boot-server

    - name: Deploy to AWS EC2
      uses: appleboy/ssh-action@v0.1.10
      with:
        host: ${{ secrets.HOST }}
        username: ec2-user
        key: ${{ secrets.PRIVATE_KEY }} # pem key
        script: |
          docker pull ${{ secrets.DOCKER_USERNAME }}/spring-boot-server
          docker stop $(docker ps -a -q)
          docker run -d --log-driver=syslog -p 8080:8080 ${{ secrets.DOCKER_USERNAME }}/spring-boot-server
          docker rm $(docker ps --filter 'status=exited' -a -q)
          docker image prune -a -f&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Settings &amp;gt; Secrets and variables &amp;gt; Actions &amp;gt; New repository secrets&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;449&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NYToX/btsnD2bmBXb/94KQK44q3xsZHinHh9Pcnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NYToX/btsnD2bmBXb/94KQK44q3xsZHinHh9Pcnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NYToX/btsnD2bmBXb/94KQK44q3xsZHinHh9Pcnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNYToX%2FbtsnD2bmBXb%2F94KQK44q3xsZHinHh9Pcnk%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;887&quot; height=&quot;449&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;449&quot;/&gt;&lt;/span&gt;&lt;/figure&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;b&gt;APPLICATION_YML&lt;/b&gt; : DB의 정보를 담고 있는 application.yml을 .gitignore에 추가하고 파일 내용을 비공개로 하여 생성하도록 하는 값&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DOCKER_PASSWORD&lt;/b&gt; : 도커 허브 비밀번호&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DOCKER_USERNAME&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 도커 허브 사용자 이름&lt;/li&gt;
&lt;li&gt;&lt;b&gt;HOST&lt;/b&gt; : EC2 탄력적 IP 주소&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PRIVATE_KEY&lt;/b&gt; : EC2 생성 시 생성한 pem 키 (BEGIN END 라인 포함)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1457&quot; data-origin-height=&quot;102&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MhWUc/btsnEWhmfVS/DUXeGzGWTUqsCux5QTG4D0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MhWUc/btsnEWhmfVS/DUXeGzGWTUqsCux5QTG4D0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MhWUc/btsnEWhmfVS/DUXeGzGWTUqsCux5QTG4D0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMhWUc%2FbtsnEWhmfVS%2FDUXeGzGWTUqsCux5QTG4D0%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;1457&quot; height=&quot;102&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1457&quot; data-origin-height=&quot;102&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 완료되면 yml 파일 생성, 이미지 생성 및 도커 허브 업로드, 서버에서 실행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;에러 사항&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Git Actions를 사용하면서 다양한 에러를 마주했다. &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;1. ssh.ParsePrivateKey: ssh: no key found (✅)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Amazon Linux 2023 AMI ➔ &lt;span style=&quot;background-color: #ffffff; color: #16191f; text-align: left;&quot;&gt;Amazon Linux 2 AMI&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/appleboy/ssh-action/issues/6&quot;&gt;https://github.com/appleboy/ssh-action/issues/6&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/appleboy/ssh-action#setting-up-ssh-key&quot;&gt;https://github.com/appleboy/ssh-action#setting-up-ssh-key&lt;/a&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;2. dial tcp ~:22 i/o timeout' &lt;b&gt;(✅)&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dev.to/tarohida/error-on-appleboyssh-action-dial-tcp-lookup-exampleexample-on-19202153-io-timeout-6ng&quot;&gt;https://dev.to/tarohida/error-on-appleboyssh-action-dial-tcp-lookup-exampleexample-on-19202153-io-timeout-6ng&lt;/a&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;3. 서버 구동 시 제대로 동작하지 않는 현상 (&lt;b&gt;&lt;b&gt;✅&lt;/b&gt;&lt;/b&gt;)&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://zzang9ha.tistory.com/331&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://zzang9ha.tistory.com/331&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- AWS EC2 보안 그룹의 8080 포트에 대해 인바운드 규칙을 설정하지 않아서 생긴 문제였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 톰캣 포트(8080)을 붙여야 접속이 가능하므로 (80 ➔ 8080) &lt;b&gt;포트 포워딩&lt;/b&gt;을 해주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 80 포트에 대한 인바운드 규칙도 추가하였다.&lt;/p&gt;
&lt;pre id=&quot;code_1689445956301&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 80 port로 들어오면 8080 port로 재매핑
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

# 포트 포워딩 삭제
sudo iptables -t nat -D PREROUTING [num]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;느낀점&lt;/b&gt;&lt;/h2&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;blockquote data-ke-style=&quot;style3&quot;&gt;현업에서는 보통 DB를 RDS에 올려놓고 사용하는지? 도커 이미지를 생성해 사용하는지? 궁금해졌다.&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;367&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/egopCM/btsnILlyjV8/PKIeCY2ijdmt5YvYyx0DF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/egopCM/btsnILlyjV8/PKIeCY2ijdmt5YvYyx0DF0/img.png&quot; data-alt=&quot;이렇게 구현하고자 했지만 실패했다..ㅠ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/egopCM/btsnILlyjV8/PKIeCY2ijdmt5YvYyx0DF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FegopCM%2FbtsnILlyjV8%2FPKIeCY2ijdmt5YvYyx0DF0%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;600&quot; height=&quot;367&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;367&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이렇게 구현하고자 했지만 실패했다..ㅠ&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>기타/정리.zip</category>
      <category>AWS EC2</category>
      <category>docker</category>
      <category>Git Actions</category>
      <category>Spring Boot</category>
      <author>딩딩크롱</author>
      <guid isPermaLink="true">https://dingdingcrong.tistory.com/289</guid>
      <comments>https://dingdingcrong.tistory.com/289#entry289comment</comments>
      <pubDate>Sun, 16 Jul 2023 02:59:48 +0900</pubDate>
    </item>
    <item>
      <title>[백준] 1992번: 쿼드트리</title>
      <link>https://dingdingcrong.tistory.com/249</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1992&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/1992&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1685373635772&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;1992번: 쿼드트리&quot; data-og-description=&quot;첫째 줄에는 영상의 크기를 나타내는 숫자 N 이 주어진다. N 은 언제나 2의 제곱수로 주어지며, 1 &amp;le; N &amp;le; 64의 범위를 가진다. 두 번째 줄부터는 길이 N의 문자열이 N개 들어온다. 각 문자열은 0 또&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/1992&quot; data-og-url=&quot;https://www.acmicpc.net/problem/1992&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ddxUKF/hySNhgNdLT/oPyffmsKOodgI8IpjR0su0/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/1992&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/1992&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ddxUKF/hySNhgNdLT/oPyffmsKOodgI8IpjR0su0/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;1992번: 쿼드트리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에는 영상의 크기를 나타내는 숫자 N 이 주어진다. N 은 언제나 2의 제곱수로 주어지며, 1 &amp;le; N &amp;le; 64의 범위를 가진다. 두 번째 줄부터는 길이 N의 문자열이 N개 들어온다. 각 문자열은 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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;재귀&lt;/b&gt;를 사용해 풀었습니다.&lt;br /&gt;현재 구역의 색상이 모두 같으면 해당 색상을 출력합니다.&lt;br /&gt;만약 다르다면 4개의 구역으로 분할하고 재확인해 괄호와 함께 출력합니다.&lt;br /&gt;재귀를&amp;nbsp;이용하여&amp;nbsp;색상이&amp;nbsp;다르면&amp;nbsp;계속해서&amp;nbsp;분할하여&amp;nbsp;확인하게&amp;nbsp;됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;자바&lt;/blockquote&gt;
&lt;pre id=&quot;code_1685377857325&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.*;
import java.io.*;

public class Main {
    public static char[][] image;

    public static boolean check(int x, int y, int n) {
        for (int i = x; i &amp;lt; x + n; i++) {
            for (int j = y; j &amp;lt; y + n; j++) {
                if (image[i][j] != image[x][y]) {
                    return false;
                }
            }
        }
        return true;
    }

    public static void QuadTree(int x, int y, int n) {
        if (check(x, y, n)) {
            System.out.print(image[x][y]);
        } else {
            System.out.print('(');
            n /= 2;
            QuadTree(x, y, n);
            QuadTree(x, y + n, n);
            QuadTree(x + n, y, n);
            QuadTree(x + n, y + n, n);
            System.out.print(')');
        }
    }

    public static void main(String args[]) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());

        image = new char[N][N];
        for (int i = 0; i &amp;lt; N; i++) {
            image[i] = br.readLine().toCharArray();
        }

        QuadTree(0, 0, N);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;파이썬&lt;/blockquote&gt;
&lt;pre id=&quot;code_1683968774095&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


def check(x, y, n):
    for i in range(x, x + n):
        for j in range(y, y + n):
            if image[i][j] != image[x][y]:
                return False
    return True


def QuadTree(x, y, n):
    if check(x, y, n):
        print(image[x][y], end=&quot;&quot;)
    else:
        print(&quot;(&quot;, end=&quot;&quot;)
        n //= 2
        QuadTree(x, y, n)
        QuadTree(x, y + n, n)
        QuadTree(x + n, y, n)
        QuadTree(x + n, y + n, n)
        print(&quot;)&quot;, end=&quot;&quot;)


N = int(input())
image = [list(input().rstrip()) for _ in range(N)]

QuadTree(0, 0, N)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>  코딩테스트/알고리즘</category>
      <category>java</category>
      <category>Python</category>
      <category>코딩테스트</category>
      <author>딩딩크롱</author>
      <guid isPermaLink="true">https://dingdingcrong.tistory.com/249</guid>
      <comments>https://dingdingcrong.tistory.com/249#entry249comment</comments>
      <pubDate>Tue, 30 May 2023 01:31:29 +0900</pubDate>
    </item>
    <item>
      <title>[백준] 5052번: 전화번호 목록</title>
      <link>https://dingdingcrong.tistory.com/248</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/5052&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/5052&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1685372081358&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;5052번: 전화번호 목록&quot; data-og-description=&quot;첫째 줄에 테스트 케이스의 개수 t가 주어진다. (1 &amp;le; t &amp;le; 50) 각 테스트 케이스의 첫째 줄에는 전화번호의 수 n이 주어진다. (1 &amp;le; n &amp;le; 10000) 다음 n개의 줄에는 목록에 포함되어 있는 전화번호가 &quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/5052&quot; data-og-url=&quot;https://www.acmicpc.net/problem/5052&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bMvDgi/hySM8dd6yV/J8dlaD1yPkjIazmsKcQAFK/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/5052&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/5052&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bMvDgi/hySM8dd6yV/J8dlaD1yPkjIazmsKcQAFK/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;5052번: 전화번호 목록&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 테스트 케이스의 개수 t가 주어진다. (1 &amp;le; t &amp;le; 50) 각 테스트 케이스의 첫째 줄에는 전화번호의 수 n이 주어진다. (1 &amp;le; n &amp;le; 10000) 다음 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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;풀이&lt;/b&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;파이썬&lt;/blockquote&gt;
&lt;pre id=&quot;code_1683968774095&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


def solution():
    for i in range(n-1):
        if phone_num[i+1].startswith(phone_num[i]):
            return &quot;NO&quot;
    return &quot;YES&quot;


t = int(input())
for _ in range(t):
    n = int(input())
    phone_num = sorted([input().rstrip() for _ in range(n)])
    print(solution())&lt;/code&gt;&lt;/pre&gt;</description>
      <category>  코딩테스트/알고리즘</category>
      <category>Python</category>
      <category>코딩테스트</category>
      <author>딩딩크롱</author>
      <guid isPermaLink="true">https://dingdingcrong.tistory.com/248</guid>
      <comments>https://dingdingcrong.tistory.com/248#entry248comment</comments>
      <pubDate>Mon, 29 May 2023 23:57:12 +0900</pubDate>
    </item>
    <item>
      <title>[백준] 1967번: 트리의 지름</title>
      <link>https://dingdingcrong.tistory.com/245</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1967&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/1967&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1684160686919&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;1967번: 트리의 지름&quot; data-og-description=&quot;파일의 첫 번째 줄은 노드의 개수 n(1 &amp;le; n &amp;le; 10,000)이다. 둘째 줄부터 n-1개의 줄에 각 간선에 대한 정보가 들어온다. 간선에 대한 정보는 세 개의 정수로 이루어져 있다. 첫 번째 정수는 간선이 연&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/1967&quot; data-og-url=&quot;https://www.acmicpc.net/problem/1967&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1967&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/1967&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&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;1967번: 트리의 지름&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;파일의 첫 번째 줄은 노드의 개수 n(1 &amp;le; n &amp;le; 10,000)이다. 둘째 줄부터 n-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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DFS(깊이 우선 탐색)&lt;/b&gt;를 사용해 풀었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;양방향 간선이므로 &lt;code&gt;graph&lt;/code&gt;의 부모, 자식 노드에 해당하는 공간에 서로를 가중치와 함께 추가합니다.&lt;br /&gt;트리의&amp;nbsp;지름을&amp;nbsp;구하는&amp;nbsp;방법은&amp;nbsp;다음과&amp;nbsp;같습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;루트 노드로부터 거리가 가장 먼 노드를 구합니다.&lt;/li&gt;
&lt;li&gt;구한 노드로부터 거리가 가장 먼 노드까지의 거리를 구합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;파이썬&lt;/blockquote&gt;
&lt;pre id=&quot;code_1683968774095&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys

sys.setrecursionlimit(10**6)

input = sys.stdin.readline

n = int(input())
graph = [[] for _ in range(n + 1)]

for _ in range(n - 1):
    n1, n2, w = map(int, input().split())
    graph[n1].append((n2, w))
    graph[n2].append((n1, w))


def DFS(x, w):
    for nx, nw in graph[x]:
        if distance[nx] == -1:
            distance[nx] = w + nw
            DFS(nx, distance[nx])


distance = [-1] * (n + 1)
distance[1] = 0
DFS(1, 0)

start = distance.index(max(distance))
distance = [-1] * (n + 1)
distance[start] = 0
DFS(start, 0)

print(max(distance))&lt;/code&gt;&lt;/pre&gt;</description>
      <category>  코딩테스트/알고리즘</category>
      <category>Python</category>
      <category>코딩테스트</category>
      <author>딩딩크롱</author>
      <guid isPermaLink="true">https://dingdingcrong.tistory.com/245</guid>
      <comments>https://dingdingcrong.tistory.com/245#entry245comment</comments>
      <pubDate>Mon, 15 May 2023 23:30:32 +0900</pubDate>
    </item>
    <item>
      <title>[백준] 16236번: 아기 상어</title>
      <link>https://dingdingcrong.tistory.com/244</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/16236&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/16236&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1683968823402&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;16236번: 아기 상어&quot; data-og-description=&quot;N&amp;times;N 크기의 공간에 물고기 M마리와 아기 상어 1마리가 있다. 공간은 1&amp;times;1 크기의 정사각형 칸으로 나누어져 있다. 한 칸에는 물고기가 최대 1마리 존재한다. 아기 상어와 물고기는 모두 크기를 가&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/16236&quot; data-og-url=&quot;https://www.acmicpc.net/problem/16236&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cSkhaD/hySBuAl9BE/TjqiXiZMIqGhEKm2FQscb0/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/16236&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/16236&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cSkhaD/hySBuAl9BE/TjqiXiZMIqGhEKm2FQscb0/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;16236번: 아기 상어&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;N&amp;times;N 크기의 공간에 물고기 M마리와 아기 상어 1마리가 있다. 공간은 1&amp;times;1 크기의 정사각형 칸으로 나누어져 있다. 한 칸에는 물고기가 최대 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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;BFS(너비&amp;nbsp;우선&amp;nbsp;탐색)&lt;/b&gt;를&amp;nbsp;사용해&amp;nbsp;풀었습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;아기 상어의 위치(&lt;code&gt;baby_shark&lt;/code&gt;)를 찾아 해당 위치의 값을 0으로 바꾸고 위치를 저장합니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BFS&lt;/code&gt; 함수 내의 &lt;code&gt;fish&lt;/code&gt; 리스트에는 같은 거리 상에 있는 먹을 물고기들을 저장합니다.&lt;/li&gt;
&lt;li&gt;상하좌우를 확인하며 0 혹은 같은 크기의 물고기는 지나가고, 아기 상어보다 작은 물고기를&amp;nbsp;&lt;code&gt;fish&lt;/code&gt; 리스트에 추가합니다.&lt;/li&gt;
&lt;li&gt;만약 먹을 수 있는 물고기가 있다면 물고기를 맨 위쪽, 왼쪽 순으로 정렬해 그 중 첫 번째 물고기를 선택합니다.&lt;/li&gt;
&lt;li&gt;총 시간(&lt;code&gt;time&lt;/code&gt;)에 걸린 시간(&lt;code&gt;t&lt;/code&gt;)을 추가합니다.&lt;/li&gt;
&lt;li&gt;그러나, 공간에 더 이상 먹을 수 있는 물고기가 없다면 총 시간(&lt;code&gt;time&lt;/code&gt;)을 출력하고 마칩니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;파이썬&lt;/blockquote&gt;
&lt;pre id=&quot;code_1683968774095&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

dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

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


def getStart():
    for i in range(N):
        for j in range(N):
            if graph[i][j] == 9:
                graph[i][j] = 0
                return (i, j)


def BFS(x, y):
    fish = []
    L = 0
    queue = deque()
    visited = [[False] * N for _ in range(N)]
    visited[x][y] = True
    queue.append((x, y))
    while queue:
        for _ in range(len(queue)):
            x, y = queue.popleft()
            for i in range(4):
                nx = x + dx[i]
                ny = y + dy[i]
                if 0 &amp;lt;= nx &amp;lt; N and 0 &amp;lt;= ny &amp;lt; N and not visited[nx][ny]:
                    if graph[nx][ny] == 0 or graph[nx][ny] == size:
                        visited[nx][ny] = True
                        queue.append((nx, ny))
                    elif graph[nx][ny] &amp;lt; size:
                        visited[nx][ny] = True
                        fish.append((nx, ny))
        L += 1
        if fish:
            fish.sort()
            graph[fish[0][0]][fish[0][1]] = 0
            return [fish[0], L]
    return [[], 0]


time = 0
baby_shark = getStart()
size = 2
eaten = 0

while True:
    baby_shark, t = BFS(baby_shark[0], baby_shark[1])
    if t == 0:
        print(time)
        break
    else:
        time += t
        eaten += 1
        if size == eaten:
            size += 1
            eaten = 0&lt;/code&gt;&lt;/pre&gt;</description>
      <category>  코딩테스트/알고리즘</category>
      <category>Python</category>
      <category>코딩테스트</category>
      <author>딩딩크롱</author>
      <guid isPermaLink="true">https://dingdingcrong.tistory.com/244</guid>
      <comments>https://dingdingcrong.tistory.com/244#entry244comment</comments>
      <pubDate>Sat, 13 May 2023 18:21:21 +0900</pubDate>
    </item>
    <item>
      <title>[백준] 2206번: 벽 부수고 이동하기</title>
      <link>https://dingdingcrong.tistory.com/242</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2206&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/2206&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1683801855582&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;2206번: 벽 부수고 이동하기&quot; data-og-description=&quot;N&amp;times;M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/2206&quot; data-og-url=&quot;https://www.acmicpc.net/problem/2206&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/t4hEW/hySAnBFJPW/cM1uykKOLTfwe4vfDdPAu0/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/2206&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/2206&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/t4hEW/hySAnBFJPW/cM1uykKOLTfwe4vfDdPAu0/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;2206번: 벽 부수고 이동하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;N&amp;times;M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;visited&lt;/code&gt;는 앞서 방문한 위치를 체크하여 재방문하지 않도록 하고, 경로 및 이동 거리를 저장합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;visited&lt;/code&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;code&gt;visited[x][y][0]&lt;/code&gt; : 벽 부수기 전 경로&lt;/li&gt;
&lt;li&gt;&lt;code&gt;visited[x][y][1]&lt;/code&gt; : 벽 부수기 후 경로&lt;/li&gt;
&lt;/ul&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;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;파이썬&lt;/blockquote&gt;
&lt;pre id=&quot;code_1674128421031&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

dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

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


def BFS():
    queue = deque()
    visited = [[[0] * 2 for _ in range(M)] for _ in range(N)]
    visited[0][0][False] = 1
    queue.append((0, 0, False))
    while queue:
        x, y, c = queue.popleft()
        if (x, y) == (N - 1, M - 1):
            return visited[x][y][c]
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if 0 &amp;lt;= nx &amp;lt; N and 0 &amp;lt;= ny &amp;lt; M:
                if board[nx][ny] == 0 and not visited[nx][ny][c]:
                    visited[nx][ny][c] = visited[x][y][c] + 1
                    queue.append((nx, ny, c))
                elif board[nx][ny] == 1 and not c:
                    visited[nx][ny][True] = visited[x][y][c] + 1
                    queue.append((nx, ny, True))
    return -1


print(BFS())&lt;/code&gt;&lt;/pre&gt;</description>
      <category>  코딩테스트/알고리즘</category>
      <category>Python</category>
      <category>코딩테스트</category>
      <author>딩딩크롱</author>
      <guid isPermaLink="true">https://dingdingcrong.tistory.com/242</guid>
      <comments>https://dingdingcrong.tistory.com/242#entry242comment</comments>
      <pubDate>Thu, 11 May 2023 19:56:59 +0900</pubDate>
    </item>
    <item>
      <title>[백준] 1987번: 알파벳</title>
      <link>https://dingdingcrong.tistory.com/241</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1987&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/1987&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1683796286394&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;1987번: 알파벳&quot; data-og-description=&quot;세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 한 칸으&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/1987&quot; data-og-url=&quot;https://www.acmicpc.net/problem/1987&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bxgn0a/hySz5AXlZW/YCoTacGKE5TbdG7hfmEevk/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/1987&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/1987&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bxgn0a/hySz5AXlZW/YCoTacGKE5TbdG7hfmEevk/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;1987번: 알파벳&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DFS(깊이 우선 탐색)&lt;/b&gt;, &lt;b&gt;백트래킹&lt;/b&gt;을 사용해 풀었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;check&lt;/code&gt; 배열을 사용해 같은 알파벳이 적힌 칸을 두 번 지날 수 없도록 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;ord&lt;/code&gt; 함수를 사용해 알파벳을 0~25의 값을 가지도록 합니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;처음엔 딕셔너리를 사용해 알파벳을 체크해줬다. 그런데 계속 &lt;span style=&quot;color: #ef5369;&quot;&gt;시간초과&lt;/span&gt;가 떠서 찾아보니 딕셔너리는 시간복잡도가 최소 O(1)에서 최대 O(n)까지 가능하다고 하여 리스트 인덱싱으로 바꿔주었다.&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;python을 제출할 때 Python3와 PyPy3 두 가지가 있는데 서로 장단점이 달라 상황에 맞게 사용해야 한다고 한다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ralp0217.tistory.com/entry/Python3-%EC%99%80-PyPy3-%EC%B0%A8%EC%9D%B4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ralp0217.tistory.com/entry/Python3-%EC%99%80-PyPy3-%EC%B0%A8%EC%9D%B4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1683796298916&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Python3 와 PyPy3 차이&quot; data-og-description=&quot;Python3 와 PyPy3 차이 평소에 알고리즘 문제를 풀면서 Python을 지원하는 언어를 선택할 때, Python3와 PyPy3가 대표적으로 있었다. 원래 알던 개념은 PyPy3가 Python3의 실행시 시간이 매우 오래 걸린다는 &quot; data-og-host=&quot;ralp0217.tistory.com&quot; data-og-source-url=&quot;https://ralp0217.tistory.com/entry/Python3-%EC%99%80-PyPy3-%EC%B0%A8%EC%9D%B4&quot; data-og-url=&quot;https://ralp0217.tistory.com/entry/Python3-%EC%99%80-PyPy3-%EC%B0%A8%EC%9D%B4&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bm9jfG/hySz8dp1n2/277tktQRKO7pxthtxlZKR0/img.jpg?width=327&amp;amp;height=154&amp;amp;face=20_110_49_142,https://scrap.kakaocdn.net/dn/CEXBJ/hySAeq8I6Q/X4zuONHMZjdIWjisS6p7mK/img.jpg?width=327&amp;amp;height=154&amp;amp;face=20_110_49_142&quot;&gt;&lt;a href=&quot;https://ralp0217.tistory.com/entry/Python3-%EC%99%80-PyPy3-%EC%B0%A8%EC%9D%B4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ralp0217.tistory.com/entry/Python3-%EC%99%80-PyPy3-%EC%B0%A8%EC%9D%B4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bm9jfG/hySz8dp1n2/277tktQRKO7pxthtxlZKR0/img.jpg?width=327&amp;amp;height=154&amp;amp;face=20_110_49_142,https://scrap.kakaocdn.net/dn/CEXBJ/hySAeq8I6Q/X4zuONHMZjdIWjisS6p7mK/img.jpg?width=327&amp;amp;height=154&amp;amp;face=20_110_49_142');&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;Python3 와 PyPy3 차이&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Python3 와 PyPy3 차이 평소에 알고리즘 문제를 풀면서 Python을 지원하는 언어를 선택할 때, Python3와 PyPy3가 대표적으로 있었다. 원래 알던 개념은 PyPy3가 Python3의 실행시 시간이 매우 오래 걸린다는&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ralp0217.tistory.com&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;파이썬&lt;/blockquote&gt;
&lt;pre id=&quot;code_1674128421031&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

dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

R, C = map(int, input().split())
board = [list(input().rstrip()) for _ in range(R)]
check = [False] * 26
answer = 0


def DFS(x, y, L):
    global answer
    answer = max(answer, L)
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        if 0 &amp;lt;= nx &amp;lt; R and 0 &amp;lt;= ny &amp;lt; C:
            idx = ord(board[nx][ny]) - ord(&quot;A&quot;)
            if not check[idx]:
                check[idx] = True
                DFS(nx, ny, L + 1)
                check[idx] = False


check[ord(board[0][0]) - ord(&quot;A&quot;)] = True
DFS(0, 0, 1)
print(answer)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>  코딩테스트/알고리즘</category>
      <category>Python</category>
      <category>코딩테스트</category>
      <author>딩딩크롱</author>
      <guid isPermaLink="true">https://dingdingcrong.tistory.com/241</guid>
      <comments>https://dingdingcrong.tistory.com/241#entry241comment</comments>
      <pubDate>Thu, 11 May 2023 18:19:48 +0900</pubDate>
    </item>
    <item>
      <title>[백준] 7569번: 토마토</title>
      <link>https://dingdingcrong.tistory.com/240</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/7569&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/7569&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1683791876660&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;7569번: 토마토&quot; data-og-description=&quot;첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 &amp;le; M &amp;le; 100, 2 &amp;le; N &amp;le; 100, &quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/7569&quot; data-og-url=&quot;https://www.acmicpc.net/problem/7569&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dqcavo/hySAaa80XG/N7RZ5SaNQho2sAIA1tXmK1/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480,https://scrap.kakaocdn.net/dn/JRGII/hySAdZZg88/4tKzx6XaKDQPWThFmmLKf0/img.png?width=402&amp;amp;height=504&amp;amp;face=0_0_402_504&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/7569&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/7569&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dqcavo/hySAaa80XG/N7RZ5SaNQho2sAIA1tXmK1/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480,https://scrap.kakaocdn.net/dn/JRGII/hySAdZZg88/4tKzx6XaKDQPWThFmmLKf0/img.png?width=402&amp;amp;height=504&amp;amp;face=0_0_402_504');&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;7569번: 토마토&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 &amp;le; M &amp;le; 100, 2 &amp;le; N &amp;le; 100,&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;BFS(너비 우선 탐색)&lt;/b&gt;를&amp;nbsp;사용해 풀었습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;6 방향(위, 아래, 상, 우, 하, 좌)을 미리 설정해 줍니다.&lt;/li&gt;
&lt;li&gt;익은 토마토(1)의 위치를 모두 큐에 추가합니다.&lt;/li&gt;
&lt;li&gt;익은 토마토를 주변으로 6 방향을 확인하며 익지 않은 토마토(0)를 익은 토마토(1)로 바꿔주고 바뀐 토마토 위치를 큐에 추가합니다.&lt;/li&gt;
&lt;li&gt;시작 시점에 있던 큐를 모두 수행하면 하루가 지난 것이므로 &lt;code&gt;L&lt;/code&gt;에 1을 더합니다.&lt;/li&gt;
&lt;li&gt;마지막으로 익지 않은 토마토가 존재한다면 &lt;code&gt;-1&lt;/code&gt;을, 모두 익었다면 &lt;code&gt;L&lt;/code&gt;을 출력합니다.&lt;/li&gt;
&lt;/ol&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;b&gt;코드&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;파이썬&lt;/blockquote&gt;
&lt;pre id=&quot;code_1674128421031&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, H = map(int, input().split())
boxes = [[list(map(int, input().split())) for _ in range(N)] for _ in range(H)]

dx = [-1, 1, 0, 0, 0, 0]
dy = [0, 0, -1, 0, 1, 0]
dz = [0, 0, 0, 1, 0, -1]


def BFS():
    L = -1
    queue = deque()
    for i in range(H):
        for j in range(N):
            for k in range(M):
                if boxes[i][j][k] == 1:
                    queue.append((i, j, k))
    while queue:
        for _ in range(len(queue)):
            x, y, z = queue.popleft()
            for i in range(6):
                nx = x + dx[i]
                ny = y + dy[i]
                nz = z + dz[i]
                if (
                    0 &amp;lt;= nx &amp;lt; H
                    and 0 &amp;lt;= ny &amp;lt; N
                    and 0 &amp;lt;= nz &amp;lt; M
                    and boxes[nx][ny][nz] == 0
                ):
                    boxes[nx][ny][nz] = 1
                    queue.append((nx, ny, nz))
        L += 1
    for i in range(H):
        for j in range(N):
            for k in range(M):
                if boxes[i][j][k] == 0:
                    return -1
    return L


print(BFS())&lt;/code&gt;&lt;/pre&gt;</description>
      <category>  코딩테스트/알고리즘</category>
      <category>Python</category>
      <category>코딩테스트</category>
      <author>딩딩크롱</author>
      <guid isPermaLink="true">https://dingdingcrong.tistory.com/240</guid>
      <comments>https://dingdingcrong.tistory.com/240#entry240comment</comments>
      <pubDate>Thu, 11 May 2023 17:08:36 +0900</pubDate>
    </item>
    <item>
      <title>[백준] 10026번: 적록색약</title>
      <link>https://dingdingcrong.tistory.com/239</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/10026&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/10026&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1683736918851&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;10026번: 적록색약&quot; data-og-description=&quot;적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N&amp;times;N인 그리드의 각 칸에 R(빨강), G(초록)&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/10026&quot; data-og-url=&quot;https://www.acmicpc.net/problem/10026&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cpOOpI/hySAclXnhq/IehskZ0EpSrm53WkqJj2Jk/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/10026&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/10026&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cpOOpI/hySAclXnhq/IehskZ0EpSrm53WkqJj2Jk/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;10026번: 적록색약&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N&amp;times;N인 그리드의 각 칸에 R(빨강), G(초록)&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;BFS(너비 우선 탐색)와 DFS(깊이 우선 탐색)&lt;/b&gt;를 사용해 풀었습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;※ 'R'과 'G'를 같은 색상으로 변환 후 탐색하는 방법도 있습니다.&lt;/blockquote&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;b&gt;코드&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;파이썬&lt;/blockquote&gt;
&lt;pre id=&quot;code_1674128421031&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

dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

N = int(input())
board = [list(input()) for _ in range(N)]
visited1 = [[False] * N for _ in range(N)]
visited2 = [[False] * N for _ in range(N)]


def BFS(x, y, color_weakness):
    queue = deque()
    queue.append((x, y, color_weakness))
    while queue:
        x, y, color_weakness = queue.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if 0 &amp;lt;= nx &amp;lt; N and 0 &amp;lt;= ny &amp;lt; N:
                if not color_weakness:
                    if not visited1[nx][ny] and board[x][y] == board[nx][ny]:
                        visited1[nx][ny] = True
                        queue.append((nx, ny, color_weakness))
                else:
                    if not visited2[nx][ny]:
                        if board[x][y] == &quot;B&quot;:
                            if board[x][y] == board[nx][ny]:
                                visited2[nx][ny] = True
                                queue.append((nx, ny, color_weakness))
                        else:
                            if board[nx][ny] != &quot;B&quot;:
                                visited2[nx][ny] = True
                                queue.append((nx, ny, color_weakness))


count1 = 0
count2 = 0
for i in range(N):
    for j in range(N):
        if not visited1[i][j]:
            visited1[i][j] = True
            BFS(i, j, False)
            count1 += 1
        if not visited2[i][j]:
            visited2[i][j] = True
            BFS(i, j, True)
            count2 += 1
print(count1, count2)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1683738595414&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys

sys.setrecursionlimit(10**6)

input = sys.stdin.readline

dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

N = int(input())
board = [list(input().rstrip()) for _ in range(N)]


def DFS(x, y):
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        if 0 &amp;lt;= nx &amp;lt; N and 0 &amp;lt;= ny &amp;lt; N:
            if not visited[nx][ny] and board[x][y] == board[nx][ny]:
                visited[nx][ny] = True
                DFS(nx, ny)


count = 0
visited = [[False] * N for _ in range(N)]
for i in range(N):
    for j in range(N):
        if not visited[i][j]:
            visited[i][j] = True
            DFS(i, j)
            count += 1
print(count, end=&quot; &quot;)

for i in range(N):
    for j in range(N):
        if board[i][j] == &quot;G&quot;:
            board[i][j] = &quot;R&quot;

count = 0
visited = [[False] * N for _ in range(N)]
for i in range(N):
    for j in range(N):
        if not visited[i][j]:
            visited[i][j] = True
            DFS(i, j)
            count += 1
print(count)&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;위 코드가 pypy에서 계속 &lt;span style=&quot;color: #ef5369;&quot;&gt;메모리 초과&lt;/span&gt;가 발생했는데 찾아보니 pypy는 재귀에 약하다고 한다. &lt;/blockquote&gt;</description>
      <category>  코딩테스트/알고리즘</category>
      <category>Python</category>
      <category>코딩테스트</category>
      <author>딩딩크롱</author>
      <guid isPermaLink="true">https://dingdingcrong.tistory.com/239</guid>
      <comments>https://dingdingcrong.tistory.com/239#entry239comment</comments>
      <pubDate>Thu, 11 May 2023 01:42:57 +0900</pubDate>
    </item>
  </channel>
</rss>