<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>보안공돌이</title>
    <link>https://security-gom.tistory.com/</link>
    <description>CS이론을 정리하고 프로젝트에 적용하고 있습니다. 
최근에는 TDD에 큰 관심이 있습니다.
현재는 SSAFY 실습코치로 근무하며 약 30개팀의 프로젝트를 코칭하였습니다.
</description>
    <language>ko</language>
    <pubDate>Thu, 13 Aug 2026 17:09:49 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>보안공돌이</managingEditor>
    <image>
      <title>보안공돌이</title>
      <url>https://tistory1.daumcdn.net/tistory/5404030/attach/1cf1bcee58b34e57977c3a839784ad6e</url>
      <link>https://security-gom.tistory.com</link>
    </image>
    <item>
      <title>Spring 예외 처리 [Error, Checked/UnChecked Exception]</title>
      <link>https://security-gom.tistory.com/83</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;운영 환경에서 발생하는 예외를 부적절하게 처리하면 문제의 원인을 찾기 힘들어집니다. &lt;b&gt;모든 예외는 적절하게 복구되거나 작업을 중단하고 관리자나 개발자에게 통보&lt;/b&gt;되어야 합니다. 예를 들어, 네트워크가 끊기거나 서버가 종료된 상황에서 예외를 단순히 콘솔에 출력하는 것으로는 문제가 해결되지 않습니다. 콘솔 출력은 실제 문제 해결에 도움이 되지 않으므로, 차라리 서버를 종료시키는 것이 더 나은 선택일 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;무의미하고 무책임한 throws는 피하자&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자가 복구할 수 있는 예외 상황에도 불구하고, 무책임하게 throws를 사용하여 예외를 상위로 던지는 것은 적절하지 않습니다. 이러한 예외 처리 방식은 실제로 예외를 다룰 수 있는 기회를 빼앗기 때문에, 예외 처리 전략을 신중하게 선택해야 합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예외 처리의 기본 개념&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바에서 예외는 크게 세 가지로 나눌 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Error&lt;/b&gt;: 시스템에서 비정상적인 상황이 발생했을 때 JVM에서 발생시키는 예외입니다. 이는 애플리케이션 코드에서 잡으려고 시도해서는 안 됩니다. OutOfMemoryError와 같은 에러는 애플리케이션 레벨에서 복구가 불가능합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Exception (Checked Exception)&lt;/b&gt;: 애플리케이션 코드에서 발생하는 예외로, 명시적인 처리가 필요합니다. Exception 클래스의 서브클래스이면서 RuntimeException을 상속하지 않은 예외를 체크 예외라고 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;RuntimeException (Unchecked Exception)&lt;/b&gt;: 명시적인 예외 처리를 강제하지 않는 언체크 예외입니다. 이는 프로그램 오류를 피할 수 있도록 설계된 것으로, 예를 들어 NullPointerException, IllegalArgumentException과 같은 예외가 여기에 속합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예외를 어떻게 다룰 것인가?&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;체크 예외 vs 언체크 예외&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;체크 예외&lt;/b&gt;: 발생할 가능성이 있는 예외를 반드시 처리하도록 강제합니다. 예외가 발생할 수 있는 메서드를 호출할 때 throws 또는 try-catch 블록을 사용해 처리해야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;언체크 예외&lt;/b&gt;: 개발자의 실수로 인해 발생할 수 있는 예외로, 명시적으로 처리할 필요는 없습니다. 다만, 프로그램의 예측 가능한 오류를 방지하기 위해 사전에 설계를 통해 문제를 해결할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예외 처리 방법&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예외 복구&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예외가 발생하더라도 정상 상태로 복구하는 것이 가능하다면 이를 시도해야 합니다. 예를 들어, 파일을 읽는 중에 IOException이 발생했다면, 사용자가 다른 파일을 선택하도록 유도하는 방법이 있습니다. 예외 발생 시 무조건 프로그램을 종료하는 대신, 재시도를 통해 문제를 해결하거나, 상황에 맞게 처리하는 것이 중요합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예외 회피&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예외를 자신이 처리하지 않고 호출한 메서드로 던져버리는 방식입니다. throws 키워드를 사용하거나, catch 블록에서 예외를 잡은 후 다시 던질 수 있습니다. 단, 예외를 던질 때에는 반드시 다른 객체나 메서드가 이 예외를 처리할 수 있도록 해야 합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예외 전환&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예외를 회피하는 것과 비슷하지만, 단순히 던지는 것이 아니라 의미 있는 예외로 변환하여 던지는 것을 말합니다. 예를 들어, DB에서 중복된 사용자를 추가하려고 할 때 SQLException이 발생하면, 이를 DuplicateUserIdException으로 변환하여 더 명확한 의미를 부여할 수 있습니다. 이를 통해 서비스 계층에서 예외 상황을 더 쉽게 파악하고 적절하게 처리할 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최근 예외 처리 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 서버 환경에서는 체크 예외를 빠르게 런타임 예외로 전환하여 처리하는 경향이 있습니다. 런타임 예외는 예상하지 못했던 상황에서 발생하므로, 시스템 레벨에서 자동으로 처리되도록 설계하는 것이 일반적입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;낙관적 예외 처리 기법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복구할 수 없는 예외가 없다는 가정 하에, 예외가 발생하면 시스템 레벨에서 알아서 처리해줄 것이라고 믿고 개발하는 방식도 존재합니다. 예를 들어, 은행 계좌에서 출금하는 기능을 설계할 때, 출금 가능 여부를 확인하고 부족한 경우 InsufficientBalanceException을 던지도록 설계할 수 있습니다. 이를 통해 정상적인 흐름과 예외 상황을 명확하게 구분하고, 발생 가능한 예외 상황에 대해 사전에 대응할 수 있습니다.&lt;/p&gt;</description>
      <category>JAVA/Spring</category>
      <category>checked</category>
      <category>error</category>
      <category>Exception</category>
      <category>spring</category>
      <category>unchecked</category>
      <author>보안공돌이</author>
      <guid isPermaLink="true">https://security-gom.tistory.com/83</guid>
      <comments>https://security-gom.tistory.com/83#entry83comment</comments>
      <pubDate>Mon, 14 Oct 2024 13:37:07 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] 표 편집 - JAVA</title>
      <link>https://security-gom.tistory.com/82</link>
      <description>&lt;h2 id=&quot;문제&quot; style=&quot;color: #000000; text-align: left;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/81303&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/81303&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1727940273803&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;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/81303&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/TdgQf/hyXazEtPKR/HUrrDk5dsrYiyviP2QO3g1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bbEWZJ/hyXd95ekJT/kl2lJyRAN6i3DVSB1ClVe0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/81303&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/81303&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/TdgQf/hyXazEtPKR/HUrrDk5dsrYiyviP2QO3g1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bbEWZJ/hyXd95ekJT/kl2lJyRAN6i3DVSB1ClVe0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;​&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a62fca24-c212-415e-bca9-5192e31e166b&quot; style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;  &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;문제 접근 &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;시간 초과 코드 개선하는 과정이 들어있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;초반 접근&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- 모든 유저는 softdelete가 된다고 생각하였고 이를 배열로만 구현을 하겠다는 생각을 하게 되었음.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- 삭제된 것을 복귀하기 위한 Stack을 사용하였으며 모든 것들은 배열의 이동을 통해 구현하였음.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;결과 : 시간 초과&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;원인 : 최대 1,000,000 * 200,000의 연산이 발생할 수 있으며 인덱스의 이동을 통해 구현했기 때문에 다음과 같은 부분에서 시간 초과가 발생하 수 있음.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;현재 유저 인덱스 10&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;비활성 유저 인덱스 11 ~ 9999999&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;다음 활성&amp;nbsp; 유저 인덱스 10000000&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;다음 인덱스를 찾기 위해 해당 과정을 무수히 반복해야함.&amp;nbsp; 비효율적인 연산이 발생하고 있음을 파악할 수 있음.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #666666; text-align: left;&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 data-ke-size=&quot;size16&quot;&gt;- 비활성 유저의 경우 boolean형 isDel[] 배열을 사용하여 관리함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- O(N)의 시간에서 인덱스 이동 시 O(1)로 시간을 줄여 효과적인 연산이 가능함.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 문제는 del 연산을 어떻게 처리하는지가 중점임&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;&lt;b&gt;  &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;&lt;b&gt;Code &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;&lt;b&gt;시간 초과 코드&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727939652598&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.*;

class Solution {
    static class User {
        int index;
        boolean active;

        public User(int index, boolean active) {
            this.index = index;
            this.active = active;
        }
    }

    static int nowIndex;
    static Stack&amp;lt;Integer&amp;gt; removed = new Stack&amp;lt;&amp;gt;();

    public String solution(int n, int k, String[] cmd) {
        
        nowIndex = k;
        User[] users = new User[n];
        for (int i = 0; i &amp;lt; n; i++) {
            users[i] = new User(i, true);  
        }

        for (String command : cmd) {
            processCommand(command, users);
        }

        return buildResult(users);
    }

    private static void processCommand(String command, User[] users) {
        StringTokenizer st = new StringTokenizer(command);
        String cmd = st.nextToken();

        switch (cmd) {
            case &quot;U&quot;:
                moveUp(users, Integer.parseInt(st.nextToken()));
                break;
            case &quot;D&quot;:
                moveDown(users, Integer.parseInt(st.nextToken()));
                break;
            case &quot;C&quot;:
                delete(users);
                break;
            case &quot;Z&quot;:
                undo(users);
                break;
        }
    }


    private static void moveUp(User[] users, int count) {
        int moveCount = 0;
        while (moveCount &amp;lt; count) {
            nowIndex--;
            if (users[nowIndex].active) {
                moveCount++;
            }
        }
    }


    private static void moveDown(User[] users, int count) {
        int moveCount = 0;
        while (moveCount &amp;lt; count) {
            nowIndex++;
            if (users[nowIndex].active) {
                moveCount++;
            }
        }
    }

    private static void delete(User[] users) {
        users[nowIndex].active = false; 
        removed.push(nowIndex); 

        if (isLastActiveRow(users)) {
            moveUp(users, 1); 
        } else {
            moveDown(users, 1); 
        }
    }


    private static boolean isLastActiveRow(User[] users) {
        for (int i = nowIndex + 1; i &amp;lt; users.length; i++) {
           if (users[i].active) {
             return false;  
         }
     }
     return true; 
    }


    private static void undo(User[] users) {
        int restoredIndex = removed.pop();
        users[restoredIndex].active = true; 
    }

    private static String buildResult(User[] users) {
        StringBuilder result = new StringBuilder();
        for (User user : users) {
            if (user.active) {
                result.append(&quot;O&quot;);
            } else {
                result.append(&quot;X&quot;);
            }
        }
        return result.toString();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;통과 코드 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727939585041&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.*;

class Solution {
    static class Node{
        int pre;
        int next;
        public Node(int pre, int next){
            this.pre = pre;
            this.next = next;
        }
    }
    public String solution(int n, int k, String[] cmd) {
        String answer = &quot;&quot;;
        Stack&amp;lt;Integer&amp;gt; delNode = new Stack&amp;lt;&amp;gt;();
        boolean[] isDel = new boolean[n];
        Node[] node = new Node[n]; 
        for(int i = 0; i &amp;lt; n; i++){
            node[i] = new Node(i-1, i +1);
        }
        node[n-1].next = -1; // 마지막 node 처리
        
        int nowIndex = k;
        
        for(String c : cmd){
            char command = c.charAt(0);
            if(command == 'U'){
                int cnt = Integer.parseInt(c.substring(2));
                while(cnt-- &amp;gt; 0) nowIndex = node[nowIndex].pre;
            }else if(command == 'D'){
                int cnt = Integer.parseInt(c.substring(2)); 
                while(cnt-- &amp;gt; 0) nowIndex = node[nowIndex].next;
            }else if(command == 'C'){
                delNode.push(nowIndex);
                isDel[nowIndex] = true;
                if(node[nowIndex].pre != -1) node[node[nowIndex].pre].next = node[nowIndex].next;
                if(node[nowIndex].next != -1) node[node[nowIndex].next].pre = node[nowIndex].pre;
                nowIndex = (node[nowIndex].next == -1) ? node[nowIndex].pre : node[nowIndex].next;
            }else if(command == 'Z'){
                int undoIndex = delNode.pop();
                isDel[undoIndex] = false;
                if(node[undoIndex].pre != -1) node[node[undoIndex].pre].next = undoIndex;
                if(node[undoIndex].next != -1) node[node[undoIndex].next].pre = undoIndex;
                
            }
        }
        
        // 결과 빌드
        StringBuilder result = new StringBuilder();
        for (int i = 0; i &amp;lt; n; i++) {
            if (isDel[i]) result.append('X');
            else result.append('O');
        }
        
        return result.toString();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JAVA/Algo 풀이</category>
      <author>보안공돌이</author>
      <guid isPermaLink="true">https://security-gom.tistory.com/82</guid>
      <comments>https://security-gom.tistory.com/82#entry82comment</comments>
      <pubDate>Thu, 3 Oct 2024 16:24:54 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] 경주로 건설 - JAVA</title>
      <link>https://security-gom.tistory.com/81</link>
      <description>&lt;h2 id=&quot;문제&quot; style=&quot;color: #000000; text-align: left;&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;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/67259&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/67259&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1727939492537&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;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/67259&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bpDblZ/hyXaHWStGw/4S6YKzKGnyHysicb94EKTk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/GJlim/hyXeeFsOSw/v9sp0jcVY3qKdem4SRDaJ1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/67259&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/67259&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bpDblZ/hyXaHWStGw/4S6YKzKGnyHysicb94EKTk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/GJlim/hyXeeFsOSw/v9sp0jcVY3qKdem4SRDaJ1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;​&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a62fca24-c212-415e-bca9-5192e31e166b&quot; style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;  &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;문제 접근 &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;전형적인 bfs 문제이나 다음과 같은 부분을 중점으로 코드를 구성함.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;기존 bfs처럼 방문했다면 방문을 하지 않는 것이 아닌 다른 경로를 통해 해당 위치에 도착하는 경우가 비용이 더 저렴할 수 있다는 점을 고려하여 아래와 같은 로직을 구성함.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;4방향에 대해 3차원 배열을 구성하고 비용이 적을 때만 해당 위치의 값을 갱신할 수 있도록 구성함.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(newCost&amp;nbsp;&amp;lt;&amp;nbsp;cost[nx][ny][i])&amp;nbsp;{&lt;br /&gt;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cost[nx][ny][i]&amp;nbsp;=&amp;nbsp;newCost;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;&lt;b&gt;  &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;&lt;b&gt;Code &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1727939279685&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.*;

class Solution {
    static class Car {
        int x, y, score, d;
        public Car(int x, int y, int score, int d) {
            this.x = x;
            this.y = y;
            this.score = score;
            this.d = d;
        }
    }
    
    public int solution(int[][] board) {
        int N = board.length;
        int[][][] cost = new int[N][N][4];
        for (int i = 0; i &amp;lt; N; i++) {
            for (int j = 0; j &amp;lt; N; j++) {
                Arrays.fill(cost[i][j], Integer.MAX_VALUE);
            }
        }
        
        int answer = Math.min(minCost(board, 0, cost), minCost(board, 3, cost));
        return answer;
    }
    
    private int minCost(int[][] board, int startDir, int[][][] cost) {
        int[] dx = {1, 0, -1, 0};
        int[] dy = {0, -1, 0, 1};
        int N = board.length;
        Queue&amp;lt;Car&amp;gt; moveQueue = new LinkedList&amp;lt;&amp;gt;();
        
        cost[0][0][startDir] = 0;
        moveQueue.add(new Car(0, 0, 0, startDir));
        
        int result = Integer.MAX_VALUE;
        while (!moveQueue.isEmpty()) {
            Car now = moveQueue.poll();
            
            if (now.x == N - 1 &amp;amp;&amp;amp; now.y == N - 1) {
                result = Math.min(result, now.score);
                continue;
            }
            
            for (int i = 0; i &amp;lt; 4; i++) {
                int nx = now.x + dx[i];
                int ny = now.y + dy[i];
                
                if (nx &amp;gt;= 0 &amp;amp;&amp;amp; nx &amp;lt; N &amp;amp;&amp;amp; ny &amp;gt;= 0 &amp;amp;&amp;amp; ny &amp;lt; N &amp;amp;&amp;amp; board[nx][ny] == 0) {
                    int newCost = now.score + ((now.d == i) ? 100 : 600);
                    if (newCost &amp;lt; cost[nx][ny][i]) {
                        cost[nx][ny][i] = newCost;
                        moveQueue.add(new Car(nx, ny, newCost, i));
                    }
                }
            }
        }
        
        return result;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JAVA/Algo 풀이</category>
      <author>보안공돌이</author>
      <guid isPermaLink="true">https://security-gom.tistory.com/81</guid>
      <comments>https://security-gom.tistory.com/81#entry81comment</comments>
      <pubDate>Thu, 3 Oct 2024 16:12:12 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] 거리두기 확인하기 - JAVA</title>
      <link>https://security-gom.tistory.com/80</link>
      <description>&lt;h2 id=&quot;문제&quot; style=&quot;color: #000000; text-align: left;&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;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/81302&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/81302&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1727938884886&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;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/81302&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b5xojX/hyXd9c5hET/UskJMfmjLjbpvsw93A0mv1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/ziesV/hyXd6tTb1l/mIv2ofy8Xygd2302NLp4bk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/81302&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/81302&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b5xojX/hyXd9c5hET/UskJMfmjLjbpvsw93A0mv1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/ziesV/hyXd6tTb1l/mIv2ofy8Xygd2302NLp4bk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-a62fca24-c212-415e-bca9-5192e31e166b&quot; style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;  &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;문제 접근 &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;다음과 같은 조건을 만족해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;대기실은 5개이며, 각 대기실은 5x5 크기&lt;br /&gt;거리두기를 위하여 응시자들 끼리는 맨해튼 거리1가 2 이하로 앉지 말아야 한다.&lt;br /&gt;단, 응시자가 앉아있는 자리 사이가 파티션으로 막혀 있을 경우에는 허용함&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;맨해튼 거리 1인 경우와 2인 경우를 분리하여 코드를 구성한다면 보다 쉽게 문제를 해결 할 수 있다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;1072&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTY5MU/btsJUMCL4Ek/I8dEj6YezCdrbf6hI00eY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTY5MU/btsJUMCL4Ek/I8dEj6YezCdrbf6hI00eY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTY5MU/btsJUMCL4Ek/I8dEj6YezCdrbf6hI00eY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTY5MU%2FbtsJUMCL4Ek%2FI8dEj6YezCdrbf6hI00eY1%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;1258&quot; height=&quot;1072&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;1072&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;&lt;b&gt;  &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;&lt;b&gt;Code &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727939144155&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    static final int size = 5;
    
    public int[] solution(String[][] places) {
        int[] answer = new int[size];
        
        int i = 0;
        for (String[] place : places) {
            answer[i++] = distance(place); 
        }
        return answer;
    }
    
    private static int distance(String[] place) {
        char[][] map = new char[size][size];
        
        for (int i = 0; i &amp;lt; size; i++) {
            map[i] = place[i].toCharArray(); 
        }
        
        return isPossible(map) ? 1 : 0;
    }
    
    private static boolean isPossible(char[][] map) {
        for (int i = 0; i &amp;lt; size; i++) {
            for (int j = 0; j &amp;lt; size; j++) {
                if (map[i][j] == 'P') {
                    if (!distanceManhattan(map, i, j)) {
                        return false;
                    }
                }
            }
        }
        return true;
    }
    
    private static boolean distanceManhattan(char[][] map, int x, int y) {
        int[] dx = {-1, 0, 1, 0};
        int[] dy = {0, -1, 0, 1};
        
        for (int dir = 0; dir &amp;lt; 4; dir++) {
            int nx = x + dx[dir];
            int ny = y + dy[dir];
            
            if (isValid(nx, ny) &amp;amp;&amp;amp; map[nx][ny] == 'P') {
                return false;
            }
        }
        
        int[][] checkDist2 = {
            {-2, 0}, {2, 0}, {0, -2}, {0, 2}, {-1, -1}, {-1, 1}, {1, -1}, {1, 1}
        };
        
        for (int[] d : checkDist2) {
            int nx = x + d[0];
            int ny = y + d[1];
            
            if (isValid(nx, ny) &amp;amp;&amp;amp; map[nx][ny] == 'P') {
                if (d[0] == 0) { 
                    if (map[x][(y + ny) / 2] != 'X') {
                        return false; 
                    }
                } else if (d[1] == 0) {  
                    if (map[(x + nx) / 2][y] != 'X') {
                        return false; 
                    }
                } else {
                    if (map[x][ny] != 'X' || map[nx][y] != 'X') {
                        return false; 
                    }
                }
            }
        }
        
        return true;
    }
    
    private static boolean isValid(int x, int y) {
        return x &amp;gt;= 0 &amp;amp;&amp;amp; x &amp;lt; size &amp;amp;&amp;amp; y &amp;gt;= 0 &amp;amp;&amp;amp; y &amp;lt; size;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JAVA/Algo 풀이</category>
      <author>보안공돌이</author>
      <guid isPermaLink="true">https://security-gom.tistory.com/80</guid>
      <comments>https://security-gom.tistory.com/80#entry80comment</comments>
      <pubDate>Thu, 3 Oct 2024 16:06:35 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] 징검다리 건너기 - JAVA</title>
      <link>https://security-gom.tistory.com/79</link>
      <description>&lt;h2 id=&quot;문제&quot; style=&quot;color: #000000; text-align: left;&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;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/64062&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/64062&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1727938004981&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;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/64062&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fYxFX/hyXaGcyjWl/frwbSt9ymxgMgcKyAVwVZ0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cmPw41/hyXazYNYzz/4wpDMcwT9bWyO3uKjGfkX1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/64062&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/64062&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fYxFX/hyXaGcyjWl/frwbSt9ymxgMgcKyAVwVZ0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cmPw41/hyXazYNYzz/4wpDMcwT9bWyO3uKjGfkX1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;​&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a62fca24-c212-415e-bca9-5192e31e166b&quot; style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;  &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;문제 접근 &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;해당 문제를 해결하기 위해서는 다음과 같은 조건을 만족해야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;1. 디딤돌의 숫자를 한 번 밟을 때 마다 1씩 줄어든다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;2. 0이 되면 해당 돌을 밟을 수 없다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;3. 무조건 가장 가까운 돌로만 건널 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;4. 최대로 건너뛸 수 있는 돌은 K개 이다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&quot;핵심 아이디어&quot;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;돌의 숫자 - 뛸 수 있는 인원이 &amp;lt;0 일 때 돌을 건너뛴다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;건너뛴 돌의 수가 K수와 같아진다면 건널 수 없다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;for(int&amp;nbsp;stone&amp;nbsp;:&amp;nbsp;stones){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(stone&amp;nbsp;-&amp;nbsp;friends&amp;nbsp;&amp;lt;&amp;nbsp;0){&lt;br /&gt;&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;jump++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}else{&lt;br /&gt;&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;jump&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&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;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(jump&amp;nbsp;==&amp;nbsp;k){&lt;br /&gt;&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;return&amp;nbsp;false;&lt;br /&gt;&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;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;뛸 수 인원이 20,000,000명 일 수 있기 때문에 1명부터 20,000,000을 모두 계산하는 것은 매우 비효율적이다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이분탐색 기법을 활용하여 최대의 인원에서 / 2씩 수행하며 최소 값을 구하는 것이 현명하다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;&lt;b&gt;  &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;&lt;b&gt;Code &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1727938502244&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int solution(int[] stones, int k) {
        int answer = 0;
        
        int min =  1;
        int max = 200000000;
        
        while(min &amp;lt;= max){
            int mid = (min + max) / 2 ;
            // 넘어갈 수 있다면 
            if(isPossible(stones, k, mid)){
                min = mid +1 ;
                answer = Math.max(answer, mid);
            }else{
                // 못 넘어간다면 
                max = mid - 1;
            }
            
        }
        return answer;
    }
    
    public static boolean isPossible(int[] stones, int k, int friends){
        int jump = 0;
        for(int stone : stones){
            if(stone - friends &amp;lt; 0){
                jump++;
            }else{
                jump = 0;
            }
            if(jump == k){
                return false;
            }
        }
        return true;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JAVA/Algo 풀이</category>
      <author>보안공돌이</author>
      <guid isPermaLink="true">https://security-gom.tistory.com/79</guid>
      <comments>https://security-gom.tistory.com/79#entry79comment</comments>
      <pubDate>Thu, 3 Oct 2024 15:56:32 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] 보석 쇼핑 - JAVA</title>
      <link>https://security-gom.tistory.com/78</link>
      <description>&lt;h2 id=&quot;문제&quot; style=&quot;color: #000000; text-align: left;&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;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/67258&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/67258&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1727937280861&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;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/67258&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dLzc8J/hyXd5aGmHt/rJSMqQYgWUzUQm0ojW5lK1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/HJK9I/hyXd2ZkzMc/2mqrHvfFgQI9dT3TyBAi00/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/67258&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/67258&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dLzc8J/hyXd5aGmHt/rJSMqQYgWUzUQm0ojW5lK1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/HJK9I/hyXd2ZkzMc/2mqrHvfFgQI9dT3TyBAi00/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;​&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a62fca24-c212-415e-bca9-5192e31e166b&quot; style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;  &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;문제 접근 &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;해당 문제 해결을 위해 다음과 같은 조건을 만족해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1. 모든 보석을 구매해야한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;2. 모든 보석을 구매하며 가장 짧은 구간을 찾아야 한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1번 조건을 해결하기 위해 보석의 총 개수를 Set를 통하여 구하며 Map을 사용하여 보석을 Key로 지정하여 gemsSize와 동일한지 비교한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;int&amp;nbsp;gemsSize&amp;nbsp;=&amp;nbsp;allGems.size();&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Map&amp;lt;String, Integer&amp;gt; gemsMap = new HashMap&amp;lt;&amp;gt;();&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;gemsMap.size() == gemsSize // 다음과 같은 조건이 만족된다면 1번 조건을 만족함.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;2번 조건을 만족하기 위해서는 구간을 줄여나가는 것이 중요함. 1번 조건을 만족하는 상태에서 시작 지점을 점차 키워나간다면 가장 짧은 구간의 Start 지점을 찾을 수 있다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;즉, 슬라이딩 윈도우를 사용한다면 문제를 해결할 수 있다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;코드는 아래와 같다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;&lt;b&gt;  &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;&lt;b&gt;Code &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727937742881&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.*;

class Solution {
    public int[] solution(String[] gems) {
        int[] answer = {};
        Set&amp;lt;String&amp;gt; allGems = new HashSet&amp;lt;&amp;gt;(Arrays.asList(gems));
        
        Map&amp;lt;String, Integer&amp;gt; gemsMap = new HashMap&amp;lt;&amp;gt;();
        
        
        int gemsSize = allGems.size();
        int minLength = Integer.MAX_VALUE;
        int start = 0, end = 0;
        int startIndex = 0;
        
        while(end &amp;lt; gems.length){
           
            gemsMap.put(gems[end], gemsMap.getOrDefault(gems[end], 0) + 1);
            end++;
            
            while(gemsMap.size() == gemsSize){
                if(end - start &amp;lt; minLength){
                    minLength = end - start;
                    startIndex = start;  
                }
                
                gemsMap.put(gems[start], gemsMap.get(gems[start]) -1);
                if(gemsMap.get(gems[start]) == 0 ){
                    gemsMap.remove(gems[start]);
                }
                start++;
            }
            
            
        }
        
        return new int[]{startIndex + 1, startIndex + minLength};
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JAVA/Algo 풀이</category>
      <author>보안공돌이</author>
      <guid isPermaLink="true">https://security-gom.tistory.com/78</guid>
      <comments>https://security-gom.tistory.com/78#entry78comment</comments>
      <pubDate>Thu, 3 Oct 2024 15:45:41 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] 양과 늑대 - JAVA</title>
      <link>https://security-gom.tistory.com/77</link>
      <description>&lt;h2 id=&quot;문제&quot; style=&quot;color: #000000; text-align: left;&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;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/92343?language=java&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/92343?language=java&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1720053139098&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;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/92343?language=java&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Tb9gk/hyWvUg83k2/EQydX8deaW4m7cuhpG3Aq0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/b3wck9/hyWvMpTeUE/zx9K53f3xPSdgTrKGTXVUK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/92343?language=java&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/92343?language=java&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Tb9gk/hyWvUg83k2/EQydX8deaW4m7cuhpG3Aq0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/b3wck9/hyWvMpTeUE/zx9K53f3xPSdgTrKGTXVUK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;​&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a62fca24-c212-415e-bca9-5192e31e166b&quot; style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;  &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;문제 접근 &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;- 모든 상황에 대해 DFS 순회가 가능하도록 설계&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 노드 방문 여부에 따른 Cnt 체크&amp;nbsp;&lt;/li&gt;
&lt;li&gt;sheepCnt가&lt;span&gt;&amp;nbsp;&lt;/span&gt;wolfCnt보다 작거나 같은 경우 Return&amp;nbsp;&lt;/li&gt;
&lt;li&gt;부모 노드 방문, 자식 노드 미방문 시 순회.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;&lt;b&gt;  &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;&lt;b&gt;Code &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1720053155484&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {

    int[] copyInfo;
    int[][] copyEdges;
    int maxSheepCnt = 0;
    
    int SHEEP = 0;
    int WOLF = 1;

    public int solution(int[] info, int[][] edges) {
        copyInfo = info; // 총 길이
        copyEdges = edges;
        boolean[] visited = new boolean[info.length];
        dfs(0, visited, 0, 0);

        return maxSheepCnt;
    }

    public void dfs(int idx, boolean[] visited, int sheepCnt, int wolfCnt) {
        visited[idx] = true; // 방문 노드 체크
        // if (gInfo[idx] == 0)
        if (copyInfo[idx] == SHEEP) { // 양이라면 
            sheepCnt++;
            maxSheepCnt = Math.max(maxSheepCnt, sheepCnt);
        } else { // 늑대라면
            wolfCnt++;
        }

        if (sheepCnt &amp;lt;= wolfCnt) { // 늑대가 양보다 같거나 많으면 종료
            return;
        }

        for (int[] edge : copyEdges) { // 모든 상황에 대한 순회
            if (visited[edge[0]] &amp;amp;&amp;amp; !visited[edge[1]]) { // 부모 노드는 방문했고, 자식 노드는 방문하지 않았을 때 
            	boolean[] nextVisited = deepCopyVisitedArray(visited);
                
                dfs(edge[1], nextVisited, sheepCnt, wolfCnt);
            }
        }
    }
    
    public boolean[] deepCopyVisitedArray(boolean array[]){
        boolean[] copyVisitedArray = new boolean[array.length];
            for (int i = 0; i &amp;lt; array.length; i++) {
                copyVisitedArray[i] = array[i];
        }
        return copyVisitedArray;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;&lt;b&gt;  &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;&lt;b&gt;Code Review&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- 코드 리펙터링 내용&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- 작은 단위의 함수화&lt;/p&gt;
&lt;pre id=&quot;code_1720053426866&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 최대 값을 갱신하는 Math.max 를 활용하여 가독성을 증대 시켰음

 maxSheepCnt = Math.max(maxSheepCnt, sheepCnt);
// if (sheepCnt &amp;gt; maxSheepCnt) {
 //     maxSheepCnt = sheepCnt;
// }
 

     
# 아래 반복문을 함수로 변경하였음
                
boolean[] nextVisited = new boolean[visited.length];
for (int i = 0; i &amp;lt; visited.length; i++) {
                	nextVisited[i] = visited[i];

boolean[] nextVisited = deepCopyVisitedArray(visited);

    public boolean[] deepCopyVisitedArray(boolean array[]){
        boolean[] copyVisitedArray = new boolean[array.length];
            for (int i = 0; i &amp;lt; array.length; i++) {
                copyVisitedArray[i] = array[i];
        }
        return copyVisitedArray;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;&lt;b&gt;  &lt;/b&gt;&lt;b&gt;배운 점&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&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;</description>
      <category>JAVA/Algo 개념</category>
      <category>dfs</category>
      <category>Java</category>
      <category>알고</category>
      <category>알고리즘</category>
      <category>프로그래머스</category>
      <author>보안공돌이</author>
      <guid isPermaLink="true">https://security-gom.tistory.com/77</guid>
      <comments>https://security-gom.tistory.com/77#entry77comment</comments>
      <pubDate>Thu, 4 Jul 2024 09:39:11 +0900</pubDate>
    </item>
    <item>
      <title>Java Collection Framework - Collection interface - Map</title>
      <link>https://security-gom.tistory.com/76</link>
      <description>&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;오늘은 Java Collection Freamwork의 마지막 자료구조인&amp;nbsp; Map에 대해 설명드리도록 하겠습니다.&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;Map 자료 구조의 경우와 같은 특징을 가지고 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Key와 Value의 쌍으로 데이터를 저장한다.&lt;/li&gt;
&lt;li&gt;Value의 경우 중복이 허용되지만, Key의 경우 중복을 허용하지 않는다.&lt;/li&gt;
&lt;li&gt;중복된 키를 사용하게 되면 기존 값이 삭제 되고 마지막 저장 값을 다시 저장한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;저장 순서를 보장하지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, Map Interface 안에는 HashMap, LinkedHashMap, HashTable, TeeMap 등이 존재하는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 특징을 하나 하나 살펴보도록 하겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1725&quot; data-origin-height=&quot;973&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cc2YCc/btsIj97Tl7b/sx9X0ohUFSLTVsVnwScAf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cc2YCc/btsIj97Tl7b/sx9X0ohUFSLTVsVnwScAf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cc2YCc/btsIj97Tl7b/sx9X0ohUFSLTVsVnwScAf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcc2YCc%2FbtsIj97Tl7b%2Fsx9X0ohUFSLTVsVnwScAf1%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;1725&quot; height=&quot;973&quot; data-origin-width=&quot;1725&quot; data-origin-height=&quot;973&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1717&quot; data-origin-height=&quot;970&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9Kwmd/btsIkkaeFGx/hlL1NBb2y8MVS5Ru3pEsYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9Kwmd/btsIkkaeFGx/hlL1NBb2y8MVS5Ru3pEsYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9Kwmd/btsIkkaeFGx/hlL1NBb2y8MVS5Ru3pEsYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9Kwmd%2FbtsIkkaeFGx%2FhlL1NBb2y8MVS5Ru3pEsYK%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;1717&quot; height=&quot;970&quot; data-origin-width=&quot;1717&quot; data-origin-height=&quot;970&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;Map의 Entry에 대해 먼저 알아보도록 하겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Entry는 Map Interface 안에 있는 내부 인터페이스입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Map에 저장되는 Key-Value 쌍의 Node 내부 클래스가 이를 구현하고 있다는 특징을 가지고 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Map 자료구조를 보다 객체지향적인 설계를 하도록 유도하기 위함입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1715&quot; data-origin-height=&quot;958&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0Af8t/btsIjL0r7UV/WO2hpmTT1ZNHzFoYpdSdJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0Af8t/btsIjL0r7UV/WO2hpmTT1ZNHzFoYpdSdJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0Af8t/btsIjL0r7UV/WO2hpmTT1ZNHzFoYpdSdJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0Af8t%2FbtsIjL0r7UV%2FWO2hpmTT1ZNHzFoYpdSdJk%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;1715&quot; height=&quot;958&quot; data-origin-width=&quot;1715&quot; data-origin-height=&quot;958&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;p data-ke-size=&quot;size16&quot;&gt;그럼 HashMap부터 알아볼까요?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HashMap 은 기존은 HashTable의 단점을 보완한 컬렉션 입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열과 연결이 결합된 Hashing 형태로 Key,Value를 묶어 하나의 데이터로 저장한다는 특징을 가지고 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Map의 기본적인 특징을 잘 보여주는 예시로 중복을 허용하지 않으며 순서를 보장하지 않습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Key 및 Value로 Null을 허용한다는 특징도 가지고 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만, 비동기 처리로 동작하기 때문에 멀티 쓰레드 환경에서 적합하지 않습니다. 해당 경우는 다중 쓰레드에서 하나의 자료구조를 참조할 수 있도록 ConcurrentHashMap을 사용하곤 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1716&quot; data-origin-height=&quot;968&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yidYu/btsIiQ9bJEC/ItWtuY4EuK7YzDpMLcOO6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yidYu/btsIiQ9bJEC/ItWtuY4EuK7YzDpMLcOO6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yidYu/btsIiQ9bJEC/ItWtuY4EuK7YzDpMLcOO6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyidYu%2FbtsIiQ9bJEC%2FItWtuY4EuK7YzDpMLcOO6k%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;1716&quot; height=&quot;968&quot; data-origin-width=&quot;1716&quot; data-origin-height=&quot;968&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1730&quot; data-origin-height=&quot;959&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cU9sDF/btsIjb6i4aH/ReBSxCwXZTBW9kLARJ2wD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cU9sDF/btsIjb6i4aH/ReBSxCwXZTBW9kLARJ2wD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cU9sDF/btsIjb6i4aH/ReBSxCwXZTBW9kLARJ2wD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcU9sDF%2FbtsIjb6i4aH%2FReBSxCwXZTBW9kLARJ2wD1%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;1730&quot; height=&quot;959&quot; data-origin-width=&quot;1730&quot; data-origin-height=&quot;959&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1731&quot; data-origin-height=&quot;971&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P0krr/btsIkPAVTE5/RTKlwtnfqnFUC7SojS7Hkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P0krr/btsIkPAVTE5/RTKlwtnfqnFUC7SojS7Hkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P0krr/btsIkPAVTE5/RTKlwtnfqnFUC7SojS7Hkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP0krr%2FbtsIkPAVTE5%2FRTKlwtnfqnFUC7SojS7Hkk%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;1731&quot; height=&quot;971&quot; data-origin-width=&quot;1731&quot; data-origin-height=&quot;971&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;다음은 LinkedHashMap입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전, 포스팅에서 Linked라는 이름이 붙으면 순서를 보장한다고 했던 것 기억하시나요?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 자료구조도 동일한 특징을 갖고 있습니다. HashMap의 특징을 가지고 있지만 들어온 순서를 보장한다는 특징을 보여주고 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 10,20,50 순으로 넣게 된다면 해당 순서를 기억하여 10, 20,50 이 출력됨을 확인할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1730&quot; data-origin-height=&quot;964&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oNzyw/btsIiPPXftx/2oMMGunW3darsCGkluUBok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oNzyw/btsIiPPXftx/2oMMGunW3darsCGkluUBok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oNzyw/btsIiPPXftx/2oMMGunW3darsCGkluUBok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoNzyw%2FbtsIiPPXftx%2F2oMMGunW3darsCGkluUBok%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;1730&quot; height=&quot;964&quot; data-origin-width=&quot;1730&quot; data-origin-height=&quot;964&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1722&quot; data-origin-height=&quot;969&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bL9GuE/btsIkhEBxtf/9DWDS6L7Fmyt4uiZ61K080/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bL9GuE/btsIkhEBxtf/9DWDS6L7Fmyt4uiZ61K080/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bL9GuE/btsIkhEBxtf/9DWDS6L7Fmyt4uiZ61K080/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbL9GuE%2FbtsIkhEBxtf%2F9DWDS6L7Fmyt4uiZ61K080%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;1722&quot; height=&quot;969&quot; data-origin-width=&quot;1722&quot; data-origin-height=&quot;969&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;마지막으로 TreeMap 입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LinkedHashMap과 유사한 특징을 가지지만 순서를 기억하는 것이 아닌 정렬이 된다는 특징을 갖습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 이진 검색 트리의 형태로 범위 검색 시 큰 장점을 가지고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만, 정렬이 지속적으로 이루어지기 때문에 저장 시간의 경우 오래 걸린다는 특징을 가지고 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇기 때문에 10,20,50,40을 넣더라도 나오는 순서는 -&amp;gt; 10,20,40,50으로 정렬된 것을 확인할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1710&quot; data-origin-height=&quot;961&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZZRIr/btsIifOYzLd/9GFf1vuTZWSKpSCDWLtp40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZZRIr/btsIifOYzLd/9GFf1vuTZWSKpSCDWLtp40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZZRIr/btsIifOYzLd/9GFf1vuTZWSKpSCDWLtp40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZZRIr%2FbtsIifOYzLd%2F9GFf1vuTZWSKpSCDWLtp40%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;1710&quot; height=&quot;961&quot; data-origin-width=&quot;1710&quot; data-origin-height=&quot;961&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;p data-ke-size=&quot;size16&quot;&gt;아래 문제들을 풀며 Map 자료구조에 대해 익혀보시는 것을 권장드립니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1719&quot; data-origin-height=&quot;966&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vsGHn/btsIjLlQbRJ/LPRk6UrPhCYqua1eNeojT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vsGHn/btsIjLlQbRJ/LPRk6UrPhCYqua1eNeojT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vsGHn/btsIjLlQbRJ/LPRk6UrPhCYqua1eNeojT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvsGHn%2FbtsIjLlQbRJ%2FLPRk6UrPhCYqua1eNeojT1%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;1719&quot; height=&quot;966&quot; data-origin-width=&quot;1719&quot; data-origin-height=&quot;966&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>JAVA/개념</category>
      <category>collecton framework</category>
      <category>HashMap</category>
      <category>LinkedHashMap</category>
      <category>MAP</category>
      <category>Treemap</category>
      <category>자료구조</category>
      <category>자바</category>
      <author>보안공돌이</author>
      <guid isPermaLink="true">https://security-gom.tistory.com/76</guid>
      <comments>https://security-gom.tistory.com/76#entry76comment</comments>
      <pubDate>Tue, 2 Jul 2024 10:22:15 +0900</pubDate>
    </item>
    <item>
      <title>Java Collection Framework - Collection interface - Set</title>
      <link>https://security-gom.tistory.com/75</link>
      <description>&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;오늘은 이전 포스팅에 있어 Set 자료구조에 대해 알아보도록 하겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Set Interface는 아래와 같은 특징을 가지고 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터의 중복을 허용하지 않으며 순서를 유지하지 않음.&lt;/li&gt;
&lt;li&gt;순서가 존재하지 않기 때문에 Index로 접근이 불가능함.&lt;/li&gt;
&lt;li&gt;중복이 불가능하기 때문에 null 또한, 한 개만 저장할 수 있음.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3116&quot; data-origin-height=&quot;1754&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3QZSa/btsH70JyC5Z/0vydWSTQKNfPt1kW5xuiP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3QZSa/btsH70JyC5Z/0vydWSTQKNfPt1kW5xuiP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3QZSa/btsH70JyC5Z/0vydWSTQKNfPt1kW5xuiP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3QZSa%2FbtsH70JyC5Z%2F0vydWSTQKNfPt1kW5xuiP1%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;3116&quot; height=&quot;1754&quot; data-origin-width=&quot;3116&quot; data-origin-height=&quot;1754&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3920&quot; data-origin-height=&quot;2208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOzgk6/btsH622s0tY/WKLCFi1BxbcGxrj9CdDSXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOzgk6/btsH622s0tY/WKLCFi1BxbcGxrj9CdDSXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOzgk6/btsH622s0tY/WKLCFi1BxbcGxrj9CdDSXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOzgk6%2FbtsH622s0tY%2FWKLCFi1BxbcGxrj9CdDSXK%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;3920&quot; height=&quot;2208&quot; data-origin-width=&quot;3920&quot; data-origin-height=&quot;2208&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;그럼 HashSet에 대해 알아보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HashSet는 아래와 같은 특징을 가지고 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&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;추가, 삭제, 검색 등의 접근성이 매우 뛰어남.&lt;/li&gt;
&lt;li&gt;순서가 보장되지 않아 순서 예측은 불가능.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3920&quot; data-origin-height=&quot;2206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d6FGNR/btsH8fzN3Sz/qAKtQF9bAwi6kF3ChZkZj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d6FGNR/btsH8fzN3Sz/qAKtQF9bAwi6kF3ChZkZj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d6FGNR/btsH8fzN3Sz/qAKtQF9bAwi6kF3ChZkZj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd6FGNR%2FbtsH8fzN3Sz%2FqAKtQF9bAwi6kF3ChZkZj1%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;3920&quot; height=&quot;2206&quot; data-origin-width=&quot;3920&quot; data-origin-height=&quot;2206&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1718940919064&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Set&amp;lt;Integer&amp;gt; hashSet = new HashSet&amp;lt;&amp;gt;();

hashSet.add(70);
hashSet.add(20);
hashSet.add(90);
hashSet.add(20); // 중복

hashSet.size(); // 3 - 중복 카운트 X

hashSet.toString(); // [20, 90, 70]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약, 순서를 유지하는 Set 자료 구조가 필요하다면 어떻게 해야 할까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 순서 유지는 필요하지만 중복을 제거하고 싶다면 LinkedHashSet를 사용하면 됩니다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;순서를 가지는 Set 자료구조&lt;/li&gt;
&lt;li&gt;추가된 순서 또는 가장 최근에 접근한 순서대로 접근이 가능함&lt;/li&gt;
&lt;li&gt;중복은 제거하며 순서를 유지하고 싶을 때 적합&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3920&quot; data-origin-height=&quot;2206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brOmOS/btsH7BXFffu/DfrxGEt9kYPgsOk39rfzWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brOmOS/btsH7BXFffu/DfrxGEt9kYPgsOk39rfzWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brOmOS/btsH7BXFffu/DfrxGEt9kYPgsOk39rfzWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrOmOS%2FbtsH7BXFffu%2FDfrxGEt9kYPgsOk39rfzWK%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;3920&quot; height=&quot;2206&quot; data-origin-width=&quot;3920&quot; data-origin-height=&quot;2206&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1718941450256&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Set&amp;lt;Integer&amp;gt; linkedHashSet = new LinkedHashSet&amp;lt;&amp;gt;();

linkedHashSet.add(70);
linkedHashSet.add(20);
linkedHashSet.add(80);
linkedHashSet.add(20); // 중복 추가

linkedHashSet.size(); // 3 - 중복 카운트 X

linkedHashSet.toString(); // [70, 20, 80] 입력 순서 유지&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼, 데이터를 정렬하며 중복을 허용하지 않을 때는 어떤 자료구조를 사용하면 될까요?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TreeSet 자료를 사용하시면 되는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TreeSet은 이진 검색 트리 자료구조를 기반으로 데이터를 저장합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 데이터를 정렬하고 범위 검색, 정렬, 검색 등에서 높은 성능을 보장한다는 것이 특징이며 Set을 기반으로 하고 있기 때문에 중복을 허용하지 않는 특징을 가지게 됩니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3920&quot; data-origin-height=&quot;2206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yxYXg/btsH6B5pbUD/EYBbbFkSs6e7FQa5hYDOYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yxYXg/btsH6B5pbUD/EYBbbFkSs6e7FQa5hYDOYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yxYXg/btsH6B5pbUD/EYBbbFkSs6e7FQa5hYDOYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyxYXg%2FbtsH6B5pbUD%2FEYBbbFkSs6e7FQa5hYDOYK%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;3920&quot; height=&quot;2206&quot; data-origin-width=&quot;3920&quot; data-origin-height=&quot;2206&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1718942466665&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Set&amp;lt;Integer&amp;gt; treeSet = new TreeSet&amp;lt;&amp;gt;();

treeSet.add(5);
treeSet.add(3);
treeSet.add(4);
treeSet.add(1);
treeSet.add(2);

treeSet.toString(); // [1, 2, 3, 4, 5]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 문제를 풀어보도록 하겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 문제들이 어떤 자료구조에 적합한지 결정해 볼까요.&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. 중복을 허용하지 않는다. (y / n)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 순서가 중요하다.&amp;nbsp; (y / n)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 정렬이 되어 있어야 한다. (y / n)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/3052&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;백준 3052 나머지&amp;nbsp;&lt;/a&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1718944584901&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;

public class BOJ_3052 {
    /*
     * 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다. 그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.
     * 1. 중복을 허용하지 않는다. (y / n) =&amp;gt; Y(서로 다른 값) 
     * 2. 순서가 중요하다.  (y / n) =&amp;gt; N (순서가 중요하지 않음, 크기가 중요함)
     * 3. 정렬이 되어 있어야 한다. (y / n) =&amp;gt; N (정렬이 중요하지 않음, 크기가 중요함)
     * 
     * 단순 Set 자료로 해결이 가능하기에 HashSet을 통해 문제를 해결 가능함.
     */
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
        Set&amp;lt;Integer&amp;gt; set = new HashSet&amp;lt;&amp;gt;();

        for (int i = 0; i &amp;lt; 10; i++) {
            int temp = Integer.parseInt(br.readLine()) % 42;
            set.add(temp);
        }
        System.out.println(set.size());
    }
    
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/13414&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;백준 13414 수강신청&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1718945506480&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.StringTokenizer;

public class BOJ_13414{
        /*
     * 순서에 따라 정렬해야함. + 중복 발생하면 안된다. 
     * 
     * 1. 중복을 허용하지 않는다. (y / n) =&amp;gt; Y(같은 값이 있으면 삭제 후 다시 삽입) 
     * 2. 순서가 중요하다.  (y / n) =&amp;gt; Y (수강 신청 시간 )
     * 3. 정렬이 되어 있어야 한다. (y / n) =&amp;gt; N 
     * 
     * 단순 Set 자료로 해결이 가능하기에 HashSet을 통해 문제를 해결 가능함.
     */
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
        StringBuilder sb = new StringBuilder();
		int k = Integer.parseInt(st.nextToken());
        int l = Integer.parseInt(st.nextToken());
		LinkedHashSet&amp;lt;String&amp;gt; hs = new LinkedHashSet&amp;lt;&amp;gt;();
		String tmp;

		for(int i=0;i&amp;lt;l;i++){
			tmp = br.readLine();
			if(hs.contains(tmp)) hs.remove(tmp);
			hs.add(tmp);
		}
		Iterator&amp;lt;String&amp;gt; it = hs.iterator();
		while(it.hasNext()){
            sb.append(it.next() + &quot;\n&quot;);
            if(--k &amp;lt; 1) break;
		}

        System.out.println(sb.toString());
		
		
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2957&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;백준 2957&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;위 문제는 TreeSet을 이용하여 풀 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 문제까지 풀어보시길 추천 드립니다.&amp;nbsp;&lt;/p&gt;</description>
      <category>JAVA/개념</category>
      <category>collecton framework</category>
      <category>set</category>
      <category>자료구조</category>
      <category>자바</category>
      <author>보안공돌이</author>
      <guid isPermaLink="true">https://security-gom.tistory.com/75</guid>
      <comments>https://security-gom.tistory.com/75#entry75comment</comments>
      <pubDate>Fri, 21 Jun 2024 14:07:01 +0900</pubDate>
    </item>
    <item>
      <title>Java Collection Framework - Collection interface - Queue</title>
      <link>https://security-gom.tistory.com/74</link>
      <description>&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;이전 시간에 이어 Collection Interface의 Queue를 배워보도록 하겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Queue 자료 구조는 대표적인 FIFO 형태로 먼저 들어온 원소가 가장 먼저 나가는 특징을 가지고 있는 자료 구조입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Queue의 구현체로는 양방향 큐라고 불리는 ArrayDeque, PriortyQueue 등이 존재합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3448&quot; data-origin-height=&quot;1952&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sAPMq/btsH7hqJ2yd/R8Obj0PMEfx3FLdxYgSEe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sAPMq/btsH7hqJ2yd/R8Obj0PMEfx3FLdxYgSEe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sAPMq/btsH7hqJ2yd/R8Obj0PMEfx3FLdxYgSEe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsAPMq%2FbtsH7hqJ2yd%2FR8Obj0PMEfx3FLdxYgSEe1%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;3448&quot; height=&quot;1952&quot; data-origin-width=&quot;3448&quot; data-origin-height=&quot;1952&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3448&quot; data-origin-height=&quot;1952&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lcluW/btsH6hFhmZc/xVgruR08CjLxlFdkeyk4Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lcluW/btsH6hFhmZc/xVgruR08CjLxlFdkeyk4Kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lcluW/btsH6hFhmZc/xVgruR08CjLxlFdkeyk4Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlcluW%2FbtsH6hFhmZc%2FxVgruR08CjLxlFdkeyk4Kk%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;3448&quot; height=&quot;1952&quot; data-origin-width=&quot;3448&quot; data-origin-height=&quot;1952&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;p data-ke-size=&quot;size16&quot;&gt;우선순위를 가지는 Queue로 부여된 우선순위에 맞춰 정렬되어 반환 값을 제공합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선순위를 지정하기 위해서는 compareTo 메서드를 통해 지정해주어야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적인 특징으로는 배열을 저장 공간으로 사용하고 힙 형태로 데이터를 저장한다는&amp;nbsp; 것인데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 우선순위 갱신이 빠르게 진행되고 가장 큰 값, 혹은 작은 값은 빠르게 찾을 수 있다는 장점이 존재합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3448&quot; data-origin-height=&quot;1952&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ecLCZJ/btsH6Rzka9h/qjo9xsykTUXv22kz9OzWsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ecLCZJ/btsH6Rzka9h/qjo9xsykTUXv22kz9OzWsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ecLCZJ/btsH6Rzka9h/qjo9xsykTUXv22kz9OzWsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FecLCZJ%2FbtsH6Rzka9h%2Fqjo9xsykTUXv22kz9OzWsK%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;3448&quot; height=&quot;1952&quot; data-origin-width=&quot;3448&quot; data-origin-height=&quot;1952&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1718867134558&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Student implements Comparable&amp;lt;Student&amp;gt; {
    String name; 
    int priority; 

    public Student(String name, int priority) {
        this.name = name;
        this.priority = priority;
    }
    @Override
    public int compareTo(Student user) {
      
        if (this.priority &amp;lt; user.priority) {
            return -1;
        } else if (this.priority == user.priority) {
            return 0;
        } else {
            return 1;
        }
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 Deque에 대해 알아볼까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Deque는 양방향으로 삽입, 삭제가 가능한 자료구조를 의미합니다.&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;Deque의 조상은 Queue이며 구현체로 LinkdList, ArrayDeque가 존재합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3448&quot; data-origin-height=&quot;1952&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UjKvN/btsH5BR1ypI/SCHaMPVVv47eD0AFCu1pcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UjKvN/btsH5BR1ypI/SCHaMPVVv47eD0AFCu1pcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UjKvN/btsH5BR1ypI/SCHaMPVVv47eD0AFCu1pcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUjKvN%2FbtsH5BR1ypI%2FSCHaMPVVv47eD0AFCu1pcK%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;3448&quot; height=&quot;1952&quot; data-origin-width=&quot;3448&quot; data-origin-height=&quot;1952&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;그럼 구현체인 ArrayDeque를 확인해 보도록 하겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열을 사용하여 구현되어 있기 때문에 스택의 사용 혹은 대기열로의 사용에서는 LinkedList보다 빠르다는 장점을 보여주고 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 사이즈의 제한이 없으며 null 저장을 허용하지 않는다는 특징을 가지고 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3448&quot; data-origin-height=&quot;1952&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkCrNG/btsH6ZDU0MY/c5jtXyzIkCIhRLWlkjVNJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkCrNG/btsH6ZDU0MY/c5jtXyzIkCIhRLWlkjVNJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkCrNG/btsH6ZDU0MY/c5jtXyzIkCIhRLWlkjVNJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkCrNG%2FbtsH6ZDU0MY%2Fc5jtXyzIkCIhRLWlkjVNJ1%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;3448&quot; height=&quot;1952&quot; data-origin-width=&quot;3448&quot; data-origin-height=&quot;1952&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;그럼 LinkedList는 어떤 상황에서 유리할까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Queue로의 구현 시 ArrayDeque 보다 성능이 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ArrayDeque의 경우 배열을 기반으로 하기에 앞의 데이터가 삭제됨에 따라 빈 공간을 채우기 위해 데이터의 이동이 빈번하게 이루어지기 때문입니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3448&quot; data-origin-height=&quot;1952&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cm0hPD/btsH6ZjByBG/uVpBRifJ0OUL8NFYcHzOH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cm0hPD/btsH6ZjByBG/uVpBRifJ0OUL8NFYcHzOH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cm0hPD/btsH6ZjByBG/uVpBRifJ0OUL8NFYcHzOH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcm0hPD%2FbtsH6ZjByBG%2FuVpBRifJ0OUL8NFYcHzOH1%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;3448&quot; height=&quot;1952&quot; data-origin-width=&quot;3448&quot; data-origin-height=&quot;1952&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;p data-ke-size=&quot;size16&quot;&gt;큐 문제로는 아래 문제를 풀어보시면 이해가 빠를 것이라 생각합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2075&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/2075&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;Deque 관련 문제로는 아래 문제를 풀어보시면 이해가 빠를 것이라 생각합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/10866&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/10866&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;다음 포스팅에서는 Set에 대해 알아보도록 하겠습니다.&amp;nbsp;&lt;/p&gt;</description>
      <category>JAVA/개념</category>
      <category>collection</category>
      <category>deque</category>
      <category>Framework</category>
      <category>Java</category>
      <category>PQ</category>
      <category>데큐</category>
      <category>우선순위 큐</category>
      <category>자료구조</category>
      <author>보안공돌이</author>
      <guid isPermaLink="true">https://security-gom.tistory.com/74</guid>
      <comments>https://security-gom.tistory.com/74#entry74comment</comments>
      <pubDate>Thu, 20 Jun 2024 16:32:30 +0900</pubDate>
    </item>
  </channel>
</rss>