<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>develop_C</title>
    <link>https://dev-chan2.tistory.com/</link>
    <description>초급 개발자
JAVA Back-end engineer 
학부생

틀리거나 부족한부분은 댓글 부탁드립니다 !</description>
    <language>ko</language>
    <pubDate>Tue, 19 May 2026 14:25:13 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>chan20</managingEditor>
    <item>
      <title>프로그래머스 : 후보키 (2019 KAKAO BLIND RECRUITMENT)</title>
      <link>https://dev-chan2.tistory.com/34</link>
      <description>&lt;article id=&quot;009ef319-1de5-4d49-b26e-1471e8f1ccbb&quot; class=&quot;page sans Notion_P&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-size: 1.44em; letter-spacing: -1px; font-family: -apple-system, BlinkMacSystemFont, AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Code&lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;page-body&quot;&gt;
&lt;pre id=&quot;8f81949d-9ce9-4228-9161-bd4becddc7a4&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;import java.util.*;
class Solution {
    Comparator&amp;lt;Integer&amp;gt; comp = new Comparator&amp;lt;Integer&amp;gt;() {
        int countBits(int n){
            int ret = 0 ;
            while(n!=0){
                if((n&amp;amp;1) != 0) ++ ret;
                n = n &amp;gt;&amp;gt;1;
            }
            return ret;
        }
        @Override
        public int compare(Integer o1, Integer o2) {
            int x = countBits(o1), y= countBits(o2);
            return x-y;

        }
    };
    public int solution(String[][] relation){
        int answer = 0;
        int row = relation.length;
        int cols = relation[0].length;
        List&amp;lt;Integer&amp;gt; candidates = new LinkedList&amp;lt;&amp;gt;();

        for(int i = 1 ; i &amp;lt; 1 &amp;lt;&amp;lt; cols; ++i){
            if(check(relation, row, cols, i)){
                candidates.add(i);
            }
        }
        Collections.sort(candidates, comp);

        while(candidates.size() != 0) {
            int n = candidates.remove(0);
            ++answer;
            for(Iterator&amp;lt;Integer&amp;gt; it = candidates.iterator(); it.hasNext();){
                int c = it.next();
                if((n &amp;amp; c) == n)
                    it.remove();
            }
        }
        return answer;
    }
    boolean check(String[][] relation, int row, int cols, int subset){
        for( int a = 0 ; a &amp;lt; row-1 ; a++){
            for(int b= a + 1 ; b &amp;lt; row;b++){
                boolean check = true;
                for(int k = 0; k &amp;lt; cols; k++){
                    if((subset &amp;amp; 1 &amp;lt;&amp;lt; k)==0) continue;
                    if(!relation[a][k].equals(relation[b][k])){
                        check = false;
                        break;
                    }
                }
                if(check) return false;
            }
        }
        return true;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;n2t_comment&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/article&gt;
&lt;h3 id=&quot;4eabf47a-a3d5-4e56-a56d-ace36a178ea7&quot; data-ke-size=&quot;size23&quot;&gt;Link&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a title=&quot;프로그래머스 : 후보키&quot; href=&quot;https://programmers.co.kr/learn/courses/30/lessons/42890&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://programmers.co.kr/learn/courses/30/lessons/42890&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/문제</category>
      <author>chan20</author>
      <guid isPermaLink="true">https://dev-chan2.tistory.com/34</guid>
      <comments>https://dev-chan2.tistory.com/34#entry34comment</comments>
      <pubDate>Sun, 9 Jan 2022 17:05:12 +0900</pubDate>
    </item>
    <item>
      <title>프로그래머스 : 프린터</title>
      <link>https://dev-chan2.tistory.com/33</link>
      <description>&lt;article id=&quot;92871fe4-fe98-484b-a896-a0b197e95b23&quot; class=&quot;page sans Notion_P&quot;&gt;
&lt;div class=&quot;page-body&quot;&gt;
&lt;h3 id=&quot;951b3446-01b0-477b-9073-950963bc2b0b&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;Link&lt;/h3&gt;
&lt;figure id=&quot;c1ab20c7-347f-4d5f-9273-77df8fa04572&quot;&gt;&lt;a class=&quot;bookmark source&quot; href=&quot;https://programmers.co.kr/learn/courses/30/lessons/42587&quot;&gt;
&lt;div class=&quot;bookmark-info&quot;&gt;
&lt;div class=&quot;bookmark-text&quot;&gt;
&lt;div class=&quot;bookmark-title&quot;&gt;코딩테스트 연습 - 프린터&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 id=&quot;176c9fec-c45f-40b2-aac5-9a23f53aad5a&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;Code&lt;/h3&gt;
&lt;pre id=&quot;47f2d50a-f23b-422a-b041-de2e18a7b144&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;import java.util.*;
class Solution {
    public int solution(int[] priorities, int location) {
        int answer = 0 ;
        PriorityQueue&amp;lt;Integer&amp;gt; queue = new PriorityQueue&amp;lt;&amp;gt;(Collections.reverseOrder());
        for(int i : priorities){
            queue.add(i);
        }


        int count = 0 ;
        while(!queue.isEmpty()){
            for(int i =0 ; i &amp;lt; priorities.length; i++){
                if(priorities[i] == queue.peek()){
                    count++;
                    queue.poll();
                    if(i == location){
                        answer =  count;
                        queue.clear();
                        break;
                    }
                }

            }
        }
        return answer;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;39518d5e-5f07-43fc-ac48-cf07724777a0&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;Explain&lt;/h3&gt;
&lt;figure id=&quot;ccedaf8d-5962-4092-998e-8be84e3eede3&quot; class=&quot;block-color-gray_background callout&quot; style=&quot;white-space: pre-wrap; display: flex;&quot;&gt;
&lt;div style=&quot;font-size: 1.5em;&quot;&gt;&lt;span class=&quot;icon&quot;&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;width: 100%;&quot;&gt;1. 우선순위가 높은 순으로 찾기 위해 우선순위 큐를 사용 2. 우선순위큐에서 priorities 순서대로 같은 것을 찾으면서 우선순위큐 하나씩 지운다 3. 만약 location과 priorities의 순서가 같다면 모두 종료&lt;/div&gt;
&lt;/figure&gt;
&lt;div class=&quot;n2t_comment&quot;&gt;
&lt;p class=&quot;block-color-gray&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/article&gt;</description>
      <category>알고리즘/문제</category>
      <author>chan20</author>
      <guid isPermaLink="true">https://dev-chan2.tistory.com/33</guid>
      <comments>https://dev-chan2.tistory.com/33#entry33comment</comments>
      <pubDate>Sun, 9 Jan 2022 17:05:08 +0900</pubDate>
    </item>
    <item>
      <title>프로그래머스: 스킬트리</title>
      <link>https://dev-chan2.tistory.com/32</link>
      <description>&lt;article id=&quot;f56ad966-63fc-4235-821c-ecc1f0a6d370&quot; class=&quot;page sans Notion_P&quot;&gt;
&lt;div class=&quot;page-body&quot;&gt;
&lt;h3 id=&quot;37945a76-0281-43de-829f-f013a2aad185&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;Link&lt;/h3&gt;
&lt;figure id=&quot;92f9aac9-d3f0-442f-8f7d-fc4da854506b&quot;&gt;&lt;a class=&quot;bookmark source&quot; href=&quot;https://programmers.co.kr/learn/courses/30/lessons/49993&quot;&gt;
&lt;div class=&quot;bookmark-info&quot;&gt;
&lt;div class=&quot;bookmark-text&quot;&gt;
&lt;div class=&quot;bookmark-title&quot;&gt;코딩테스트 연습 - 스킬트리&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 id=&quot;f0c64b61-587c-4109-a8ae-4d7625c0f3d5&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;Code&lt;/h3&gt;
&lt;pre id=&quot;c8a1fb35-9b8b-4cc8-bc22-9e42e215124a&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;class Solution {
   public int solution(String skill, String[] skill_trees) {
        int answer = 0;
        Skilldata[] skillPrev = new Skilldata[skill_trees.length];
        for(int i =0 ; i &amp;lt; skillPrev.length ; i++){
            skillPrev[i] = new Skilldata();
        }


        for(int i = 0 ; i&amp;lt;skill.length() ; i++){
            for(int j =0 ; j&amp;lt; skill_trees.length; j++){
                for(int k = 0 ; k&amp;lt; skill_trees[j].length();k++){
                    if(skill_trees[j].charAt(k) == skill.charAt(i)){
                        if(i == 0 ){
                            skillPrev[j].skill =  skill.charAt(i);
                            skillPrev[j].date = k;
                        }
                        else{
                             if(skill.charAt(i-1)==skillPrev[j].skill &amp;amp;&amp;amp; skillPrev[j].date &amp;lt;k){
                                skillPrev[j].skill =  skill.charAt(i);
                                skillPrev[j].date = k;
                            }
                            else{
                                skillPrev[j].bool = true;
                            }
                        }

                    }
                }
            }
        }
        for(int i = 0 ; i&amp;lt; skillPrev.length; i++){
             if(!skillPrev[i].bool){
                answer++;
            }
        }
        return answer;
    }
}

class Skilldata{
    char skill;
    int date;
    boolean bool;
    
}&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;c0bb27f0-ae21-4ef4-b1fe-bb0ffa205648&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;db5a01c8-303d-40d4-aff6-d7396ef9e752&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;Explain&lt;/h3&gt;
&lt;/div&gt;
&lt;/article&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Class를 생성하여 배운 스킬을 순서대로 입력할 skill 그것의 위치 date 정상적인 스킬을 찍었는지 확인하는 bool을 Class를 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Skill_trees들은 각각 Skilldata Class로 판단해야기 때문에 Skill_trees크기만큼 선언&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 첫 스킬은 누구나 다 배울 수 있으므로 입력하고 다음 스킬 부터 이전 스킬에 무엇을 선택했는지 파악과 이전 스킬이 이후 스킬보다 나중에 찍었는지 파악하여 거짓이라면 boolean으로 분별&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. boolean으로 참인 데이터만 count&lt;/p&gt;</description>
      <category>알고리즘/문제</category>
      <author>chan20</author>
      <guid isPermaLink="true">https://dev-chan2.tistory.com/32</guid>
      <comments>https://dev-chan2.tistory.com/32#entry32comment</comments>
      <pubDate>Sun, 9 Jan 2022 17:05:03 +0900</pubDate>
    </item>
    <item>
      <title>프로그래머스 : 메뉴 리뉴얼 (2021 KAKAO BLIND RECRUITMENT)</title>
      <link>https://dev-chan2.tistory.com/31</link>
      <description>&lt;article id=&quot;00cce9cf-626b-4da3-b655-b3d3661c75d4&quot; class=&quot;page sans Notion_P&quot;&gt;
&lt;div class=&quot;page-body&quot;&gt;
&lt;h3 id=&quot;4d3c9623-a8ba-45f8-9391-ddb4e9e706fd&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;Link&lt;/h3&gt;
&lt;figure id=&quot;77e26297-6522-49fa-8f99-5d05e8d24588&quot;&gt;&lt;a class=&quot;bookmark source&quot; href=&quot;https://programmers.co.kr/learn/courses/30/lessons/72411&quot;&gt;
&lt;div class=&quot;bookmark-info&quot;&gt;
&lt;div class=&quot;bookmark-text&quot;&gt;
&lt;div class=&quot;bookmark-title&quot;&gt;코딩테스트 연습 - 메뉴 리뉴얼&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 id=&quot;b99502c0-a1e3-493a-ba40-0c1942e60e85&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;Code&lt;/h3&gt;
&lt;pre id=&quot;82e20d1e-89cd-43b5-a3b3-a632a72dec26&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;import java.util.*;
class Solution {
     public String[] solution(String[] orders, int[] course) {
        String[] answer = {};
        HashMap&amp;lt;String, Integer&amp;gt; map = new HashMap&amp;lt;&amp;gt;();

        for(int i = 0 ; i &amp;lt; orders.length; i++){
            HashSet&amp;lt;String&amp;gt; set = new HashSet&amp;lt;&amp;gt;();
            char[] charArr = orders[i].toCharArray();
            Arrays.sort(charArr);
            String result = new String(charArr);
            solve(set, course, result);
            for(String s : set){

                if(map.get(s)==null){
                    map.put(s,1);
                }
                else{
                    map.put(s,map.get(s)+1);
                }
            }
        }
        HashMap&amp;lt;Integer, String&amp;gt; map2 = new HashMap&amp;lt;&amp;gt;();
        HashMap&amp;lt;Integer, Integer&amp;gt; map3 = new HashMap&amp;lt;&amp;gt;();
        for(String s : map.keySet()){
               for(int i : course){

                   if(i == s.length() &amp;amp;&amp;amp; map.get(s) != 1){

                       System.out.println(&quot;map: &quot; + s +&quot;- &quot;+ map.get(s) + &quot; map2: &quot; + map2.get(i) + &quot; map3: &quot; + map3.get(i)  );
                       if(map2.get(i)== null){
                           map2.put(i , s);
                           map3.put(i , map.get(s));
                       }else{
                           if(map3.get(i) &amp;gt; map.get(s)){
                           }else if(map3.get(i) == map.get(s)){
                               map2.put(i, map2.get(i) +&quot;-&quot;+s);
                           }else{
                               map2.put(i , s);
                               map3.put(i , map.get(s));
                           }
                       }
                   }
               }
        }
        ArrayList&amp;lt;String&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();
        for(int i : map2.keySet()){
            String[] s = map2.get(i).split(&quot;-&quot;);
            for(int j = 0 ; j &amp;lt; s.length ; j++){
                if(map3.get(i)!=1) {
                    list.add(s[j]);
                }
            }
        }
        answer = new String[list.size()];
        for(int i = 0 ; i &amp;lt; answer.length ; i ++){
            answer[i] = list.get(i);
        }

        Arrays.sort(answer);
        return answer;
    }
    public void solve(HashSet&amp;lt;String&amp;gt; set, int[] course, String data){

        if(data.length() == 1){
            return;
        }

        for(int j : course){
            if(j == data.length()){
                set.add(data);
            }
        }
        for(int i = 0 ; i &amp;lt;data.length(); i++){
            String data2 = data.substring(0, i) + data.substring(i+1);
            solve(set, course, data2);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;7f9c9dd4-9c7b-44bf-ad1b-e71489eb9414&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;Explain&lt;/h3&gt;
&lt;ol id=&quot;1823ea17-10d6-479f-9da5-711b792fe271&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: disc;&quot; start=&quot;1&quot; type=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;윗 그림과 같이 메뉴의 조합을 DFS로 모든 경우의 수를 구하여 중복된 값이 있을 수도 있으니 HashSet에 저장함 (course에 있는 길이만)&lt;/li&gt;
&lt;/ol&gt;
&lt;ol id=&quot;2a79050a-a438-4513-851d-bc8b4778cfe5&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: disc;&quot; start=&quot;2&quot; type=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HashSet에 있는 값을 Map에 Key : 음식 조합 Value : 몇번을 택했는지? orders에 있는 값들을 전부 정리한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol id=&quot;f670b0e5-7464-4e41-b7ae-2bf30088defe&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: disc;&quot; start=&quot;4&quot; type=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다 끝난 후 메뉴 갯수 마다 최대 단골 메뉴를 선정해야하기 때문에 Key: 메뉴 갯수 value: 메뉴 이름과 Key: 메뉴 갯수 value: 메뉴 선택한 갯수를 선언하여 하나씩 처리해주고 만약 같은 선택한 갯수가 있을 경우 String에 &quot;,&quot;을 붙쳐서 추가로 추가한다&lt;/li&gt;
&lt;li&gt;끝난 후 answer에 하나씩 삽입하여 이름 순서대로 출력하기 때문에 정렬사용&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;n2t_comment&quot;&gt;
&lt;p class=&quot;block-color-gray&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/article&gt;</description>
      <category>알고리즘/문제</category>
      <author>chan20</author>
      <guid isPermaLink="true">https://dev-chan2.tistory.com/31</guid>
      <comments>https://dev-chan2.tistory.com/31#entry31comment</comments>
      <pubDate>Sun, 9 Jan 2022 17:04:59 +0900</pubDate>
    </item>
    <item>
      <title>프로그래머스 : 다리를 지나는 트럭</title>
      <link>https://dev-chan2.tistory.com/30</link>
      <description>&lt;article id=&quot;ccd33315-9565-4897-bf87-821c2bdce286&quot; class=&quot;page sans Notion_P&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-size: 1.44em; letter-spacing: -1px; font-family: -apple-system, BlinkMacSystemFont, AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Link&lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;page-body&quot;&gt;
&lt;figure id=&quot;9f1a140d-c825-4b67-af10-d751e11a91b8&quot;&gt;
&lt;div class=&quot;bookmark-info&quot;&gt;
&lt;div class=&quot;bookmark-text&quot;&gt;
&lt;div class=&quot;bookmark-title&quot;&gt;&lt;a class=&quot;bookmark source&quot; href=&quot;https://programmers.co.kr/learn/courses/30/lessons/42583&quot;&gt;코딩테스트 연습 - 다리를 지나는 트럭&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/figure&gt;
&lt;h3 id=&quot;d9f04fed-b838-46f1-82d6-afb21de87e0e&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;Code&lt;/h3&gt;
&lt;pre id=&quot;1fa8c70c-3d25-431f-87e1-9a4101af97db&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;import java.util.*;
class Solution {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        int answer = 0;
        HashMap&amp;lt;Integer, Integer&amp;gt; map = new HashMap&amp;lt;&amp;gt;();
        Queue&amp;lt;Integer&amp;gt; queue = new LinkedList&amp;lt;&amp;gt;();
        Queue&amp;lt;Integer&amp;gt; queue2 = new LinkedList&amp;lt;&amp;gt;();
        for (int i = 0; i &amp;lt; truck_weights.length; i++) {
            map.put(i,0);
            queue.add(truck_weights[i]);
            queue2.add(truck_weights[i]);
        }
        int current = 0 ;
        int prev = 0 ;

        while(!queue2.isEmpty()){
            answer ++ ;
            int Q = 0 ;
            int W = 0 ;
            if(queue.isEmpty()){

            }

            else if(weight- queue.peek() &amp;gt;= 0 ){
                if(W!=1) {
                    current++;
                    weight = weight - queue.poll();
                    Q++;
                }else{
                    W=0;
                }
            }
            for(int i =prev ; i &amp;lt;current; i++){
                if(map.get(i) &amp;lt; bridge_length){
                    map.put(i, map.get(i)+1);
                }
                else if(map.get(i) == bridge_length){
                    map.put(i, map.get(i)+1);
                    weight = weight + queue2.poll();
                    prev ++;
                    if(queue.isEmpty()){

                    }
                    else if(weight- queue.peek() &amp;gt;= 0 ){
                        if(Q!=1) {
                            current++;
                            weight = weight - queue.poll();
                            W++;
                        }{
                            Q=0;
                        }
                    }
                }
            }
        }
        return answer;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;dc98a6d1-b9ba-48a3-b9c9-41d2e5de468a&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;7715e63c-3db3-496b-9558-69ce75b378d4&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;Explain&lt;/h3&gt;
&lt;/div&gt;
&lt;/article&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 트럭이 지났는지 안지났는지 확인하기위해 안지나간 트럭 Queue, 지나간 트럭 Queue 생성하고 다리에 있을때는 map에 넣는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. map에 들어왔을 때는 안지나간 트럭에서 무게만큼 더함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. map에서는 다리에서 1씩 증가하고 길이가 되었을 시 map에 나갈때는 무게만큼 뺌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. answer은 행동이 시작할 때 부터 1씩 증가&lt;/p&gt;</description>
      <category>알고리즘/문제</category>
      <author>chan20</author>
      <guid isPermaLink="true">https://dev-chan2.tistory.com/30</guid>
      <comments>https://dev-chan2.tistory.com/30#entry30comment</comments>
      <pubDate>Sun, 9 Jan 2022 17:04:55 +0900</pubDate>
    </item>
    <item>
      <title>투포인터 (Two-Pointer)</title>
      <link>https://dev-chan2.tistory.com/28</link>
      <description>&lt;article id=&quot;c24198e7-875a-4e67-b7dd-edaf7906be86&quot; class=&quot;page sans Notion_P&quot;&gt;
&lt;div class=&quot;page-body&quot;&gt;
&lt;p id=&quot;b6ef5f51-96e2-498f-ad0e-e1144e2017ef&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;리스트에 순차적으로 접근해야 할 때&amp;nbsp;&lt;b&gt;두 개의 점의 위치를 기록하면서 처리&lt;/b&gt;하는 알고리즘&lt;/p&gt;
&lt;p id=&quot;58a87d18-ca4e-4399-98f8-4a9cb7359953&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;Two Pointers&lt;/code&gt;&amp;nbsp;알고리즘의 시간복잡도는&amp;nbsp;&lt;code&gt;O(n)&lt;/code&gt;&lt;/p&gt;
&lt;p id=&quot;8af21635-7b48-4386-8c0c-a3e783ceb857&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;cb49749b-6fc2-4dc8-92a2-2cc94f0ffd54&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;start, end라는 두 개의 포인터를 사용합니다.&lt;/p&gt;
&lt;p id=&quot;1d746ea0-a718-4d68-a7fa-18aa0c7fc42b&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;start는 부분배열의 앞 쪽을 가르키는 인덱스, end는 부분배열의 뒤 쪽을 가르키는 인덱스입니다.&lt;/p&gt;
&lt;p id=&quot;ccbe6eaf-36e2-426e-8db3-58c9418bdab6&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;맨 처음에 두 포인터는 0에서 시작하며 항상 start&amp;lt;=end를 만족해야합니다.&lt;/p&gt;
&lt;p id=&quot;f70a0132-406f-4ec4-96de-9ce0674aeb26&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 매 순간마다 부분합 배열의 합과 구해야하는 값을 비교하여 포인터를 이동하게 됩니다.&lt;/p&gt;
&lt;ul id=&quot;8a305cf5-1e47-408e-98a1-7172ded462ac&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;부분합 배열의 합 &amp;lt; 구해야하는 값end를 오른쪽으로 한 칸 이동하여 부분합 배열의 크기를 증가시킵니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;0d778c3a-98b9-4308-8791-6f32615c63c5&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;부분합 배열의 합 &amp;gt;= 구해야하는 값start를 오른쪽으로 한 칸 이동하여 부분합 배열의 크기를 감소시킵니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;n2t_comment&quot;&gt;
&lt;p class=&quot;block-color-gray&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/article&gt;</description>
      <category>알고리즘/이론</category>
      <category>투 포인터</category>
      <author>chan20</author>
      <guid isPermaLink="true">https://dev-chan2.tistory.com/28</guid>
      <comments>https://dev-chan2.tistory.com/28#entry28comment</comments>
      <pubDate>Sun, 9 Jan 2022 16:55:05 +0900</pubDate>
    </item>
    <item>
      <title>문자열 총 정리</title>
      <link>https://dev-chan2.tistory.com/27</link>
      <description>&lt;article id=&quot;254c2238-8149-42ca-97e1-ebe021d4b0a6&quot; class=&quot;page sans Notion_P&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;page-body&quot;&gt;
&lt;h2 id=&quot;aa84e89d-ca11-413b-bc39-cca5512a9cab&quot; class=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;문자찾기&lt;/h2&gt;
&lt;h3 id=&quot;7e3bb213-bf76-43b4-a95e-115ebf97be3f&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;indexOf&lt;/h3&gt;
&lt;p id=&quot;384bbc88-a0d1-47d7-a8d3-1822f0839c95&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;indexOf()&lt;/b&gt;&amp;nbsp;는&amp;nbsp;&lt;b&gt;특정 문자&lt;/b&gt;나&amp;nbsp;&lt;b&gt;문자열&lt;/b&gt;이&amp;nbsp;&lt;span style=&quot;border-bottom: 0.05em solid;&quot;&gt;&lt;b&gt;앞에서&lt;/b&gt;&lt;/span&gt;&lt;b&gt;부터&amp;nbsp;&lt;/b&gt;&lt;span style=&quot;border-bottom: 0.05em solid;&quot;&gt;&lt;b&gt;처음 발견&lt;/b&gt;&lt;/span&gt;&lt;b&gt;되는 인덱스를 반환&lt;/b&gt;하며&lt;/p&gt;
&lt;p id=&quot;09359bd0-e64a-4a4e-afd0-8985f9741d9a&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;만약&amp;nbsp;&lt;b&gt;찾지 못했을 경우&lt;/b&gt;&amp;nbsp;&lt;b&gt;&quot;-1&quot;을 반환&lt;/b&gt;합니다.&lt;/p&gt;
&lt;p id=&quot;3207547f-24cf-440b-9c1d-d354fb59d7e7&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;25a7319b-75d3-46de-abee-57f6d17c872b&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;indexOf(String str)&lt;/p&gt;
&lt;p id=&quot;c3a30bd4-9208-4025-9bb6-3b5ee9c438ca&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;indexOf(char ch)&lt;/p&gt;
&lt;p id=&quot;3564ce2f-c728-40d4-a9dc-b33af204b2d3&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;indexOf(char ch, int fromIndex)&lt;/p&gt;
&lt;p id=&quot;b94893e7-9bd7-4604-b351-6f4b9b02c2f4&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;indexOf(String str, int fromIndex)&lt;/p&gt;
&lt;p id=&quot;57d137a4-dddc-4966-ada6-70b6aacca388&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt; 역순으로 할 때는 lastIndexOf()로 똑같이 하면된다.&lt;/p&gt;
&lt;p id=&quot;9d0bc095-3aa3-450a-a254-e40c01fff3af&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;ce4c3ac9-98de-4df9-9b64-ef59e9313cf3&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;매개변수에 str 값을 넣어주면 해당 문자의 위치를 알려준다.&lt;/p&gt;
&lt;p id=&quot;021c2808-fd0f-40ba-aca0-5fd3dfb5ca26&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;두번 째 매개변수 fromIndex에 넣으면 해당 위치부터 str을 찾아준다.&lt;/p&gt;
&lt;h3 id=&quot;76626969-2f9b-43a9-b628-b3ea4d8fea44&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;contains&lt;/h3&gt;
&lt;p id=&quot;4e11e992-8550-4d05-ace9-a8265bcf6116&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;문자열을 검색할 때 효율 적이며 만약 문자열이 있을 경우 true 없을경우 false를 출력&lt;/p&gt;
&lt;p id=&quot;e771fb19-9f7f-4e39-9a2a-20b9f0f6f715&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;ex)&lt;/p&gt;
&lt;pre id=&quot;8cb8a5c2-9467-41fb-85bf-6f707ec9098f&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;String value = &quot;abcdef&quot;
System.out.println(value.contains(&quot;abc&quot;)) // true
System.out.println(value.contains(&quot;abcf&quot;)) // false&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;2a546532-221a-48f9-bcee-cecc504dedce&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;matches&lt;/h3&gt;
&lt;p id=&quot;4d79517a-170b-4045-a961-8a0baf283d47&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;정규식을 이용하여 문자열을 찾아 주는 메서드 영문자 표현식이 대상 문자열에 포함되어 있는지 아닌지에 따라서 true false를 출력&lt;/p&gt;
&lt;p id=&quot;b0b701f4-5287-4832-bf68-6db320687c79&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;7210d736-76ad-403e-b899-365f0c0e6223&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;f4a76427-e982-402e-92db-7624625f699e&quot; class=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;대소문자 변환&lt;/h2&gt;
&lt;p id=&quot;516bef4a-a998-4274-8904-ca722c02852f&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;내장 라이브러리를 이용 할 때&lt;/b&gt;&lt;/p&gt;
&lt;p id=&quot;60d79ed5-f94b-4451-b6d6-91dcda513baa&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;toUpperCase( )&amp;nbsp;&amp;nbsp;: 문자열을 모두&amp;nbsp;대문자로 변환해준다.&lt;/p&gt;
&lt;p id=&quot;5f341f4c-3a33-40a5-8cd2-8a2a86941cb0&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;toLowerCase( )&amp;nbsp;&amp;nbsp;: 문자열을 모두&amp;nbsp;소문자로 변환해준다.&lt;/p&gt;
&lt;p id=&quot;88b368d7-2abd-4380-ad6f-d2e0e8bfb919&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;715ecaf2-179f-475e-8c63-163c37c80d09&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;내장 라이브러리를 이용 하지 않을 때&lt;/b&gt;&lt;/p&gt;
&lt;p id=&quot;9051519f-00f2-44e2-963c-b81ca9578980&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;문자열을 문자 하나하나 마다 아스키코드 차이 값 32 를 빼주거나 더해줘서&lt;/p&gt;
&lt;p id=&quot;c849bf0e-c241-4bbe-81f8-a864554163f2&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;조건에 따라 소문자, 대문자 변환이 가능하다.&lt;/p&gt;
&lt;p id=&quot;63579225-fdaa-403f-bebf-be96ee530f3d&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;ec1f87e9-86ba-4c40-953c-91d91e6b8b4f&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;대소문자 무시하고 비교&lt;/h3&gt;
&lt;p id=&quot;e284c188-c326-477f-96e2-b44537d8f418&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;equalsIgnoreCase를 이용하면 대소문자 상관없이 비교한다.&lt;/p&gt;
&lt;p id=&quot;58c147c6-9e9e-4296-b497-4566fdc73f50&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;95c4b7aa-2fb6-48fa-9fd0-d022c133f781&quot; class=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;단어 뒤집기&lt;/h2&gt;
&lt;pre id=&quot;1ba8c3ad-a474-4647-8acd-a1f301504180&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;public static void main(String[] args) 
{ 
		String str = &quot;abcde&quot;; // reverse 
		StringBuffer sb = new StringBuffer(str); 
		String reversedStr = sb.reverse().toString(); 
		System.out.println(reversedStr); // edcba 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;a73ccc74-bdb8-4b0c-a1c6-7e28349469c9&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;주로 StringBuffer를 이용하여 reverse로 뒤집어준다.&lt;/p&gt;
&lt;pre id=&quot;2d59cb4a-31d4-4bf6-ba8b-20d5e1d37127&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;public class String_Reverse_Practice 
{
 public static void main(String[] args) 
	{ 
		String str = &quot;abcde&quot;; 
		char[] arr = str.toCharArray(); // String -&amp;gt; char[] 
		char[] reversedArr = new char[arr.length]; 
		for(int i=0; i&amp;lt;arr.length; i++){ 
			reversedArr[arr.length-1-i] = arr[i]; 
		} 
		String reversedStr = new String(reversedArr); 
		System.out.println(reversedStr); // edcba 
	} 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;77701816-784b-49c0-a20a-4aa80fe19b28&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;순수하게 char 로 변경하여 역순으로 변경시켜주는 방법이다.&lt;/p&gt;
&lt;p id=&quot;aac77d4c-8683-4f43-9515-0f2bb4773f1d&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;ec321763-11dd-47d5-9a81-c1753785a9fe&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;마지막 방법은 List&amp;lt;Character&amp;gt;를 사용하여 reverse 메서드를 이용한다.&lt;/p&gt;
&lt;p id=&quot;3484cfd8-c74a-47ac-8ece-9eba364e07ff&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;해당 방법보다는 StringBuilder 방법이 효율적인 것같다.&lt;/p&gt;
&lt;/div&gt;
&lt;/article&gt;</description>
      <category>알고리즘/이론</category>
      <category>Java</category>
      <category>문자열</category>
      <author>chan20</author>
      <guid isPermaLink="true">https://dev-chan2.tistory.com/27</guid>
      <comments>https://dev-chan2.tistory.com/27#entry27comment</comments>
      <pubDate>Sun, 9 Jan 2022 16:55:01 +0900</pubDate>
    </item>
    <item>
      <title>동적 계획법(Dynamic Programming)</title>
      <link>https://dev-chan2.tistory.com/26</link>
      <description>&lt;article id=&quot;d60a18cb-7b10-494e-8eb5-93d646203967&quot; class=&quot;page sans Notion_P&quot;&gt;
&lt;div class=&quot;page-body&quot;&gt;
&lt;ul id=&quot;b9539d54-d452-46e0-bb67-a441b9218611&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;큰 문제를 작은 문제로 나누어서 푸는 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;9b3487db-062b-48b1-a5e3-90854de1008f&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;처음 주어진 문제를 더 작은 문제들로 나눈 뒤 각 조각의 답을 계산&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;8708cead-e8ed-4899-b28a-a049c0f1a2a7&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;답들로 부터 원래 문제에 대한 답을 계산해 낸다는 점에서 분할 정복(Divide &amp;amp; Conquer, D&amp;amp;C)과 비슷
&lt;ul id=&quot;c3c33e32-d15e-421c-b1a3-e03592510ff9&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: circle;&quot;&gt;가장 큰 차이점은 동적 계획법에서는 쪼개진 작은 문제가 중복되지만, 분할 정복은 절대로 중복될수가 없다는 점이다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;bfb0de85-6372-473b-a768-77cb23071a45&quot; class=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;조건&lt;/h2&gt;
&lt;ul id=&quot;adf678dd-0898-48e5-b6fc-bd91eaf09ae8&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;두 가지 속성을 만족해야 동적 계획법으로 문제를 풀 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol id=&quot;fb4052d8-08fd-41b5-b2ad-2d895de8d3fa&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: disc;&quot; start=&quot;1&quot; type=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Overlapping Subproblem&lt;/b&gt;&amp;nbsp;: 겹치는 부분(작은) 문제&lt;/li&gt;
&lt;/ol&gt;
&lt;ol id=&quot;b4bef207-c84f-4772-81ad-8a5c853c7327&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: disc;&quot; start=&quot;2&quot; type=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Optimal Substructure&lt;/b&gt;&amp;nbsp;: 최적 부분구조&lt;/li&gt;
&lt;/ol&gt;
&lt;p id=&quot;a2e2390f-b3cc-4093-827c-e90005b75f00&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;597f7001-4161-4567-b57f-963fdc6a84be&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;겹치는 부분 문제&lt;/h3&gt;
&lt;p id=&quot;07078069-cc0a-4f93-a8d7-8767b3cc0cd4&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;어떤 문제가 여러개의 부분문제(subproblem)으로 쪼개질 수 있을때 사용하는 용어이다. 이때 '부분 문제'란, 항상 새로운 부분 문제를 생성해내기 보다는 계속해서 같은 부분 문제가 여러번 재사용되거나 재귀 알고리즘을 통해 해결되는 문제를 가리킨다.&lt;/p&gt;
&lt;p id=&quot;1a06f3df-c56a-4816-86bd-bcca28d561cd&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;5a879031-2adf-46d0-acb0-b034ef3d7e27&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;최적 부분구조&lt;/b&gt;&lt;/h3&gt;
&lt;p id=&quot;709db0c5-346e-4327-9774-8e0a13f74de1&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;어떤 문제의 최적의 해결책이 그 부분 문제의 최적의 해결책으로 부터 설계될 수 있는 경우를 말한다. 즉, 최적 부분구조 일때&amp;nbsp;&lt;b&gt;문제의 정답을 작은 문제의 정답에서 부터 구할 수 있다.&lt;/b&gt;&amp;nbsp;이 속성은 동적 계획법이나 그리디 알고리즘의 유용성을 판별하는데 사용되기도 한다.&lt;/p&gt;
&lt;p id=&quot;3de3ddeb-9951-43bb-a797-0742054ebebb&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;42438c3b-f1cd-457a-b8b1-fb5abef38d45&quot; class=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;메모이제이션(Memoization)&lt;/h2&gt;
&lt;p id=&quot;07b05e0f-9225-4b90-b147-1e1057725fc8&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;동적 계획법에서 각 문제는&amp;nbsp;&lt;b&gt;한 번만&lt;/b&gt;&amp;nbsp;풀어야 한다. 중복되는 부분 문제를 여러번 풀지 않는다는 뜻이다. Optimal Substructure를 만족하기 때문에 같은 문제는 구할 때마다 정답이 같다. 따라서 정답을 한 번 구했으면 그 정답을 캐시에 메모해놓는다. 이렇게 메모하는 것을 코드의 구현에서는 배열에 저장하는 것으로 할 수 있다. 이를 메모이제이션(Memoization)이라고 한다.&lt;/p&gt;
&lt;p id=&quot;f03b3be6-a20d-4d98-87b5-1fd4e2bd8c3f&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;09cd280e-154b-4238-9f2a-8961a3aeb36f&quot; class=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;구현 방식&lt;/h2&gt;
&lt;p id=&quot;928d0404-9f76-4664-92f5-f67b4de01429&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;동적 계획법의 구현 방식에는 두 가지 방법이 있다.&lt;/p&gt;
&lt;ol id=&quot;8b261538-30a8-4ac4-82d8-271e137c25f1&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: disc;&quot; start=&quot;1&quot; type=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Top-down&lt;/b&gt;&amp;nbsp;: 큰 문제를 작은 문제로 쪼개면서 푼다.&amp;nbsp;&lt;b&gt;재귀&lt;/b&gt;로 구현&lt;/li&gt;
&lt;/ol&gt;
&lt;ol id=&quot;99780fe2-877a-4697-b9c6-7b8b72d8729e&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: disc;&quot; start=&quot;2&quot; type=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Bottom-up&lt;/b&gt;&amp;nbsp;: 작은 문제부터 차례대로 푼다.&amp;nbsp;&lt;b&gt;반복문&lt;/b&gt;으로 구현&lt;/li&gt;
&lt;/ol&gt;
&lt;p id=&quot;be1d5b2a-684a-4457-9b54-ec6a08ee4c58&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;bd381ff7-137e-47c3-b922-dadecfc03f94&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;Top-down&lt;/h3&gt;
&lt;ul id=&quot;73914049-0da4-415e-83e2-850530b2600b&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;큰 문제를 작은 문제로 나눈다.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;35c43660-8072-41be-be05-c6e4b6433d6f&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;작은 문제를 푼다.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;706a1190-2bc8-4d3c-96b4-5ef1cc53bb35&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;작은 문제를 풀었으니, 이제 큰 문제를 푼다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;140809be-631c-416b-9784-599913970d72&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;8fac0ead-0e9a-4eb6-b8fb-c3e6101d0470&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;Buttom-up&lt;/h3&gt;
&lt;ul id=&quot;bffdc18b-c04c-4e14-b43f-a0aa5220bf46&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;문제를 크기가 작은 문제부터 차례대로 푼다.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;83ff51bc-7432-403a-a970-b92e90f127a3&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;문제의 크기를 조금씩 크게 만들면서 문제를 점점 푼다.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;d69973ca-5eb2-4487-acd9-18f6884341c7&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;작은 문제를 풀면서 왔기 때문에, 큰 문제는 항상 풀 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;d0bc56f9-b4b0-42f6-a5c5-69db8e43c26a&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;반복하다 보면 가장 큰 문제를 풀 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;n2t_comment&quot;&gt;
&lt;p class=&quot;block-color-gray&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/article&gt;</description>
      <category>알고리즘/이론</category>
      <category>dp</category>
      <category>동적 계획법</category>
      <author>chan20</author>
      <guid isPermaLink="true">https://dev-chan2.tistory.com/26</guid>
      <comments>https://dev-chan2.tistory.com/26#entry26comment</comments>
      <pubDate>Sun, 9 Jan 2022 16:54:57 +0900</pubDate>
    </item>
    <item>
      <title>greedy (탐욕)</title>
      <link>https://dev-chan2.tistory.com/25</link>
      <description>&lt;article id=&quot;4571a331-6137-4536-961c-13255e880b3b&quot; class=&quot;page sans Notion_P&quot;&gt;
&lt;div class=&quot;page-body&quot;&gt;
&lt;p id=&quot;84b351dd-6d04-462e-a3da-41670db6fcd8&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;border-bottom: 0.05em solid;&quot;&gt;&lt;i&gt;&quot;가장 맨 앞에 보이는 최적의 상황을 쫓는 알고리즘&quot;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;3d879e07-d748-495a-92a8-68d718a729fe&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;border-bottom: 0.05em solid;&quot;&gt;&lt;i&gt;&quot;근사치 추정&quot;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;10000838-f6f3-4f13-8ab5-09a575ae95db&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;e9fc9dde-cdb7-44a9-97a0-bd12f739aa64&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;단순한 형태의 알고리즘&lt;/p&gt;
&lt;p id=&quot;8d028b42-f177-402d-9ca4-c3dc2f30dc6a&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;여러 경우 중 하나를 결정해야 할 때마다&amp;nbsp;그 순간에&amp;nbsp;최적이라고 생각되는 것을 선택해 나가는 방식&lt;/p&gt;
&lt;p id=&quot;11f74a3e-0ac3-4a14-851c-9fe871259c80&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;021a6de0-99ee-417c-b2b8-cf1644ddde7e&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;적용 가능한 곳&lt;/h3&gt;
&lt;p id=&quot;d42c1b94-1dba-49aa-b716-c2a6ea09d78a&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol id=&quot;bf1aa355-ec00-4a75-92d8-de9c791be254&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: disc;&quot; start=&quot;1&quot; type=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;크루스칼 알고리즘
&lt;ul id=&quot;46112db4-b974-4bf9-b914-db4aef8d987a&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;그래프의 모든 간선 중에 가중치가 가장 작은 것 부터 차례대로 선택 (사이클이 만들어지면 안됨)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol id=&quot;4be1d156-ebc9-47f9-9739-c355d3681b41&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: disc;&quot; start=&quot;2&quot; type=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프림 알고리즘
&lt;ul id=&quot;9f41ced1-bdd3-4d85-a127-11e1bc8da382&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;임의의 정점에서 가중치가 가장 작은 간선을 선택 (가중치가 작은 것들을 선택, Cycle X)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol id=&quot;2e273aeb-11ca-4950-8f03-c5dbf99fb426&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: disc;&quot; start=&quot;3&quot; type=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이크스트라 알고리즘
&lt;ul id=&quot;53b29df6-f6a3-48d2-9f3c-b7eaf7ec2832&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;가중치가 있는 방향그래프에서 임의의 두 노드 사이의 최단거리를 구하는 알고리즘&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p id=&quot;3891a4c8-d2ec-4604-8331-e91a63097cb5&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;d983636a-a997-4622-a326-c75d5e1d46e3&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;이외 거스름돈 나눠주기, 일 스케줄링 등 있다.&lt;/p&gt;
&lt;/div&gt;
&lt;/article&gt;</description>
      <category>알고리즘/이론</category>
      <category>GREEDY</category>
      <author>chan20</author>
      <guid isPermaLink="true">https://dev-chan2.tistory.com/25</guid>
      <comments>https://dev-chan2.tistory.com/25#entry25comment</comments>
      <pubDate>Sun, 9 Jan 2022 16:54:46 +0900</pubDate>
    </item>
    <item>
      <title>ref</title>
      <link>https://dev-chan2.tistory.com/24</link>
      <description>&lt;article id=&quot;32da6e4d-7614-4915-9c97-c2e794af35b1&quot; class=&quot;page sans Notion_P&quot;&gt;
&lt;div class=&quot;page-body&quot;&gt;
&lt;p id=&quot;cf08eabc-5e65-4541-9ca4-309ca9cf1e02&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;특정 DOM에 작업을 해야 할 때 ref를 사용하는 것인데 DOM을 꼭 직접적으로 건드려야 할 때 쓰인다. 마치 HTML의 id라고 보면 된다.&lt;/p&gt;
&lt;p id=&quot;05fb251e-6c6a-45a5-ba99-6c7e48e40740&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;c93b57c5-14f6-48b3-8d23-8302ba12af8f&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;ref를 사용하려면 Hooks를 사용해야한다.&lt;/p&gt;
&lt;p id=&quot;c68782d0-ec83-4e60-b416-541c0282bf2b&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;d0477443-9c3b-4726-828c-bb0315c7e1dd&quot; class=&quot;block-color-gray_background callout&quot; style=&quot;white-space: pre-wrap; display: flex;&quot;&gt;
&lt;div style=&quot;font-size: 1.5em;&quot;&gt;&lt;span class=&quot;icon&quot;&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;width: 100%;&quot;&gt;DOM을 꼭 사용해야 하는 상황 : 필요한 기능을 state를 통해서 개발 했지만 해결 할 수 없는 기능들이 있다 이럴 때 접근 해야 하는 것들 1. 특정 input에 포커스 주기 2. 스크롤 박스 조작하기 3. Canvas 요소에 그림 그리기&lt;/div&gt;
&lt;/figure&gt;
&lt;p id=&quot;d5702f0a-bfab-4155-8756-26a2a8774443&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;5459eaf4-707e-405d-98f1-88eb5c31c366&quot; class=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;ref사용&lt;/h2&gt;
&lt;h3 id=&quot;f15c5513-53e2-42ce-a7df-1bc6d09d3be0&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;콜백 함수를 통한 ref 설정&lt;/h3&gt;
&lt;pre id=&quot;4b76e1e1-1f01-4434-962d-12fc7b97d725&quot; class=&quot;code code-wrap pgsql&quot;&gt;&lt;code&gt;&amp;lt;input ref={(ref) =&amp;gt; {this.input=ref}} /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;9a20726a-111e-4394-a86f-038185a67bd6&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게하면 ref의 이름은 원하는 것으로 자유롭게 지정할 수 있다.&lt;/p&gt;
&lt;p id=&quot;703eb2a4-6b73-4392-925a-f5b592fd2157&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;4ff2c986-f904-40f1-90fb-ed35432629d4&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;createRef를 통한 ref 설정&lt;/h3&gt;
&lt;pre id=&quot;e21bf52b-4e85-41b5-be0f-10621901ef0c&quot; class=&quot;code code-wrap scala&quot;&gt;&lt;code&gt;import React, { Component } from 'react';   class RefSample extends Component {   input = React.createRef(); 	handleFocus = () =&amp;gt; {     this.input.current.focus();   }    render() {     return (       &amp;lt;div&amp;gt;         &amp;lt;input ref={this.input} /&amp;gt;       &amp;lt;/div&amp;gt;     );   } }&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;36243057-d2b2-4ca4-9285-398e6ba1ebff&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;16.3 버전 부터 사용 할 수 있으며 createRef를 사용하여 ref를 만들려면 우선 컴포넌트 내부에 멤버 변수로 React.createRef()를 담아 줘야 하며 ref를 달고자 하는 요소에 ref props를 넣어주면 ref 설정이 된다.&lt;/p&gt;
&lt;p id=&quot;0fece2c1-7e16-4cfa-b251-0d4821ec7edd&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;eb98194a-c1b5-4329-b742-ee495cdb5b10&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;컴포넌트 ref&lt;/h3&gt;
&lt;pre id=&quot;fa9b41e7-14a9-4193-8212-dd20148489cf&quot; class=&quot;code code-wrap angelscript&quot;&gt;&lt;code&gt;&amp;lt;MyComponent     ref={(ref) =&amp;gt; {this.myComponent=ref}} /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;61320715-4226-409f-88a4-c33f7ff4a1a4&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;이런 식으로 작성을 하면 내부의 메서드 및 멤버 변수에도 접근할 수 있습니다. 즉, 내부의 ref에도 접근할 수 있습니다&lt;/p&gt;
&lt;p id=&quot;9b4f96c2-ce50-46ad-abde-54ce774a5fe9&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol id=&quot;6472c30d-f665-40ea-ba7f-b74c01084920&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: disc;&quot; start=&quot;1&quot; type=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴포넌트 만들기&lt;/li&gt;
&lt;/ol&gt;
&lt;ol id=&quot;02eda2d5-d4c6-4073-a829-298995f7468f&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: disc;&quot; start=&quot;2&quot; type=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴포넌트에 ref 달기&lt;/li&gt;
&lt;/ol&gt;
&lt;ol id=&quot;bbe3e28f-ab05-45d6-ac33-fea0befdddef&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: disc;&quot; start=&quot;3&quot; type=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ref를 이용하여 컴포넌트 내부 메서드 호출&lt;/li&gt;
&lt;/ol&gt;
&lt;p id=&quot;44c3b299-008e-47bf-a594-8c4a114f2e33&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;4d3c0079-ef38-4fe7-848b-5caba83fdc86&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;n2t_comment&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;block-color-gray&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://boltlessengineer.github.io/Notion2Tistory&quot;&gt;Uploaded by Notion2Tistory v1.1.0&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/article&gt;</description>
      <category>Javascript/react</category>
      <author>chan20</author>
      <guid isPermaLink="true">https://dev-chan2.tistory.com/24</guid>
      <comments>https://dev-chan2.tistory.com/24#entry24comment</comments>
      <pubDate>Sun, 9 Jan 2022 16:19:18 +0900</pubDate>
    </item>
  </channel>
</rss>