<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>하다보면 늘겠지</title>
    <link>https://inseongdev.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 8 Jul 2026 16:16:57 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>마닐라</managingEditor>
    <item>
      <title>220808-220814</title>
      <link>https://inseongdev.tistory.com/641</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;0808(월)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백준 문제 풀기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오브젝트(~70p)&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;0809(화)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백준 문제 풀기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오브젝트(~106p)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Collection 포스팅&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;0810(수)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그래머스 모의고사 풀기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 인 액션(~47p)&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;이것저것 많은 경험을 해볼 수 있을 곳인것 같아서 기대가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번주는 읽고 싶었던 책들 읽으면서 좀 쉬었고 다음주 수요일부터 첫 출근인데 이제 TIL 보다는 업무에서 겪었던 문제나 기술같은 것들을 정리하는 식으로 블로그를 운영해보면 어떨까싶어서 그런식으로 해보려 한다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좀 적응하면 다시 서적 읽으면서 자기개발하자!&lt;/p&gt;</description>
      <category>TIL/2022</category>
      <author>마닐라</author>
      <guid isPermaLink="true">https://inseongdev.tistory.com/641</guid>
      <comments>https://inseongdev.tistory.com/641#entry641comment</comments>
      <pubDate>Sun, 14 Aug 2022 23:59:05 +0900</pubDate>
    </item>
    <item>
      <title>자바의 Collection Framework - 동기화, 병렬 처리</title>
      <link>https://inseongdev.tistory.com/642</link>
      <description>&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;h3 data-ke-size=&quot;size23&quot;&gt;Synchronized Collection&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vector와 Hashtable은 동기화된(synchronized) 메서드로 구성되어 있기 때문에 멀티 스레드 환경에서 안전하게 요소를 처리할 수 있지만 ArrayList, HashSet, HashMap은 동기화된 메서드로 구성되어 있지 않아 멀티 스레드 환경에서 안전하지 않습니다.&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;경우에 따라서는 ArrayList, HashSet, HashMap을 싱글 스레드 환경에서 사용하다가 멀티 스레드 환경으로 전달할 필요도 있을 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 경우를 대비해서 컬렉션 프레임워크는 비동기화된 메서드를 동기화된 메서드로 래핑하는 Collections의 synchronizedXXX() 메서드를 제공하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파라미터로 비동기화된 컬렉션을 대입하면 동기화된 컬렉션을 리턴합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;767&quot; data-origin-height=&quot;153&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b31XLf/btrJe6qjwBT/VzXsqz2NI72EwWsRz5rh6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b31XLf/btrJe6qjwBT/VzXsqz2NI72EwWsRz5rh6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b31XLf/btrJe6qjwBT/VzXsqz2NI72EwWsRz5rh6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb31XLf%2FbtrJe6qjwBT%2FVzXsqz2NI72EwWsRz5rh6K%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;767&quot; height=&quot;153&quot; data-origin-width=&quot;767&quot; data-origin-height=&quot;153&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Concurrent Collection&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동기화된 컬렉션은 멀티 스레드 환경에서 하나의 스레드가 요소를 안전하게 처리하도록 도와주지만, 전체 요소를 빠르게 처리하지는 못합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 스레드가 요소를 처리할 때 전체 잠금이 발생하여 다른 스레드는 대기 상태(blocked)가 되기 때문입니다.&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;java.util.concurrent 패키지에서 제공하고 있으며 제공하는 클래스의 일부를 어떤 방식으로 처리를 하는지에 대해서 알아보겠습니다.&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;CopyOnWriteArrayList&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동기화된 ArrayList를 생성하는 방법은 두 가지가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Collections.synchronizedList()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. CopyOnWriteArrayList&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번의 경우에는 JDK 1.2 버전에 추가 되었는데, 반환되는 컬렉션은 &lt;b&gt;모든 읽기와 쓰기 동작에 대해 동기화&lt;/b&gt;가 되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 상당히 비효율적이고 이러한 점을 보완한 CopyOnWriteArrayList가 등장하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;읽기 동작&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CopyOnWriteArrayList는 모든 쓰기 동작에 원본 배열에 있는 요소를 복사하여 임시 배열을 만들고, 이 임시 배열에 쓰기 동작을 수행한 후 원본 배열을 갱신합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 덕분에 읽기 동작은 잠금이 걸리지 않아 1번의 방법보다 성능이 더 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;쓰기 동작&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CopyOnWriteArrayList는 쓰기 동작의 경우에는 1번의 방법과 같이 잠금을 수행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 CopyOnWriteArrayList는 임시 배열을 만드는 과정이 있으므로 1번의 방법보다 성능이 떨어집니다.&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;CopyOnWriteArraySet의 경우에도 자료구조의 특징만 제외하면 동일합니다.&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;ConcurrentHashMap&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동기화된 HashMap을 생성하는 방법은 두 가지가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Collections.synchronizedMap()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. ConcurrentHashMap&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번의 경우에도 synchronizedList()와 같이 &lt;b&gt;모든 읽기와 쓰기 동작에 대해 동기화&lt;/b&gt;가 되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ConcurrentHashMap은 각 테이블을 버킷을 독립적으로 잠그는 방식을 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빈 버킷에 요소를 삽입할 경우에는 잠금 대신 CAS 알고리즘을 사용하고, 그 외의 변경은 각 버킷의 첫 번째 노드를 기준으로 부분적인 잠금을 획득하여 동시성을 보장합니다.&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;CAS이란 Compare And Swap의 약자로 현재 쓰레드에 저장된 값과 메인 메모리에 저장된 값을 비교하여 같다면 &lt;span&gt;새로운 값으로 교체하고(true)&lt;/span&gt;, 다르다면 &lt;span&gt;재시도를&lt;span&gt; 수행하는(false) &lt;/span&gt;&lt;/span&gt;알고리즘입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성공할 때 까지 무한 루프를 돌긴 하지만 멀티 스레드 환경에서 스레드들의 상태가 반복적으로 blocked&amp;lt;-&amp;gt;running 되는 것보다는 성능 면에서 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바에서는 volatile이라는 키워드로 메인 메모리에 접근할 수 있습니다.&lt;span style=&quot;background-color: #282b2e; color: #a9b7c6;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CAS를 통해 synchronized가 blocking하는 단점을 해결하여 non-blocking 방식으로 동시성을 보장할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 synchronized 블록의 경우에는 synchronized 블록 진입전 후에 메인 메모리와 CPU 캐시 메모리의 값을 동기화하는 방식으로 원자성을 보장합니다.&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;a href=&quot;https://github.com/castello/javajungsuk_basic/blob/master/javajungsuk_basic_%EC%9A%94%EC%95%BD%EC%A7%91.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/castello/javajungsuk_basic/blob/master/javajungsuk_basic_%EC%9A%94%EC%95%BD%EC%A7%91.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://palpit.tistory.com/entry/Java-%EC%BB%AC%EB%A0%89%EC%85%98-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC-%EB%8F%99%EA%B8%B0%ED%99%94-%EB%B3%91%EB%A0%AC-%EC%B2%98%EB%A6%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://palpit.tistory.com/entry/Java-%EC%BB%AC%EB%A0%89%EC%85%98-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC-%EB%8F%99%EA%B8%B0%ED%99%94-%EB%B3%91%EB%A0%AC-%EC%B2%98%EB%A6%AC&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://steady-coding.tistory.com/575&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://steady-coding.tistory.com/568&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://steady-coding.tistory.com/568&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://steady-coding.tistory.com/575&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://javaplant.tistory.com/23&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://javaplant.tistory.com/23&lt;/a&gt;&lt;/p&gt;</description>
      <category>Java</category>
      <author>마닐라</author>
      <guid isPermaLink="true">https://inseongdev.tistory.com/642</guid>
      <comments>https://inseongdev.tistory.com/642#entry642comment</comments>
      <pubDate>Tue, 9 Aug 2022 16:48:50 +0900</pubDate>
    </item>
    <item>
      <title>220801-220807</title>
      <link>https://inseongdev.tistory.com/640</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;0801(월)&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;0802(화)&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;0803(수)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NHN 코딩테스트 + 기술 면접 보기&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;0804-0805(목,금)&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;0806(토)&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;수요일에 NHN 면접은 후기대로 진행된 면접이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코딩테스트는 없었고 과제테스트였는데 얼굴이랑 화면을 동시에 찍어야하고 인터넷 검색이 안돼서 조금은 부담스러웠지만 그래도 나쁘지 않게 구현한 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pre-test는 그다지 어려운 부분들은 없었지만 답변을 못한 부분이 좀 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시험이나 테스트에 대해서 좀 더 나은 답을 찾아가는 식으로 진행했는데 좋은 경험이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;토요일에는 오전에 현대오토에버, 토스 코딩테스트를 봤는데, 현대오토에버는 IDE, 검색이 불가능이라 그런지 난이도가 크게 어렵진 않았던 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;토스는 코딩테스트 1시간 30분, 서술형 30분이었고 각 7문제, 5문제였다.&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;서술형 문제는 실무 경험 능력이 뛰어난 사람을 뽑겠다는 의지가 보였다.. 제대로 답변한 게 얼마 없는듯하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음주도 코테있으니까 코테 준비하면서 포스팅도 다시 하자~!&lt;/p&gt;</description>
      <category>TIL/2022</category>
      <author>마닐라</author>
      <guid isPermaLink="true">https://inseongdev.tistory.com/640</guid>
      <comments>https://inseongdev.tistory.com/640#entry640comment</comments>
      <pubDate>Sun, 7 Aug 2022 23:59:39 +0900</pubDate>
    </item>
    <item>
      <title>220725-220731</title>
      <link>https://inseongdev.tistory.com/639</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;0725&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;0726&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;0727&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;0728&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.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;0730&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.DFS 2.해쉬+투포인터 3.BFS)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;면접 준비&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0731&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;다음주 코테보기 전에 프로그래머스 모의고사를 봤는데 모의고사긴 하지만 2번 모두 올솔해서 기분좋았다.&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;</description>
      <category>TIL/2022</category>
      <author>마닐라</author>
      <guid isPermaLink="true">https://inseongdev.tistory.com/639</guid>
      <comments>https://inseongdev.tistory.com/639#entry639comment</comments>
      <pubDate>Sun, 31 Jul 2022 23:59:06 +0900</pubDate>
    </item>
    <item>
      <title>빙산</title>
      <link>https://inseongdev.tistory.com/638</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;  문제 설명&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2573&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/2573&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1658914214709&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;2573번: 빙산&quot; data-og-description=&quot;첫 줄에는 이차원 배열의 행의 개수와 열의 개수를 나타내는 두 정수 N과 M이 한 개의 빈칸을 사이에 두고 주어진다. N과 M은 3 이상 300 이하이다. 그 다음 N개의 줄에는 각 줄마다 배열의 각 행을 &quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/2573&quot; data-og-url=&quot;https://www.acmicpc.net/problem/2573&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bWY8ui/hyPc8VWuOg/9OhT0kngHh2wakLDwGBxPk/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/2573&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/2573&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bWY8ui/hyPc8VWuOg/9OhT0kngHh2wakLDwGBxPk/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;2573번: 빙산&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫 줄에는 이차원 배열의 행의 개수와 열의 개수를 나타내는 두 정수 N과 M이 한 개의 빈칸을 사이에 두고 주어진다. N과 M은 3 이상 300 이하이다. 그 다음 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;h2 id=&quot;-접근&quot; data-ke-size=&quot;size26&quot;&gt;  접근&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bfs 문제였는데 큐가 2가지 필요했다.&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;2. 두 덩어리 이상으로 분리되어있는지 확인하기 위한 큐&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; &amp;zwj;  코드&lt;/h2&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;import java.io.*;
import java.util.*;

public class Main {
    static int[] arr, dx = {-1, 1, 0, 0}, dy = {0, 0, -1, 1};
    static int[][] board;
    static boolean[][] visited;
    static int n, m, k, t, num, cnt, second;
    static ArrayList&amp;lt;Integer&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();
    static Queue&amp;lt;Point&amp;gt; q = new LinkedList&amp;lt;&amp;gt;();

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

        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());

        board = new int[n][m];
        visited = new boolean[n][m];
        for (int i = 0; i &amp;lt; n; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j &amp;lt; m; j++) {
                board[i][j] = Integer.parseInt(st.nextToken());
                if(board[i][j] != 0) q.add(new Point(i, j, board[i][j]));
            }
        }

        System.out.println(bfs());
    }

    private static int bfs() {
        while (!q.isEmpty()) {
            int len = q.size();
            for(int i = 0; i &amp;lt; len; i++) {
                Point cp = q.poll();

                int cnt = 0;
                //상하좌우 확인해서 바닷물 몇 개인지 확인
                for(int j = 0; j &amp;lt; 4; j++) {
                    int nx = cp.x + dx[j];
                    int ny = cp.y + dy[j];
                    if(nx&amp;lt;0 || ny&amp;lt;0 || nx&amp;gt;=n || ny&amp;gt;=m) continue;
                    if(board[nx][ny] == 0) cnt++;
                }
                //일단 바닷물 갯수만큼 빼서 큐에 다시 넣어놓기
                q.offer(new Point(cp.x, cp.y, board[cp.x][cp.y]-cnt));
            }

            //모든 좌표 다 확인했으면 원배열을 갱신시켜주기
            for(int i = 0; i &amp;lt; len; i++) {
                Point cp = q.poll();
                board[cp.x][cp.y] = cp.cnt &amp;lt; 0 ? 0 : cp.cnt;
                //빙산이 남아있을 때만 큐에 다시 넣어주기
                if(cp.cnt &amp;gt; 0) q.offer(new Point(cp.x, cp.y, board[cp.x][cp.y]));
            }
            second++;
            //두 덩어리 이상으로 분리되는지 확인
            if(isMany()) return second;
        }
        return 0;
    }

    private static boolean isMany() {
        visited = new boolean[n][m];
        cnt = 0;
        for(int i = 0; i &amp;lt; n; i++) {
            for(int j = 0; j &amp;lt; m; j++) {
                //인접한 빙산 모두 방문처리
                if(board[i][j] &amp;gt; 0 &amp;amp;&amp;amp; !visited[i][j]) {
                    bfs2(i, j);
                    cnt++;
                }
            }
            if(cnt &amp;gt;= 2) return true;
        }
        return false;
    }

    private static void bfs2(int x, int y) {
        Queue&amp;lt;Point&amp;gt; mq = new LinkedList&amp;lt;&amp;gt;();
        mq.offer(new Point(x, y));
        while(!mq.isEmpty()) {
            Point cp = mq.poll();
            for(int i = 0; i &amp;lt; 4; i++) {
                int nx = cp.x + dx[i];
                int ny = cp.y + dy[i];

                if(nx&amp;lt;0 || ny&amp;lt;0 || nx&amp;gt;=n || ny&amp;gt;=m || visited[nx][ny] || board[nx][ny] == 0) continue;
                visited[nx][ny] = true;
                mq.offer(new Point(nx, ny));
            }
        }
    }

    private static class Point {
        private int x;
        private int y;
        private int cnt;

        public Point(int x, int y) {
            this.x = x;
            this.y = y;
        }

        public Point(int x, int y, int cnt) {
            this.x = x;
            this.y = y;
            this.cnt = cnt;
        }

        @Override
        public String toString() {
            return &quot;Point{&quot; +
                    &quot;x=&quot; + x +
                    &quot;, y=&quot; + y +
                    &quot;, cnt=&quot; + cnt +
                    '}';
        }
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/baekjoon</category>
      <author>마닐라</author>
      <guid isPermaLink="true">https://inseongdev.tistory.com/638</guid>
      <comments>https://inseongdev.tistory.com/638#entry638comment</comments>
      <pubDate>Wed, 27 Jul 2022 18:31:48 +0900</pubDate>
    </item>
    <item>
      <title>직사각형 탈출</title>
      <link>https://inseongdev.tistory.com/637</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;  문제 설명&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/status?user_id=chqdlstjd2&amp;amp;problem_id=16973&amp;amp;from_mine=1&quot;&gt;https://www.acmicpc.net/status?user_id=chqdlstjd2&amp;amp;problem_id=16973&amp;amp;from_mine=1&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1658910215613&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;채점 현황&quot; data-og-description=&quot;&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/status?user_id=chqdlstjd2&amp;amp;problem_id=16973&amp;amp;from_mine=1&quot; data-og-url=&quot;https://www.acmicpc.net/status?user_id=chqdlstjd2&amp;amp;problem_id=16973&amp;amp;from_mine=1&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Cf72S/hyPc8uN2IA/3dnlgxJfuEytUlKzyKrlu1/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/status?user_id=chqdlstjd2&amp;amp;problem_id=16973&amp;amp;from_mine=1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/status?user_id=chqdlstjd2&amp;amp;problem_id=16973&amp;amp;from_mine=1&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Cf72S/hyPc8uN2IA/3dnlgxJfuEytUlKzyKrlu1/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;채점 현황&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&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;h2 id=&quot;-접근&quot; data-ke-size=&quot;size26&quot;&gt;  접근&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전형적인 BFS 문제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 부분은 좌표 하나만 확인하는 것이 아닌 직사각형으로 확인해야 했던 문제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직사각형의 첫 시작 좌표들로 방문여부를 체크&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; &amp;zwj;  코드&lt;/h2&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;import java.io.*;
import java.util.*;

public class Main {
    static int[] arr, dx = {-1,1,0,0}, dy = {0,0,-1,1};
    static int[][] board;
    static boolean[][] visited;
    static int n, m, k, t, num, cnt, second;
    static ArrayList&amp;lt;Integer&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();

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

        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());

        board = new int[n+1][m+1];
        visited = new boolean[n+1][m+1];
        for(int i = 1; i &amp;lt;= n; i++) {
            st = new StringTokenizer(br.readLine());
            for(int j = 1; j &amp;lt;= m; j++) {
                board[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        st = new StringTokenizer(br.readLine());
        int h = Integer.parseInt(st.nextToken());
        int w = Integer.parseInt(st.nextToken());
        int sx = Integer.parseInt(st.nextToken());
        int sy = Integer.parseInt(st.nextToken());
        int fx = Integer.parseInt(st.nextToken());
        int fy = Integer.parseInt(st.nextToken());

        //시작 좌표를 이용해서 좌표 방문여부 판단
        Queue&amp;lt;Point&amp;gt; q = new LinkedList&amp;lt;&amp;gt;();
        q.add(new Point(sx, sy, 0));
        visited[sx][sy] = true;

        boolean flag = false;
        out:while (!q.isEmpty()) {
            int len = q.size();
            for(int k = 0; k &amp;lt; len; k++) {
                Point cp = q.poll();
                if(cp.x == fx &amp;amp;&amp;amp; cp.y == fy) {
                    flag = true;
                    System.out.println(cp.cnt);
                    break out;
                }
                for(int i = 0; i &amp;lt; 4; i++) {
                    int nx = cp.x + dx[i];
                    int ny = cp.y + dy[i];
                    if(nx&amp;lt;1 || ny&amp;lt;1 || nx&amp;gt;n || ny&amp;gt;m || visited[nx][ny]) continue;
                    //직사각형을 놓을 수 있는 위치인지 확인
                    if(nx+h &amp;gt; n+1 || ny+w &amp;gt; m+1) continue;
                    //그 위치들 중 벽이 없는지도 확인
                    if(isArrangeRectangle(nx, ny, h, w)) {
                        visited[nx][ny] = true;
                        q.offer(new Point(nx, ny, cp.cnt+1));
                    }
                }
            }
        }

        if(!flag) System.out.println(-1);

    }

    private static boolean isArrangeRectangle(int nx, int ny, int h, int w) {
        for(int i = nx; i &amp;lt; nx+h; i++) {
            for(int j = ny; j &amp;lt; ny+w; j++) {
                if(board[i][j] != 0) return false;
            }
        }
        return true;
    }

    private static class Point {
        private int x;
        private int y;
        private int cnt;

        public Point(int x, int y, int cnt) {
            this.x = x;
            this.y = y;
            this.cnt = cnt;
        }

        @Override
        public String toString() {
            return &quot;Point{&quot; +
                    &quot;x=&quot; + x +
                    &quot;, y=&quot; + y +
                    &quot;, cnt=&quot; + cnt +
                    '}';
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/baekjoon</category>
      <author>마닐라</author>
      <guid isPermaLink="true">https://inseongdev.tistory.com/637</guid>
      <comments>https://inseongdev.tistory.com/637#entry637comment</comments>
      <pubDate>Wed, 27 Jul 2022 17:24:33 +0900</pubDate>
    </item>
    <item>
      <title>움직이는 미로 탈출</title>
      <link>https://inseongdev.tistory.com/636</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;  문제 설명&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/16954&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/16954&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1658906662426&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;16954번: 움직이는 미로 탈출&quot; data-og-description=&quot;욱제는 학교 숙제로 크기가 8&amp;times;8인 체스판에서 탈출하는 게임을 만들었다. 체스판의 모든 칸은&amp;nbsp;빈 칸 또는 벽 중 하나이다. 욱제의 캐릭터는 가장 왼쪽 아랫 칸에 있고, 이 캐릭터는 가장 오른쪽 &quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/16954&quot; data-og-url=&quot;https://www.acmicpc.net/problem/16954&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ib6qz/hyPeIabOIp/LyK1WeI7ofP1yD1sE1kqhk/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/16954&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/16954&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ib6qz/hyPeIabOIp/LyK1WeI7ofP1yD1sE1kqhk/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;16954번: 움직이는 미로 탈출&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;욱제는 학교 숙제로 크기가 8&amp;times;8인 체스판에서 탈출하는 게임을 만들었다. 체스판의 모든 칸은&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;h2 id=&quot;-접근&quot; data-ke-size=&quot;size26&quot;&gt;  접근&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;q사이즈만큼 루프를 돌린다음 벽을 내려한다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 조건이 없으면 한 칸을 이동할 때 마다 벽이 내려가게 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방문조건을 고려하려면 q사이즈 루프돌때마다 새로 방문 배열을 만들어줘야 했는데 딱히 고려안해도 메모리, 시간초과가 나지는 않았다.&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; &amp;zwj;  코드&lt;/h2&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;import java.io.*;
import java.util.*;

public class Main {
    static int[] arr, dx = {-1,1,0,0,-1,-1,1,1,0}, dy = {0,0,-1,1,-1,1,-1,1,0};
    static char[][] board;
    static boolean[][] visited;
    static int n, m, k, t, num, cnt, second;
    static ArrayList&amp;lt;Integer&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();

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

        //StringTokenizer st = new StringTokenizer(br.readLine());
        //n = Integer.parseInt(st.nextToken());
        //m = Integer.parseInt(st.nextToken());
        board = new char[8][8];
        visited = new boolean[8][8];
        for(int i = 0; i &amp;lt; 8; i++) {
            String s = br.readLine();
            for(int j = 0; j &amp;lt; 8; j++) {
                board[i][j] = s.charAt(j);
            }
        }

        if(bfs()) System.out.println(1);
        else System.out.println(0);

    }

    private static boolean bfs() {
        Queue&amp;lt;Point&amp;gt; q = new LinkedList&amp;lt;&amp;gt;();

        q.add(new Point(7, 0));

        while (!q.isEmpty()) {
            int len = q.size();
            for(int k = 0; k &amp;lt; len; k++) {
                Point cp = q.poll();
                if (cp.x == 0 &amp;amp;&amp;amp; cp.y == 7) return true;
                //현 위치가 벽이면 더이상 못감
                if (board[cp.x][cp.y] == '#') continue;

                //욱제 이동
                for (int i = 0; i &amp;lt; 9; i++) {
                    int nx = cp.x + dx[i];
                    int ny = cp.y + dy[i];

                    if (nx&amp;lt;0 || ny&amp;lt;0 || nx&amp;gt;=8 || ny&amp;gt;=8 || board[nx][ny]=='#') continue;
                    q.offer(new Point(nx, ny));
                }
            }
            //벽 아래로 내리기
            for (int i = 7; i &amp;gt;= 0; i--) {
                for (int j = 0; j &amp;lt; 8; j++) {
                    //벽 아래로 내리기 -&amp;gt; 내린 벽의 위치 = 욱제 위치 이면 더 이상 이동 불가
                    if (board[i][j] == '#') {
                        board[i][j] = '.';
                        if (i == 7) continue;
                        board[i + 1][j] = '#';
                    }
                }
            }
            cnt++;
        }
        return false;
    }


    private static class Point {
        private int x;
        private int y;

        public Point(int x, int y) {
            this.x = x;
            this.y = y;
        }

        @Override
        public String toString() {
            return &quot;Point{&quot; +
                    &quot;x=&quot; + x +
                    &quot;, y=&quot; + y +
                    '}';
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/baekjoon</category>
      <author>마닐라</author>
      <guid isPermaLink="true">https://inseongdev.tistory.com/636</guid>
      <comments>https://inseongdev.tistory.com/636#entry636comment</comments>
      <pubDate>Wed, 27 Jul 2022 16:30:13 +0900</pubDate>
    </item>
    <item>
      <title>말이 되고픈 원숭이</title>
      <link>https://inseongdev.tistory.com/635</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;  문제 설명&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1600&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/1600&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1658886616641&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;1600번: 말이 되고픈 원숭이&quot; data-og-description=&quot;첫째 줄에 정수 K가 주어진다. 둘째 줄에 격자판의 가로길이 W, 세로길이 H가 주어진다. 그 다음 H줄에 걸쳐 W개의 숫자가 주어지는데, 0은 아무것도 없는 평지, 1은 장애물을 뜻한다. 장애물이 있&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/1600&quot; data-og-url=&quot;https://www.acmicpc.net/problem/1600&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ff87O/hyPeLxNzlG/PYqBLLzAGTj4OANe0K13H0/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/1600&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/1600&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ff87O/hyPeLxNzlG/PYqBLLzAGTj4OANe0K13H0/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;1600번: 말이 되고픈 원숭이&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 정수 K가 주어진다. 둘째 줄에 격자판의 가로길이 W, 세로길이 H가 주어진다. 그 다음 H줄에 걸쳐 W개의 숫자가 주어지는데, 0은 아무것도 없는 평지, 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;h2 id=&quot;-접근&quot; data-ke-size=&quot;size26&quot;&gt;  접근&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;k = 1일 때 처음부터 움직일 수도 있지만 인접한 방향으로만 이동하다가 중간에 말처럼 이동할 수도 있기 때문에 그 부분 때문에 3차원 배열을 사용했음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;며칠전 문제에서 해당하는 위치를 바로 리턴안해줬더니 시간초과가 뜨는 문제가 있어서 이번엔 지점 찾으면 바로 리턴해주는 식으로 접근했는데, 이번 문제에서는 100%에서 틀렸습니다.가 떴다.&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;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;zwj;  코드&lt;/h2&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;import java.io.*;
import java.util.*;

public class Main {
    static int[] dx = {-1,1,0,0};
    static int[] dy = {0,0,-1,1};
    static int[] hx = {-2,-2,-1,-1,1,1,2,2};
    static int[] hy = {-1,1,-2,2,-2,2,-1,1};
    static int[] arr;
    static int[][] board;
    static boolean[][][] visited;
    static int n, m, k, t, num, cnt, second;
    static ArrayList&amp;lt;Integer&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();

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

        k = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());
        board = new int[m][n];
        visited = new boolean[m][n][k+1];
        for(int i = 0; i &amp;lt; m; i++) {
            st = new StringTokenizer(br.readLine());
            for(int j = 0; j &amp;lt; n; j++) {
                board[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        if(bfs(0,0)) System.out.println(second);
        else System.out.println(-1);

    }

    private static boolean bfs(int x, int y) {
        Queue&amp;lt;Point&amp;gt; q = new LinkedList&amp;lt;&amp;gt;();
        //second 이동 횟수, cnt 말처럼 움직인 횟수
        q.add(new Point(x, y, 0, k));
        visited[x][y][k] = true;

        while (!q.isEmpty()) {
            Point cp = q.poll();
            if(cp.x == m-1 &amp;amp;&amp;amp; cp.y == n-1) {
                second = cp.second;
                return true;
            }
            int nx, ny;
            for(int i = 0; i &amp;lt; 4; i++) {
                nx = cp.x + dx[i];
                ny = cp.y + dy[i];
                if(nx&amp;lt;0 || ny&amp;lt;0 || nx&amp;gt;=m || ny&amp;gt;=n || visited[nx][ny][cp.cnt] || board[nx][ny]==1) continue;
                visited[nx][ny][cp.cnt] = true;
                q.offer(new Point(nx, ny, cp.second+1, cp.cnt));
            }

            if(cp.cnt &amp;gt; 0) {
                for(int i = 0; i &amp;lt; 8; i++) {
                    nx = cp.x + hx[i];
                    ny = cp.y + hy[i];
                    if(nx&amp;lt;0 || ny&amp;lt;0 || nx&amp;gt;=m || ny&amp;gt;=n || visited[nx][ny][cp.cnt-1] || board[nx][ny]==1) continue;
                    visited[nx][ny][cp.cnt-1] = true;
                    q.offer(new Point(nx, ny,cp.second+1, cp.cnt-1));
                }
            }
        }
        return false;
    }


    private static class Point {
        private int x;
        private int y;
        private int second;
        private int cnt;

        public Point(int x, int y, int second, int cnt) {
            this.x = x;
            this.y = y;
            this.second = second;
            this.cnt = cnt;
        }

        @Override
        public String toString() {
            return &quot;Point{&quot; +
                    &quot;x=&quot; + x +
                    &quot;, y=&quot; + y +
                    &quot;, second=&quot; + second +
                    '}';
        }
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/baekjoon</category>
      <author>마닐라</author>
      <guid isPermaLink="true">https://inseongdev.tistory.com/635</guid>
      <comments>https://inseongdev.tistory.com/635#entry635comment</comments>
      <pubDate>Wed, 27 Jul 2022 11:06:36 +0900</pubDate>
    </item>
    <item>
      <title>숫자고르기</title>
      <link>https://inseongdev.tistory.com/634</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;  문제 설명&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2668&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/2668&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1658842242461&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;2668번: 숫자고르기&quot; data-og-description=&quot;세로 두 줄, 가로로 N개의 칸으로 이루어진 표가 있다. 첫째 줄의 각 칸에는 정수 1, 2, &amp;hellip;, N이 차례대로 들어 있고 둘째 줄의 각 칸에는 1이상 N이하인 정수가 들어 있다. 첫째 줄에서 숫자를 적절&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/2668&quot; data-og-url=&quot;https://www.acmicpc.net/problem/2668&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cVz0Q0/hyPddJhv7q/Op1TDKlNwS7oOLqmcNntK1/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/2668&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/2668&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cVz0Q0/hyPddJhv7q/Op1TDKlNwS7oOLqmcNntK1/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;2668번: 숫자고르기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;세로 두 줄, 가로로 N개의 칸으로 이루어진 표가 있다. 첫째 줄의 각 칸에는 정수 1, 2, &amp;hellip;, N이 차례대로 들어 있고 둘째 줄의 각 칸에는 1이상 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;h2 id=&quot;-접근&quot; data-ke-size=&quot;size26&quot;&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;1번 ~ n번까지 각 숫자에 대해서 배열에 해당하는 값(인덱스)을 찾아야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;idx번의 값과 배열의 idx 인덱스와의 값이 매칭되면 리스트에 넣어주면 된다.&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; &amp;zwj;  코드&lt;/h2&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;import java.io.*;
import java.util.*;

public class Main {
    static int[] arr;
    static boolean[] visited;
    static int n, m, k, t, num;
    static ArrayList&amp;lt;Integer&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();

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

        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        arr = new int[n+1];
        visited = new boolean[n+1];
        for(int i = 1; i &amp;lt;= n; i++) {
            arr[i] = Integer.parseInt(br.readLine());
        }

        //1~n까지 탐색
        //arr 어느 인덱스에 있는지 확인
        for(int i = 1; i &amp;lt;= n; i++) {
            visited[i] = true;
            num = i;
            dfs(i);
            visited[i] = false;
        }
        
        System.out.println(list.size());
        for (Integer number : list) {
            System.out.println(number);
        }
    }

    private static void dfs(int idx) {
        if(arr[idx] == num) {
            //System.out.println(num + &quot;은 arr의 &quot; + idx +&quot;번째 인덱스에 있다.&quot;);
            list.add(num);
        }

        if(!visited[arr[idx]]) {
            visited[arr[idx]] = true;
            dfs(arr[idx]);
            visited[arr[idx]] = false;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/baekjoon</category>
      <author>마닐라</author>
      <guid isPermaLink="true">https://inseongdev.tistory.com/634</guid>
      <comments>https://inseongdev.tistory.com/634#entry634comment</comments>
      <pubDate>Tue, 26 Jul 2022 22:46:26 +0900</pubDate>
    </item>
    <item>
      <title>샘터</title>
      <link>https://inseongdev.tistory.com/633</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;  문제 설명&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/18513&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/18513&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1658836361558&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;18513번: 샘터&quot; data-og-description=&quot;첫째 줄에 자연수 N과 K가 공백을 기준으로 구분되어 주어진다. (1 &amp;le; N, K &amp;le; 100,000) 둘째 줄에 N개의 샘터의 위치가 공백을 기준으로 구분되어 정수 형태로 주어진다. (-100,000,000 &amp;le; 샘터의 위치 &amp;le;&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/18513&quot; data-og-url=&quot;https://www.acmicpc.net/problem/18513&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/jmBye/hyPeGbWJra/vECp5Q2HqyQkIWkDzshCQk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480,https://scrap.kakaocdn.net/dn/Dzqj1/hyPddoURVs/JwDLAYvKdj8oQPw5Hr5gM1/img.jpg?width=1423&amp;amp;height=201&amp;amp;face=0_0_1423_201&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/18513&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/18513&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/jmBye/hyPeGbWJra/vECp5Q2HqyQkIWkDzshCQk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480,https://scrap.kakaocdn.net/dn/Dzqj1/hyPddoURVs/JwDLAYvKdj8oQPw5Hr5gM1/img.jpg?width=1423&amp;amp;height=201&amp;amp;face=0_0_1423_201');&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;18513번: 샘터&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 자연수 N과 K가 공백을 기준으로 구분되어 주어진다. (1 &amp;le; N, K &amp;le; 100,000) 둘째 줄에 N개의 샘터의 위치가 공백을 기준으로 구분되어 정수 형태로 주어진다. (-100,000,000 &amp;le; 샘터의 위치 &amp;le;&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;h2 id=&quot;-접근&quot; data-ke-size=&quot;size26&quot;&gt;  접근&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열이 아닌 Set을 이용해서 좌표 방문 여부를 체크해줬는데 계속 메모리 초과가 났었다.&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;out:while 문법을 쓰고 안에서 break out;을 사용하면 while 문을 바로 빠져나온다.&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억~1억이지만 집의 좌표는 정해져 있지 않기 때문에 범위를 설정해놓지 않아야한다.&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; &amp;zwj;  코드&lt;/h2&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;import java.io.*;
import java.util.*;

public class Main {
    static int[] arr = {-1,1};
    static int n, m, max = 100000000;

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

        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken()); //샘터 갯수
        m = Integer.parseInt(st.nextToken()); //지을 집 갯수

        st = new StringTokenizer(br.readLine());
        Queue&amp;lt;Point&amp;gt; q = new LinkedList&amp;lt;&amp;gt;();
        Set&amp;lt;Integer&amp;gt; set = new HashSet&amp;lt;&amp;gt;();
        for (int i = 0; i &amp;lt; n; i++) {
            int x = Integer.parseInt(st.nextToken()); //집 위치
            q.add(new Point(x, 0));
            set.add(x);
        }

        int cnt = 0;
        long result = 0;

        out:while (!q.isEmpty()) {
            Point cp = q.poll();
            for(int i = 0; i &amp;lt; 2; i++) {
                int nx = cp.x + arr[i];

                if(set.contains(nx)) continue;
                result += cp.distance+1;
                cnt++;
                set.add(nx);
                if(cnt == m) break out;
                q.offer(new Point(nx, cp.distance+1));
            }
        }
        System.out.println(result);

    }

    private static class Point {
        private int x;
        private int distance;

        public Point(int x, int distance) {
            this.x = x;
            this.distance = distance;
        }

        @Override
        public String toString() {
            return &quot;Point{&quot; +
                    &quot;x=&quot; + x +
                    &quot;, distance=&quot; + distance +
                    '}';
        }
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/baekjoon</category>
      <author>마닐라</author>
      <guid isPermaLink="true">https://inseongdev.tistory.com/633</guid>
      <comments>https://inseongdev.tistory.com/633#entry633comment</comments>
      <pubDate>Tue, 26 Jul 2022 20:56:05 +0900</pubDate>
    </item>
  </channel>
</rss>