<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Mini</title>
    <link>https://mini-96.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 15 Apr 2026 10:35:58 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Mini_96</managingEditor>
    <item>
      <title>[그래프] 프로그래머스 전력망을 둘로 나누기 // 자식수 세기는 dfs, 직접나누지말고 자식수를 계산하라</title>
      <link>https://mini-96.tistory.com/942</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/86971&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/86971&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1755693003899&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;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/86971&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/8YIUw/hyZC8QDbd6/xBimJb7KGOkxikIUXtzaY0/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/Gtl37/hyZzAOwvnt/j05tgN9pmaGC4c41OEXY40/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/86971&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/86971&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/8YIUw/hyZC8QDbd6/xBimJb7KGOkxikIUXtzaY0/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/Gtl37/hyZzAOwvnt/j05tgN9pmaGC4c41OEXY40/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960');&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;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&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;h2 data-ke-size=&quot;size26&quot;&gt;* 풀이1&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접 연결을 1개씩 지운후 탐색하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tip) &lt;u&gt;&lt;b&gt;2차원 행렬그래프&lt;/b&gt;&lt;/u&gt; =&amp;gt; 쉽게 연결정보 삭제가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2차원 인접리스트 =&amp;gt; 삭제,복원 어려움&lt;/p&gt;
&lt;pre id=&quot;code_1755693055414&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 ArrayList&amp;lt;Integer&amp;gt;[] adj = new ArrayList[104];
    static int[][] graph = new int[104][104];
    static boolean[] vis = new boolean[104];
    static int n;
    
    int dfs(int node){
        vis[node]=true;
        
        int ret=1;
        for(int i=1;i&amp;lt;=n;++i){
            if(vis[i]) continue;
            
            if(graph[node][i]==1){
                ret+=dfs(i);
            }
        }
        return ret;
        
    }
    
    public int solution(int N, int[][] wires) {
        int answer = Integer.MAX_VALUE;
        n=N;
        for(int i=0;i&amp;lt;104;++i){
            adj[i]=new ArrayList&amp;lt;&amp;gt;();
        }
        for(var wire : wires){
            int from = wire[0];
            int to  = wire[1];
            adj[from].add(to);
            adj[to].add(from);
            graph[from][to]=1;
            graph[to][from]=1;
        }
        // for(int i=1;i&amp;lt;n;++i){
        //     System.out.println(adj[i]);
        // }
        
        // 연결끊을 index 고르기
        // 연결끊기
        // dfs
        // 원상복구
        for(int i=0;i&amp;lt;wires.length;++i){
            int from = wires[i][0];
            int to = wires[i][1];
            
            graph[from][to]=0;
            graph[to][from]=0;
            
            Arrays.fill(vis,false);
            var v = new ArrayList&amp;lt;Integer&amp;gt;();
            for(int j=1;j&amp;lt;=n;++j){
                if(vis[j]) continue;
                
                v.add(dfs(j));
            }
            
            graph[from][to]=1;
            graph[to][from]=1;
            
            // System.out.println(v.get(0) +&quot; &quot; + v.get(1));
            answer = Math.min(answer,Math.abs(v.get(0)-v.get(1)));
        }
        return answer;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;* 풀이2&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연결을 &lt;u&gt;&lt;b&gt;제거X&lt;/b&gt;&lt;/u&gt;,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;자식수&lt;/b&gt;&lt;/u&gt;를 세고, 그때그떄 분리하면서 정답갱신&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;523&quot; data-origin-height=&quot;711&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beE651/btsPZRr3WpO/bNrUyJGk43uY5QXFZb3gFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beE651/btsPZRr3WpO/bNrUyJGk43uY5QXFZb3gFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beE651/btsPZRr3WpO/bNrUyJGk43uY5QXFZb3gFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeE651%2FbtsPZRr3WpO%2FbNrUyJGk43uY5QXFZb3gFK%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;523&quot; height=&quot;711&quot; data-origin-width=&quot;523&quot; data-origin-height=&quot;711&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;376&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dY0U6w/btsP00V7Ez8/yn5uRFp6qfdeNtPYIrV5X0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dY0U6w/btsP00V7Ez8/yn5uRFp6qfdeNtPYIrV5X0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dY0U6w/btsP00V7Ez8/yn5uRFp6qfdeNtPYIrV5X0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdY0U6w%2FbtsP00V7Ez8%2Fyn5uRFp6qfdeNtPYIrV5X0%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;376&quot; height=&quot;488&quot; data-origin-width=&quot;376&quot; data-origin-height=&quot;488&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리프노드에서 ret 1 되는것부터 해봐야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;return 되기 직전에 그래프를 나누고 정답을 갱신한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(n-child) - child 의 식을 도출해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;* 코드&lt;/h2&gt;
&lt;pre id=&quot;code_1755693858611&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 ArrayList&amp;lt;Integer&amp;gt;[] adj = new ArrayList[104];
    static int[][] graph = new int[104][104];
    static boolean[] vis = new boolean[104];
    static int n;
    static int answer = Integer.MAX_VALUE;
    
    int dfs(int node){
        vis[node]=true;
        
        int child=1; // 자기자신 카운팅
        
        for(var nxt : adj[node]){
            if(vis[nxt]) continue;
            
            child+=dfs(nxt);
        }
        
        answer = Math.min(answer,Math.abs((n-child)-child));
        return child;
    }
    
    public int solution(int N, int[][] wires) {
        
        n=N;
        for(int i=0;i&amp;lt;104;++i){
            adj[i]=new ArrayList&amp;lt;&amp;gt;();
        }
        for(var wire : wires){
            int from = wire[0];
            int to  = wire[1];
            adj[from].add(to);
            adj[to].add(from);
        }

        dfs(1);
        
        return answer;
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/dfs</category>
      <author>Mini_96</author>
      <guid isPermaLink="true">https://mini-96.tistory.com/942</guid>
      <comments>https://mini-96.tistory.com/942#entry942comment</comments>
      <pubDate>Wed, 20 Aug 2025 21:45:33 +0900</pubDate>
    </item>
    <item>
      <title>[bfs] 프로그래머스 경주로 건설 // 비용이 다른 bfs</title>
      <link>https://mini-96.tistory.com/941</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/67259?gad_source=1&amp;amp;gad_campaignid=22215033033&amp;amp;gbraid=0AAAAAC_c4nBlID9vwkMGhM_WoWpCYr7Dp&amp;amp;gclid=Cj0KCQjwwZDFBhCpARIsAB95qO1He7OHX_5_IaiJjSiwxyHw43QNn5aUmvATCKQ3nQd3kQrvFXAkvdcaAtGWEALw_wcB&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/67259?gad_source=1&amp;amp;gad_campaignid=22215033033&amp;amp;gbraid=0AAAAAC_c4nBlID9vwkMGhM_WoWpCYr7Dp&amp;amp;gclid=Cj0KCQjwwZDFBhCpARIsAB95qO1He7OHX_5_IaiJjSiwxyHw43QNn5aUmvATCKQ3nQd3kQrvFXAkvdcaAtGWEALw_wcB&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1755672273825&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;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/67259?gad_source=1&amp;amp;gad_campaignid=22215033033&amp;amp;gbraid=0AAAAAC_c4nBlID9vwkMGhM_WoWpCYr7Dp&amp;amp;gclid=Cj0KCQjwwZDFBhCpARIsAB95qO1He7OHX_5_IaiJjSiwxyHw43QNn5aUmvATCKQ3nQd3kQrvFXAkvdcaAtGWEALw_wcB&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/csVAyL/hyZC9oqwh7/JHV7ripFDTKwc0h2SSdM21/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/Ng9WV/hyZygiuP4g/lzslJMFeUdgDwK6kypKfQ0/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/67259?gad_source=1&amp;amp;gad_campaignid=22215033033&amp;amp;gbraid=0AAAAAC_c4nBlID9vwkMGhM_WoWpCYr7Dp&amp;amp;gclid=Cj0KCQjwwZDFBhCpARIsAB95qO1He7OHX_5_IaiJjSiwxyHw43QNn5aUmvATCKQ3nQd3kQrvFXAkvdcaAtGWEALw_wcB&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/67259?gad_source=1&amp;amp;gad_campaignid=22215033033&amp;amp;gbraid=0AAAAAC_c4nBlID9vwkMGhM_WoWpCYr7Dp&amp;amp;gclid=Cj0KCQjwwZDFBhCpARIsAB95qO1He7OHX_5_IaiJjSiwxyHw43QNn5aUmvATCKQ3nQd3kQrvFXAkvdcaAtGWEALw_wcB&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/csVAyL/hyZC9oqwh7/JHV7ripFDTKwc0h2SSdM21/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/Ng9WV/hyZygiuP4g/lzslJMFeUdgDwK6kypKfQ0/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960');&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;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&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;h2 data-ke-size=&quot;size26&quot;&gt;* 풀이&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;비용이 다른 그래프를 bfs 로 푸는 방법&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vis에 방향정보도 저장해야함, 값 : 그떄의 비용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방문을 안했거나, &lt;u&gt;&lt;b&gt;방문했어도 (저장된비용 보다 계산한) 비용이 더 싸다면 탐색&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목적지에 도달했어도 바로 return X -&amp;gt; 나중도착이 최적일 수있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;* 코드&lt;/h2&gt;
&lt;pre id=&quot;code_1755672284484&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 Info{
        int y,x,cost,dir;
        Info(int y, int x, int cost, int dir){
            this.y=y;
            this.x=x;
            this.cost=cost;
            this.dir=dir;
        }
        
        public String toString(){
            return this.y+&quot; &quot;+this.x+&quot; &quot;+this.cost+&quot; &quot;+this.dir;
        }
    }
    static int[] dy = {1,0,-1,0}; //아래, 오른쪽, 위, 좌
    static int[] dx = {0,1,0,-1};

    
    public int solution(int[][] board) {
        int answer = Integer.MAX_VALUE;
        int n = board.length;
        int[][][] vis = new int[n][n][4]; // 방향정보도 추가해야함! (다른방향이면 다른상태임)
        var q = new ArrayDeque&amp;lt;Info&amp;gt;();
        q.add(new Info(0,0,0,0)); //아래
        q.add(new Info(0,0,0,1)); //오른쪽
        vis[0][0][0]=0;
        vis[0][0][1]=0;
        
        while(q.size()&amp;gt;0){
            var cur = q.poll();
            int y = cur.y;
            int x = cur.x;
            int cost = cur.cost;
            int dir = cur.dir;
            
            // System.out.println(cur);
            
            // 비용이다른 bfs : 바로 리턴하면 안됨!, 나중도착이 최적해일 수 있음.
            if(y==n-1 &amp;amp;&amp;amp; x==n-1){
                answer = Math.min(answer,cost);
                // return cost;
            }
            
            for(int i=0;i&amp;lt;4;++i){
                int ny=y+dy[i];
                int nx=x+dx[i];
                if(ny&amp;lt;0 || ny&amp;gt;=n || nx&amp;lt;0 || nx&amp;gt;=n) continue;
                if(ny==0 &amp;amp;&amp;amp; nx==0) continue; // 시작점
                if(board[ny][nx]==1) continue; // 벽
                if(Math.abs(i-dir)==2) continue; // 반대방향
                
                
                int nextCost=0;
                if(dir != i){
                    nextCost = cost + 600; // 직선도로도 만들어야함 -&amp;gt; 100 + 500
                }
                else{
                    nextCost = cost + 100;
                }
                
                // 이미 방문했어도, 비용이 작다면 재방문 필요!!!
                if(vis[ny][nx][i]==0 || vis[ny][nx][i] &amp;gt; nextCost) {
                    q.add(new Info(ny,nx,nextCost, i));
                    vis[ny][nx][i]=nextCost;
                }
                
                
            }
        }
        
        return answer;
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/bfs</category>
      <author>Mini_96</author>
      <guid isPermaLink="true">https://mini-96.tistory.com/941</guid>
      <comments>https://mini-96.tistory.com/941#entry941comment</comments>
      <pubDate>Wed, 20 Aug 2025 15:50:53 +0900</pubDate>
    </item>
    <item>
      <title>[틀림] 프로그래머스 메뉴리뉴얼 // 자바, 람다, 해시</title>
      <link>https://mini-96.tistory.com/934</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/72411?language=java&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/72411?language=java&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1754586184131&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;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/72411?language=java&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bahWkz/hyZuIFj0e3/wUH3sDExnZmgWIHPm8a99K/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/bfBDLs/hyZux4RpP0/1FtSiqXrVgkWRK76Sa3lhk/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/72411?language=java&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/72411?language=java&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bahWkz/hyZuIFj0e3/wUH3sDExnZmgWIHPm8a99K/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/bfBDLs/hyZux4RpP0/1FtSiqXrVgkWRK76Sa3lhk/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960');&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;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&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;h2 data-ke-size=&quot;size26&quot;&gt;* c++ 풀이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;freq[길이] 별 map이 키포인트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과거에 머리가 더 잘돌아갔네..&lt;/p&gt;
&lt;pre id=&quot;code_1754586199170&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;bits/stdc++.h&amp;gt;

using namespace std;

map&amp;lt;string,int&amp;gt; freq[11];

vector&amp;lt;string&amp;gt; solution(vector&amp;lt;string&amp;gt; orders, vector&amp;lt;int&amp;gt; course) {
    vector&amp;lt;string&amp;gt; answer;
    map&amp;lt;string, int&amp;gt; m; //코스이름, 등장횟수
    
    for(auto order : orders){ //ABCFG
        sort(order.begin(),order.end());
        for(int subset=1;subset&amp;lt;(1&amp;lt;&amp;lt;order.size());++subset){ // A, AB, ABC, ...
            string menu;
            for(int j=0;j&amp;lt;order.size();++j){
                if(subset &amp;amp; (1&amp;lt;&amp;lt;j)) menu+=order[j];
            }
            freq[menu.size()][menu]++;
        }
    }
    
    vector&amp;lt;string&amp;gt; ans;
    for(auto i : course){
        int mxfreq=0;
        for(auto p : freq[i])
            mxfreq=max(mxfreq,p.second);
        if(mxfreq&amp;lt;2) continue;
        for(auto p : freq[i]){
            if(p.second==mxfreq) ans.push_back(p.first);
        }
    }

    sort(ans.begin(),ans.end());
    return ans;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;* 자바풀이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;람다지옥&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;람다연습 // .map을 하면 유사 배열 stream이 되는군&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주문을 정렬해야함에 주의.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;subset &amp;amp; (1&amp;lt;&amp;lt;i) 기억 // 비트켜져있는지 하나씩 검사&lt;/p&gt;
&lt;pre id=&quot;code_1754586252768&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.*;
import java.util.stream.Collectors;

class Solution {
    public String[] solution(String[] orders, int[] course) {
        
        var m1 = new HashMap&amp;lt;String, Integer&amp;gt;(); // &amp;lt;조합, 등장횟수&amp;gt;
        
        for(var order : orders) {
            // 각 주문을 정렬하여 일관성 보장
            char[] chars = order.toCharArray();
            Arrays.sort(chars);
            String sortedOrder = new String(chars);
            
            int n = sortedOrder.length();
            
            // 모든 부분집합 생성 (공집합 제외)
            for(int subset = 1; subset &amp;lt; (1 &amp;lt;&amp;lt; n); subset++) {
                var sb = new StringBuilder();
                
                for(int i = 0; i &amp;lt; n; i++) {
                    if((subset &amp;amp; (1 &amp;lt;&amp;lt; i)) &amp;gt; 0) {
                        sb.append(sortedOrder.charAt(i));
                    }
                }
                
                String combination = sb.toString();
                
                m1.put(combination, m1.getOrDefault(combination, 0) + 1);
                // course 배열에 포함된 길이만 고려 (없어도 통과하긴함)
                // if(Arrays.stream(course).anyMatch(c -&amp;gt; c == combination.length())) {
                //     m1.put(combination, m1.getOrDefault(combination, 0) + 1);
                // }
            }
        }
        
        var answer = new ArrayList&amp;lt;String&amp;gt;();
        
        // 각 코스 길이별로 처리
        for(int courseLength : course) {
            // 해당 길이의 조합들 중 최대 빈도 찾기
            int maxCount = m1.entrySet().stream()
            .filter(e -&amp;gt; e.getKey().length() == courseLength)  // &quot;AB&quot;:3, &quot;BC&quot;:2, &quot;AC&quot;:3
            .filter(e -&amp;gt; e.getValue() &amp;gt;= 2)         // &quot;AB&quot;:3, &quot;BC&quot;:2, &quot;AC&quot;:3 (모두 2 이상)
            .mapToInt(Map.Entry::getValue)          // [3, 2, 3]
            .max()                                  // OptionalInt[3]
            .orElse(0);                            // 3
            
            // 최대 빈도를 가진 모든 조합 추가
            if(maxCount &amp;gt;= 2) {
                m1.entrySet().stream()
                    .filter(e -&amp;gt; e.getKey().length() == courseLength) // &quot;AB&quot;:3, &quot;BC&quot;:2, &quot;AC&quot;:3
                    .filter(e -&amp;gt; e.getValue() == maxCount)           // &quot;AB&quot;:3,&quot;AC&quot;:3 (maxCount=3)
                    .map(Map.Entry::getKey)                          // [&quot;AB&quot;, &quot;AC&quot;]
                    .forEach(answer::add);
            }
        }
        
        Collections.sort(answer);
        return answer.toArray(new String[0]);
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/구현</category>
      <author>Mini_96</author>
      <guid isPermaLink="true">https://mini-96.tistory.com/934</guid>
      <comments>https://mini-96.tistory.com/934#entry934comment</comments>
      <pubDate>Fri, 8 Aug 2025 02:06:53 +0900</pubDate>
    </item>
    <item>
      <title>[틀림] 프로그래머스 베스트 앨범 // 해시맵, 구현, 스트림, 리스트 정렬</title>
      <link>https://mini-96.tistory.com/932</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42579?language=java&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/42579?language=java&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1753809388652&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;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42579?language=java&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ivOYF/hyZrx4xdGD/emchr72rlwX9kHslypfsnK/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/chiLOl/hyZqWDx5Cv/ZZWN39R75KhPZo7sphlVHK/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42579?language=java&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42579?language=java&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ivOYF/hyZrx4xdGD/emchr72rlwX9kHslypfsnK/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/chiLOl/hyZqWDx5Cv/ZZWN39R75KhPZo7sphlVHK/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960');&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;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&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;h2 data-ke-size=&quot;size26&quot;&gt;* 풀이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;m1 &amp;lt;장르, List&amp;lt;재생횟수, index&amp;gt;&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;m2 &amp;lt;장르, 총 재생횟수&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맵 2개를 만든다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;273&quot; data-origin-height=&quot;259&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHQYl2/btsPC4yjZDs/jcokFIUeO6FEAUdsq2Vsek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHQYl2/btsPC4yjZDs/jcokFIUeO6FEAUdsq2Vsek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHQYl2/btsPC4yjZDs/jcokFIUeO6FEAUdsq2Vsek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHQYl2%2FbtsPC4yjZDs%2FjcokFIUeO6FEAUdsq2Vsek%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;273&quot; height=&quot;259&quot; data-origin-width=&quot;273&quot; data-origin-height=&quot;259&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;m2를 정렬하고 그 키값에 대해 정렬된순서로 순회하면서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;m1을 꺼낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;m1을 정렬한다. (재생횟수기준 내림차순)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2개를 뽑고 정답에 추가한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;222&quot; data-origin-height=&quot;259&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLHjNX/btsPBk3rZoS/5okmrdl289PVTZXpOcVdAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLHjNX/btsPBk3rZoS/5okmrdl289PVTZXpOcVdAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLHjNX/btsPBk3rZoS/5okmrdl289PVTZXpOcVdAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLHjNX%2FbtsPBk3rZoS%2F5okmrdl289PVTZXpOcVdAK%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;222&quot; height=&quot;259&quot; data-origin-width=&quot;222&quot; data-origin-height=&quot;259&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;* 전체코드&lt;/h2&gt;
&lt;pre id=&quot;code_1753809418653&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 pair{
    int idx, cnt;
    pair(int idx, int cnt){
        this.idx=idx;
        this.cnt=cnt;
    }
    
    public String toString(){
        return this.idx+&quot; &quot;+this.cnt;
    }
}

class Solution {
    public int[] solution(String[] genres, int[] plays) {
        ArrayList&amp;lt;Integer&amp;gt; ret = new ArrayList&amp;lt;&amp;gt;();
        
        HashMap&amp;lt;String,ArrayList&amp;lt;pair&amp;gt;&amp;gt; m1 = new HashMap&amp;lt;&amp;gt;(); //&amp;lt;장르, 곡정보들(cnt,index&amp;gt;)
        HashMap&amp;lt;String,Integer&amp;gt; m2 = new HashMap&amp;lt;&amp;gt;(); // &amp;lt;장르, 재생횟수&amp;gt;
        
        int n = genres.length;
        for(int i=0;i&amp;lt;n;++i){
            //최초 삽입인경우 초기화, 값 삽입은 아래서 진행!
            if(!m1.containsKey(genres[i])){
                ArrayList&amp;lt;pair&amp;gt; tmp = new ArrayList&amp;lt;&amp;gt;();
                // tmp.add(new pair(plays[i],i));
                m1.put(genres[i],tmp);
                m2.put(genres[i],0);
            }
            var tmp = m1.get(genres[i]);
            tmp.add(new pair(i,plays[i]));
            m1.put(genres[i],tmp);
            m2.put(genres[i],m2.get(genres[i])+plays[i]);
        }
        // System.out.println(m1);
        // System.out.println(m2);
        
        //&amp;lt;장르, 재생횟수를 내림차순 정렬&amp;gt;
        var sortedGen = m2.entrySet().stream()
            .sorted((a,b)-&amp;gt; Integer.compare(b.getValue(), a.getValue()));
        
        // 정렬된 &amp;lt;장르, 재생횟수&amp;gt; 순회하면서
        sortedGen.forEach(e -&amp;gt; {
            // 내부 리스트에서 cnt기준 내림차순정렬, 2개 가져오기
            var sortedSong = m1.get(e.getKey()).stream()
                .sorted((a,b)-&amp;gt;Integer.compare(b.cnt,a.cnt))
                .limit(2);
            // 가져온것의 index를 정답에 추가
            sortedSong.forEach(song -&amp;gt; ret.add(song.idx));
        });
        
        return ret.stream().mapToInt(Integer::intValue).toArray();
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/해시</category>
      <author>Mini_96</author>
      <guid isPermaLink="true">https://mini-96.tistory.com/932</guid>
      <comments>https://mini-96.tistory.com/932#entry932comment</comments>
      <pubDate>Wed, 30 Jul 2025 02:20:11 +0900</pubDate>
    </item>
    <item>
      <title>[스택] 프로그래머스 크레인 인형뽑기 // 배열을 스택으로 바꿔라</title>
      <link>https://mini-96.tistory.com/929</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/64061?language=java&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/64061?language=java&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1751781322130&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;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/64061?language=java&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/crbdas/hyZjz8A99v/qirb0INokXNZF4lVHf2l7k/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/coQjI3/hyZf4h8mQl/v6bxvZWuqBSMSyF2ok2de1/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/64061?language=java&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/64061?language=java&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/crbdas/hyZjz8A99v/qirb0INokXNZF4lVHf2l7k/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/coQjI3/hyZf4h8mQl/v6bxvZWuqBSMSyF2ok2de1/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960');&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;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&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;h2 data-ke-size=&quot;size26&quot;&gt;*풀이1&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열을 탐색하면서 0이 아닌원소를 찾고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;stk에 pop하는 방식&lt;/p&gt;
&lt;pre id=&quot;code_1751781349875&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 int[][] board;
    static ArrayDeque&amp;lt;Integer&amp;gt; stk = new ArrayDeque&amp;lt;&amp;gt;();
    static int answer;
    
    void findAndRemove(int move){
        int i=0;
        while(i&amp;lt;board.length &amp;amp;&amp;amp; board[i][move-1]==0){
            // System.out.println(board[i][move-1]);
            i++;
        }
        
        
        if(i==board.length) i--;
        
        
        if(board[i][move-1]!=0){
            
            // System.out.println(board[i][move-1]);
            if(stk.size()&amp;gt;0 &amp;amp;&amp;amp; stk.peek()==board[i][move-1]){
                // System.out.println(board[i][move-1]);
                stk.pop();
                answer+=2;
            }
            else stk.push(board[i][move-1]); //stack에는 offer 금지!
            
            board[i][move-1]=0; //제거표시
        }
    }
    
    public int solution(int[][] _board, int[] moves) {
        board=_board;
        // System.out.println(Arrays.deepToString(board));
        
        for(int move : moves){
            findAndRemove(move);
        }
        // System.out.println(stk);
        return answer;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;* 풀이2&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열을 스택으로 변경하는 방법&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dpUq8r/btsO6AxSZw0/KZpBp8hg82ZoUPMKTEhj41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dpUq8r/btsO6AxSZw0/KZpBp8hg82ZoUPMKTEhj41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dpUq8r/btsO6AxSZw0/KZpBp8hg82ZoUPMKTEhj41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdpUq8r%2FbtsO6AxSZw0%2FKZpBp8hg82ZoUPMKTEhj41%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;498&quot; height=&quot;236&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;236&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1751782438144&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 int[][] board;
    static ArrayDeque&amp;lt;Integer&amp;gt; stk = new ArrayDeque&amp;lt;&amp;gt;();
    static int answer;
    
    
    public int solution(int[][] _board, int[] moves) {
        board=_board;
        // System.out.println(Arrays.deepToString(board));
        
        int n=board.length;
        int m=board[0].length;
        
        ArrayDeque&amp;lt;Integer&amp;gt;[] lanes = new ArrayDeque[m];
        for(int i=0;i&amp;lt;m;++i){
            lanes[i]=new ArrayDeque&amp;lt;&amp;gt;();
        }
        
        for(int j=0;j&amp;lt;m;++j){
            for(int i=n-1;i&amp;gt;=0;--i){
                if(board[i][j]==0) break;
                lanes[j].push(board[i][j]);
            }
        }
        // for(int i=0;i&amp;lt;m;++i){
        //     System.out.println(lanes[i]);
        // }
        
        ArrayDeque&amp;lt;Integer&amp;gt; bucket = new ArrayDeque&amp;lt;&amp;gt;();
        for(int move:moves){
            if(lanes[move-1].isEmpty()) continue;
            int cur = lanes[move-1].pop();
            
            if(bucket.isEmpty()){
                bucket.push(cur);
                continue;
            }
            
            if(bucket.peek()==cur){
                answer+=2;
                bucket.pop();
            }
            else{
                bucket.push(cur);
            }
        }
        
        // System.out.println(bucket);
        
        return answer;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Algorithm/스택</category>
      <author>Mini_96</author>
      <guid isPermaLink="true">https://mini-96.tistory.com/929</guid>
      <comments>https://mini-96.tistory.com/929#entry929comment</comments>
      <pubDate>Sun, 6 Jul 2025 15:15:55 +0900</pubDate>
    </item>
    <item>
      <title>객체지향으로 할인요구사항 구현하기</title>
      <link>https://mini-96.tistory.com/928</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;객체지향으로 할인요구사항 구현하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jpashop에 아이템을 할인할수있게 해달라는 요구사항이 들어왔습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 객체지향을 이용하여 확장에는 열려있고 수정에는 닫혀있는 코드를 구현해 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 메시지를 결정하고, 이를 처리할 객체를 결정합니다. 이때, 메시지를 처리하기 위해 정보를 많이 알고있는 객체를 선택합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;337&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sYnk0/btsON8axzcx/jQncfcZI63uW2wDUkIBnl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sYnk0/btsON8axzcx/jQncfcZI63uW2wDUkIBnl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sYnk0/btsON8axzcx/jQncfcZI63uW2wDUkIBnl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsYnk0%2FbtsON8axzcx%2FjQncfcZI63uW2wDUkIBnl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;887&quot; height=&quot;337&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;337&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;상속을 이용한 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;할인정책 세부 클래스를 구현할때 어떤 방법이 있는지 보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1111&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5yCgK/btsONdpQ4ae/HhOPO1jBOmRi0PiwivWEq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5yCgK/btsONdpQ4ae/HhOPO1jBOmRi0PiwivWEq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5yCgK/btsONdpQ4ae/HhOPO1jBOmRi0PiwivWEq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5yCgK%2FbtsONdpQ4ae%2FHhOPO1jBOmRi0PiwivWEq0%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;1111&quot; height=&quot;326&quot; data-origin-width=&quot;1111&quot; data-origin-height=&quot;326&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점 : 할인정책 변경을 위해, 새로운 Item 인스턴스를 만들고 필요한 정보 복사가 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;상속대신 합성을 사용하라&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1549&quot; data-origin-height=&quot;344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rDlDa/btsOMpEmRDF/0UyzOBKNG0yQemhFHUV2Y0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rDlDa/btsOMpEmRDF/0UyzOBKNG0yQemhFHUV2Y0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rDlDa/btsOMpEmRDF/0UyzOBKNG0yQemhFHUV2Y0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrDlDa%2FbtsOMpEmRDF%2F0UyzOBKNG0yQemhFHUV2Y0%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;1549&quot; height=&quot;344&quot; data-origin-width=&quot;1549&quot; data-origin-height=&quot;344&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점 : 할인정책이 추가 되더라도 새로운 할인정책 클래스를 추가하고,이를 Item 생성시 전달하면 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 Item에 연결된 DiscountPolicy 인스턴스만 바꾸면 되므로, 이 방법을 선택하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;할인정책을 누가 가지고 있을것인가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;order vs item vs orderItem&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;order : 주문 전체에 대해 동일한 할인정책을 적용할때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;item : 아이템 별로 할인정책을 적용할때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;orderItem : 주문상품별로 각각 다른 할인정책을 적용할때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 네이버 페이의 경우 item 별로 할인정책이 적용된것을 볼 수 있음. -&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정보전문가에게 책임을 할당하라. 가격 정보를 알고있는&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;item&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt; 객체를&lt;/span&gt;&lt;/span&gt;&lt;/span&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;460&quot; data-origin-height=&quot;806&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WIfja/btsORZZ3eJm/hpQzPE6vIBnDz4Ny9eK7T1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WIfja/btsORZZ3eJm/hpQzPE6vIBnDz4Ny9eK7T1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WIfja/btsORZZ3eJm/hpQzPE6vIBnDz4Ny9eK7T1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWIfja%2FbtsORZZ3eJm%2FhpQzPE6vIBnDz4Ny9eK7T1%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;460&quot; height=&quot;806&quot; data-origin-width=&quot;460&quot; data-origin-height=&quot;806&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;new는 해롭지만, 가끔은 생성해도 무방하다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Item이 대부분의 경우에 NoneDiscountPolicy와 협력하고, 가끔씩만 AmountDiscountPolicy 또는 PercentDiscountPolicy와 협력하는 경우, 클라이언트에게 생성하는 책임을 모두 넘긴다면, 중복되는 new NoneDiscountPolicy 코드가 많아지게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이럴 때 생성자 체이닝을 이용하면 좋습니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #c3cee3;&quot;&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;protected Item(String name , int price, int stockQuantity, DiscountPolicy discountPolicy) {
    this.name=name;
    this.price=price;
    this.stockQuantity=stockQuantity;
    this.discountPolicy= discountPolicy;
}

protected Item(String name, int price, int stockQuantity) {
    this(name, price, stockQuantity, new NoneDiscountPolicy());
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;할인정책, 할인조건을 어떻게 영속화 할 것인가&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;한테이블 전략 vs Joined 전략&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;기본적으로 Joined&lt;/u&gt;를 선택하고, 조인에 성능상 이슈가 있거나 요구사항이 매우간단한 경우에만 한테이블 전략을 선택하면 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 : 영속화를 위해 interface에서 abstract class로 변경해야 하는 단점이 존재합니다. (jpa가 interface를 지원하지않음)&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #c3cee3;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;@Entity
@Table(name = &quot;discount_policy&quot;)
@Inheritance(strategy = JOINED)
public abstract class DiscountPolicy {

    @OneToMany(
            cascade = CascadeType.ALL,
            orphanRemoval = true
    )
    @JoinColumn(name = &quot;policy_id&quot;, nullable = false)
    private List&amp;lt;DiscountCondition&amp;gt; conditions = new ArrayList&amp;lt;&amp;gt;();&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;양방향 vs 단방향 연관관계&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;기본적으로 단방향&lt;/u&gt; 연관관계로 설정하고, 할인조건에서 할인정책을 참고해야하는 상황이 생기는 경우에만 양방향 연관관계를 추가합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이 설계가 유연하고 재사용 가능 한가? (검증)&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;할인혜택을 제공하지 않아도 된다는 요구사항 추가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 문제가 있었던 구현방식을 먼저 보겠습니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #c3cee3;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;class Item{
...

    public Money calculateItemFee() {
        if(discountpolicy==null) return price;
        return Money.of(price).minus(discountPolicy.calculateDiscountAmount(this));
    }&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드의 문제점은 할인정책의 변경으로 인해 Item 클래스를 수정해야 한다는 점입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 버그의 발생 가능성을 높이게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결하는 방법은 &lt;u&gt;할인정책이 없다는 사실을 할인정책으로 추가&lt;/u&gt;하는 것입니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #c3cee3;&quot;&gt;
&lt;pre class=&quot;scala&quot;&gt;&lt;code&gt;@Entity
@DiscriminatorValue(&quot;NONE&quot;)
public class NoneDiscountPolicy extends DiscountPolicy {
    @Override
    protected Money getDiscountAmount(Item item) {
        return Money.ZERO;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스를 단1개만 추가 하였습니다. OCP 원칙을 준수하는 설계라고 할수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;중복할인 정책 요구사항 추가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아이템 1개에 대해 비율할인, 정률할인을 모두 할 수 있어야 한다는 요구사항이 추가되었습니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #c3cee3;&quot;&gt;
&lt;pre class=&quot;scala&quot;&gt;&lt;code&gt;public class OverlappedDiscountPolicy extends DiscountPolicy {

    private List&amp;lt;DiscountPolicy&amp;gt; discountPolicies = new ArrayList&amp;lt;&amp;gt;();

    public OverlappedDiscountPolicy(DiscountPolicy... policies) {
        super(new NoneCondition());
        this.discountPolicies = Arrays.asList( policies);
    }

    @Override
    protected Money getDiscountAmount(Item item) {
        Money result = Money.ZERO;
        for (DiscountPolicy each : discountPolicies) {
            result = result.plus(each.calculateDiscountAmount(item));
        }
        return result;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 1개를 추가하는것만으로 요구사항 구현이 완료되었습니다!&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #c3cee3;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;@Test
@DisplayName(&quot;중복할인 정책이 적용되어 상품의 가격에서 각각 1000원이 할인되고, 원가의 30%가 추가 할인된다.&quot;)
void createItem5() {
    //given
    Book book = new Book(&quot;Test Item&quot;, 10000, 10, &quot;조영호&quot;, &quot;오브젝트&quot;,
            new OverlappedDiscountPolicy(
                    new AmountDiscountPolicy(Money.of(1000),
                            new NoneCondition()
                    ),
                    new PercentDiscountPolicy(0.3,
                            new NoneCondition()
                    )
            ));

    ...

    //when
    Money discountMoney = book.calculateItemFee();

    //then
    assertEquals(Money.of(6000), discountMoney);
    assertEquals(Money.of(18000), order.getTotalPrice());
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bINvQL/btsO5XGSyUa/OigOH4gD0RLwPEXY6eFoG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bINvQL/btsO5XGSyUa/OigOH4gD0RLwPEXY6eFoG1/img.png&quot; data-alt=&quot;결과 (30000의 30%인 9000원할인, 1000원 할인)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bINvQL/btsO5XGSyUa/OigOH4gD0RLwPEXY6eFoG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbINvQL%2FbtsO5XGSyUa%2FOigOH4gD0RLwPEXY6eFoG1%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;715&quot; height=&quot;194&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;194&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;결과 (30000의 30%인 9000원할인, 1000원 할인)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변하는 부분과 변하지 않는 부분을 분리하고, 변하는 부분(할인정책, 할인조건)을 추상화 하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이로 인해 새로운 요구사항이 추가되더라도 클래스 1개를 추가하는것만으로 개발이 완료되는 코드를 만들었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때까지 과제테스트를 제출할때 위와 같은 할인, 쿠폰등과 같은 요구사항이 있는경우, DiscountType같은 필드변수와 if else 문으로 문제를 해결하려고 했습니다. 하지만 이를 객체지향적으로 해결하는 방법을 배웠고, 코드를 짤때 객체지향적인지 변화에 대응이 되는지 생각하면서 코드를 짜야겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;레퍼런스&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://product.kyobobook.co.kr/detail/S000001766367&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://product.kyobobook.co.kr/detail/S000001766367&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1751713081138&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;product.kyobobook.co.kr&quot; data-og-source-url=&quot;https://product.kyobobook.co.kr/detail/S000001766367&quot; data-og-url=&quot;https://product.kyobobook.co.kr/detail/S000001766367&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/GfO8h/hyZjiMtjZn/Pts60BzFlZ9m42NRYotzzK/img.jpg?width=458&amp;amp;height=573&amp;amp;face=0_0_458_573,https://scrap.kakaocdn.net/dn/c2k7hZ/hyZjsByfHD/9kJYDZ4rwix6qqMKvtSm70/img.jpg?width=458&amp;amp;height=573&amp;amp;face=0_0_458_573,https://scrap.kakaocdn.net/dn/wjSCo/hyZjyV4svm/gpK2cVporFBhrZ9v23NMj0/img.png?width=335&amp;amp;height=335&amp;amp;face=0_0_335_335&quot;&gt;&lt;a href=&quot;https://product.kyobobook.co.kr/detail/S000001766367&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://product.kyobobook.co.kr/detail/S000001766367&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/GfO8h/hyZjiMtjZn/Pts60BzFlZ9m42NRYotzzK/img.jpg?width=458&amp;amp;height=573&amp;amp;face=0_0_458_573,https://scrap.kakaocdn.net/dn/c2k7hZ/hyZjsByfHD/9kJYDZ4rwix6qqMKvtSm70/img.jpg?width=458&amp;amp;height=573&amp;amp;face=0_0_458_573,https://scrap.kakaocdn.net/dn/wjSCo/hyZjyV4svm/gpK2cVporFBhrZ9v23NMj0/img.png?width=335&amp;amp;height=335&amp;amp;face=0_0_335_335');&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;product.kyobobook.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;</description>
      <category>기술블로그</category>
      <author>Mini_96</author>
      <guid isPermaLink="true">https://mini-96.tistory.com/928</guid>
      <comments>https://mini-96.tistory.com/928#entry928comment</comments>
      <pubDate>Sat, 5 Jul 2025 19:58:09 +0900</pubDate>
    </item>
    <item>
      <title>[스택] 프로그래머스 괄호회전하기 // 회전하지 말고 뒤에붙여라</title>
      <link>https://mini-96.tistory.com/925</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/76502?gad_source=1&amp;amp;gad_campaignid=22199869887&amp;amp;gbraid=0AAAAAC_c4nDqT-kGu7HDiWreRKNyvkYUK&amp;amp;gclid=Cj0KCQjw1JjDBhDjARIsABlM2St3rddqiQ5vq_1tewqUOwj4SfVP6m4BAGqsMZ-_YLamLn7pOQO_k5QaAub0EALw_wcB&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/76502?gad_source=1&amp;amp;gad_campaignid=22199869887&amp;amp;gbraid=0AAAAAC_c4nDqT-kGu7HDiWreRKNyvkYUK&amp;amp;gclid=Cj0KCQjw1JjDBhDjARIsABlM2St3rddqiQ5vq_1tewqUOwj4SfVP6m4BAGqsMZ-_YLamLn7pOQO_k5QaAub0EALw_wcB&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1751602023824&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;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/76502?gad_source=1&amp;amp;gad_campaignid=22199869887&amp;amp;gbraid=0AAAAAC_c4nDqT-kGu7HDiWreRKNyvkYUK&amp;amp;gclid=Cj0KCQjw1JjDBhDjARIsABlM2St3rddqiQ5vq_1tewqUOwj4SfVP6m4BAGqsMZ-_YLamLn7pOQO_k5QaAub0EALw_wcB&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bskKRd/hyZfYPlEpn/MAkd3i20vkSnwNK76CRLt1/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/bbuj9v/hyZfWRytCi/L7oMvdPVskNPA4KLrQrji0/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/76502?gad_source=1&amp;amp;gad_campaignid=22199869887&amp;amp;gbraid=0AAAAAC_c4nDqT-kGu7HDiWreRKNyvkYUK&amp;amp;gclid=Cj0KCQjw1JjDBhDjARIsABlM2St3rddqiQ5vq_1tewqUOwj4SfVP6m4BAGqsMZ-_YLamLn7pOQO_k5QaAub0EALw_wcB&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/76502?gad_source=1&amp;amp;gad_campaignid=22199869887&amp;amp;gbraid=0AAAAAC_c4nDqT-kGu7HDiWreRKNyvkYUK&amp;amp;gclid=Cj0KCQjw1JjDBhDjARIsABlM2St3rddqiQ5vq_1tewqUOwj4SfVP6m4BAGqsMZ-_YLamLn7pOQO_k5QaAub0EALw_wcB&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bskKRd/hyZfYPlEpn/MAkd3i20vkSnwNK76CRLt1/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/bbuj9v/hyZfWRytCi/L7oMvdPVskNPA4KLrQrji0/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960');&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;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&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;h2 data-ke-size=&quot;size26&quot;&gt;* 풀이1&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접회전&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[이면 push 아니면 pop&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반례 -&amp;gt; }}} 만 오는 경우 true 가 되버림 -&amp;gt; leftCnt로 left의 갯수가 없다면 false 리턴&lt;/p&gt;
&lt;pre id=&quot;code_1751602974239&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 {
    String rotate(String s){
        return s.substring(1) + s.charAt(0);
    }
    boolean check(String s){
        int leftCnt=0;
        Stack&amp;lt;Character&amp;gt; stk = new Stack&amp;lt;&amp;gt;();
        for(int i=0;i&amp;lt;s.length();++i){
            char cur = s.charAt(i);
            if(s.charAt(i)=='[' || s.charAt(i)=='(' || s.charAt(i)=='{'){
                leftCnt++;
                stk.push(s.charAt(i));
            }
            else if(stk.size()&amp;gt;0 &amp;amp;&amp;amp; cur==']' &amp;amp;&amp;amp; stk.peek()=='['){
                stk.pop();
            }
            else if(stk.size()&amp;gt;0 &amp;amp;&amp;amp; cur==')' &amp;amp;&amp;amp; stk.peek()=='('){
                stk.pop();
            }
            else if(stk.size()&amp;gt;0 &amp;amp;&amp;amp; cur=='}' &amp;amp;&amp;amp; stk.peek()=='{'){
                stk.pop();
            }
        }
        return stk.isEmpty() &amp;amp;&amp;amp; leftCnt!=0;
    }
    public int solution(String s) {
        int answer = 0;
        int n=s.length();
        for(int i=0;i&amp;lt;n;++i){
            // System.out.println(s);
            if(check(s)) answer++;
            s=rotate(s);
        }
        return answer;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;* 풀이2&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;회전하지말고 뒤에 붙여라!&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;305&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqFq4z/btsO4LMRle7/be41wpAqSx49SO8J3bqwm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqFq4z/btsO4LMRle7/be41wpAqSx49SO8J3bqwm0/img.png&quot; data-alt=&quot;s+=s (문자열 뒤에 자기자신 붙이는법)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqFq4z/btsO4LMRle7/be41wpAqSx49SO8J3bqwm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqFq4z%2FbtsO4LMRle7%2Fbe41wpAqSx49SO8J3bqwm0%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;452&quot; height=&quot;305&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;305&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;s+=s (문자열 뒤에 자기자신 붙이는법)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;Stack대신 ArrayDequeue를 써라&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;if문대신 map을 사용하라.&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복문에 이름붙이는법.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;우측괄호가 in -&amp;gt; stk가 빔 -&amp;gt; false!&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1751604190978&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 s) {
        int answer=0;
        int n=s.length(); //window size
        s+=s; // 회전하지말고 붙여라.
        
        HashMap&amp;lt;Character,Character&amp;gt; m = new HashMap&amp;lt;&amp;gt;();
        m.put(')','(');
        m.put(']','[');
        m.put('}','{');
        
        A:for(int i=0;i&amp;lt;n;++i){ //반복문 바로 break 하는방법
            ArrayDeque&amp;lt;Character&amp;gt; stk = new ArrayDeque&amp;lt;&amp;gt;(); //Stack대신 ArrayDequeue를 사용하라.
            for(int j=i;j&amp;lt;i+n;++j){
                char cur = s.charAt(j);
                if(!m.containsKey(cur)){ // 좌측괄호인경우
                    stk.push(cur);
                }
                else if(stk.isEmpty() || stk.pop()!=m.get(cur)){ //우측괄호} 들어옴 -&amp;gt; 스택이 빔 or 같지않음 -&amp;gt; 무효
                    continue A; //A로 이동
                }
                
            }
            if(stk.isEmpty()) answer++; // else if문에 안걸리고 stk가 빈경우, 올바른 괄호
        }
        
        return answer;
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/스택</category>
      <author>Mini_96</author>
      <guid isPermaLink="true">https://mini-96.tistory.com/925</guid>
      <comments>https://mini-96.tistory.com/925#entry925comment</comments>
      <pubDate>Fri, 4 Jul 2025 13:46:06 +0900</pubDate>
    </item>
    <item>
      <title>[구현] 프로그래머스 방문길이 // set</title>
      <link>https://mini-96.tistory.com/923</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/49994?gad_source=1&amp;amp;gad_campaignid=22199869887&amp;amp;gbraid=0AAAAAC_c4nB6yISFBx5mGvyOG08zAQ87t&amp;amp;gclid=CjwKCAjwsZPDBhBWEiwADuO6y9aUyXD7gRRtDHQNWI8nlF7PY_7YefwJekHo0m-V-AOfGdA5TBefwxoCEsgQAvD_BwE&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/49994?gad_source=1&amp;amp;gad_campaignid=22199869887&amp;amp;gbraid=0AAAAAC_c4nB6yISFBx5mGvyOG08zAQ87t&amp;amp;gclid=CjwKCAjwsZPDBhBWEiwADuO6y9aUyXD7gRRtDHQNWI8nlF7PY_7YefwJekHo0m-V-AOfGdA5TBefwxoCEsgQAvD_BwE&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1751519266843&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;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/49994?gad_source=1&amp;amp;gad_campaignid=22199869887&amp;amp;gbraid=0AAAAAC_c4nB6yISFBx5mGvyOG08zAQ87t&amp;amp;gclid=CjwKCAjwsZPDBhBWEiwADuO6y9aUyXD7gRRtDHQNWI8nlF7PY_7YefwJekHo0m-V-AOfGdA5TBefwxoCEsgQAvD_BwE&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/xlq0T/hyZf4BKuG1/DG6pybXcsC8xDyxGpIHF71/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/dGpCfg/hyZfBzCv88/8zkGGLHKMIptY7ycpbfsq0/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/49994?gad_source=1&amp;amp;gad_campaignid=22199869887&amp;amp;gbraid=0AAAAAC_c4nB6yISFBx5mGvyOG08zAQ87t&amp;amp;gclid=CjwKCAjwsZPDBhBWEiwADuO6y9aUyXD7gRRtDHQNWI8nlF7PY_7YefwJekHo0m-V-AOfGdA5TBefwxoCEsgQAvD_BwE&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/49994?gad_source=1&amp;amp;gad_campaignid=22199869887&amp;amp;gbraid=0AAAAAC_c4nB6yISFBx5mGvyOG08zAQ87t&amp;amp;gclid=CjwKCAjwsZPDBhBWEiwADuO6y9aUyXD7gRRtDHQNWI8nlF7PY_7YefwJekHo0m-V-AOfGdA5TBefwxoCEsgQAvD_BwE&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/xlq0T/hyZf4BKuG1/DG6pybXcsC8xDyxGpIHF71/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/dGpCfg/hyZfBzCv88/8zkGGLHKMIptY7ycpbfsq0/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960');&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;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&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;h2 data-ke-size=&quot;size26&quot;&gt;* 풀이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좌표를 (0,0)으로 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;set에 from, to를 정렬후 넣기 (좌-&amp;gt;우, 위-&amp;gt;아래 순서)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;set.size가 정답일것&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;452&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJ26Sc/btsO2F0Eb6I/YUe8SVUqkz1HEihItuXKmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJ26Sc/btsO2F0Eb6I/YUe8SVUqkz1HEihItuXKmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJ26Sc/btsO2F0Eb6I/YUe8SVUqkz1HEihItuXKmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJ26Sc%2FbtsO2F0Eb6I%2FYUe8SVUqkz1HEihItuXKmK%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;614&quot; height=&quot;452&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;452&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1751519493617&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 Pos{
    int y, x;
    Pos(int y, int x){
        this.y=y;
        this.x=x;
    }
}

class Solution {
    
    static void print(Object o){
       System.out.println(o);
    }
    
    public int solution(String dirs) {
        int answer = 0;
        int[][] arr = new int[11][11];
        // print(Arrays.deepToString(arr));
        
        Set&amp;lt;String&amp;gt; s = new HashSet&amp;lt;&amp;gt;();
        
        Pos cur = new Pos(5,5);
        for(int i=0;i&amp;lt;dirs.length();++i){
            var a = dirs.charAt(i);
            if(a=='U'){
                int nx = cur.x;
                int ny=cur.y-1;
                if(nx&amp;lt;0 || ny&amp;lt;0 || nx&amp;gt;=11 || ny&amp;gt;=11) continue;
                var sb = new StringBuilder();
                sb.append(ny);
                sb.append(nx);
                sb.append(cur.y);
                sb.append(cur.x);
                s.add(sb.toString());
                cur = new Pos(ny,nx);
            }
            else if(a=='D'){
                int nx = cur.x;
                int ny=cur.y+1;
                if(nx&amp;lt;0 || ny&amp;lt;0 || nx&amp;gt;=11 || ny&amp;gt;=11) continue;
                var sb = new StringBuilder();
                sb.append(cur.y);
                sb.append(cur.x);
                sb.append(ny);
                sb.append(nx);
                s.add(sb.toString());
                cur = new Pos(ny,nx);
            }
            else if(a=='L'){
                int nx = cur.x-1;
                int ny=cur.y;
                if(nx&amp;lt;0 || ny&amp;lt;0 || nx&amp;gt;=11 || ny&amp;gt;=11) continue;
                var sb = new StringBuilder();
                sb.append(ny);
                sb.append(nx);
                sb.append(cur.y);
                sb.append(cur.x);
                s.add(sb.toString());
                cur = new Pos(ny,nx);
            }
            else if(a=='R'){
                int nx = cur.x+1;
                int ny=cur.y;
                if(nx&amp;lt;0 || ny&amp;lt;0 || nx&amp;gt;=11 || ny&amp;gt;=11) continue;
                var sb = new StringBuilder();
                sb.append(cur.y);
                sb.append(cur.x);
                sb.append(ny);
                sb.append(nx);
                s.add(sb.toString());
                cur = new Pos(ny,nx);
            }

        }
        return s.size();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;* 개선&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 정렬할필요없이 &amp;lt;from,to&amp;gt; &amp;lt;to,from&amp;gt;을 모두 넣고 size/2 하면 코드가 더 간단해진다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;459&quot; data-origin-height=&quot;71&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dkbkde/btsO14Nau2G/nSMv9FHkqEy28syf6dEvz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dkbkde/btsO14Nau2G/nSMv9FHkqEy28syf6dEvz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dkbkde/btsO14Nau2G/nSMv9FHkqEy28syf6dEvz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdkbkde%2FbtsO14Nau2G%2FnSMv9FHkqEy28syf6dEvz1%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;459&quot; height=&quot;71&quot; data-origin-width=&quot;459&quot; data-origin-height=&quot;71&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Algorithm/구현</category>
      <author>Mini_96</author>
      <guid isPermaLink="true">https://mini-96.tistory.com/923</guid>
      <comments>https://mini-96.tistory.com/923#entry923comment</comments>
      <pubDate>Thu, 3 Jul 2025 14:13:09 +0900</pubDate>
    </item>
    <item>
      <title>[배열] 프로그래머스 행렬의 곱셉</title>
      <link>https://mini-96.tistory.com/920</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12949?language=java&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/12949?language=java&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1751431843001&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;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12949?language=java&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hsiqX/hyZf6eZH8F/QJOKE4uheefqpFiiW5wPW0/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/bk6bOw/hyZf0MBd2C/44eFcms6USLhLwkwcdGCo0/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12949?language=java&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12949?language=java&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hsiqX/hyZf6eZH8F/QJOKE4uheefqpFiiW5wPW0/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/bk6bOw/hyZf0MBd2C/44eFcms6USLhLwkwcdGCo0/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960');&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;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&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;h2 data-ke-size=&quot;size26&quot;&gt;* 풀이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;answer 배열의 1칸씩 계산한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;k&lt;/b&gt;&lt;/u&gt;가 핵심!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 15 = 1*3 + 4*3 =&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;answer[0][0] = arr1[0][0] * arr2[0][0] + arr1[0][1] * arr2[1][0]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;answer[i][j] = for(k=0 to c1) arr[i][k] * arr2[k][j]&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;648&quot; data-origin-height=&quot;691&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKuNpv/btsO0HYAxSb/DvYBuZ8pQvhqR6mBIbq4Z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKuNpv/btsO0HYAxSb/DvYBuZ8pQvhqR6mBIbq4Z0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKuNpv/btsO0HYAxSb/DvYBuZ8pQvhqR6mBIbq4Z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKuNpv%2FbtsO0HYAxSb%2FDvYBuZ8pQvhqR6mBIbq4Z0%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;648&quot; height=&quot;691&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;691&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1751432057489&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[][] arr1, int[][] arr2) {
        int[][] answer = new int[arr1.length][arr2[0].length];

        for(int i=0;i&amp;lt;arr1.length;++i){
            for(int j=0;j&amp;lt;arr2[0].length;++j){
                for(int k=0;k&amp;lt;arr1[0].length;++k){
                    answer[i][j] += arr1[i][k]*arr2[k][j];
                }
            }
        }
        
        return answer;
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/배열</category>
      <author>Mini_96</author>
      <guid isPermaLink="true">https://mini-96.tistory.com/920</guid>
      <comments>https://mini-96.tistory.com/920#entry920comment</comments>
      <pubDate>Wed, 2 Jul 2025 14:01:54 +0900</pubDate>
    </item>
    <item>
      <title>리트코드 169 다수원소 // 배열, 투표알고리즘</title>
      <link>https://mini-96.tistory.com/915</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/majority-element/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://leetcode.com/problems/majority-element/description/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;* 풀이1&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;절반이상인 원소가 반드시 존재함을이용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정렬 -&amp;gt; 중간지점의 원소가 다수원소임&lt;/p&gt;
&lt;pre id=&quot;code_1749129427881&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 majorityElement(int[] nums) {
        Arrays.sort(nums);
        return nums[nums.length/2];
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;O(nlgn)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;* 풀이2&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;O(n)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;684&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLWTBp/btsOrbGx6XM/lkxTfYn4JkaDcCpp6hrl20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLWTBp/btsOrbGx6XM/lkxTfYn4JkaDcCpp6hrl20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLWTBp/btsOrbGx6XM/lkxTfYn4JkaDcCpp6hrl20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLWTBp%2FbtsOrbGx6XM%2FlkxTfYn4JkaDcCpp6hrl20%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;883&quot; height=&quot;684&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;684&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1749129500067&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 majorityElement(int[] nums) {
        int king=nums[0];
        int cnt=1;

        for(var num : nums){
            if(num==king){
                cnt++;
                continue;
            }
            cnt--;
            if(cnt==0){
                king=num;
                cnt=1;
            }
        }
        return king;
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/배열</category>
      <author>Mini_96</author>
      <guid isPermaLink="true">https://mini-96.tistory.com/915</guid>
      <comments>https://mini-96.tistory.com/915#entry915comment</comments>
      <pubDate>Thu, 5 Jun 2025 22:18:22 +0900</pubDate>
    </item>
  </channel>
</rss>