<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Wonkyun World</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Mon, 03 Jul 2023 16:53:38 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Wonkyun World</title>
            <url>https://velog.velcdn.com/images/1_kyun/profile/19586c0d-9ee6-403c-990e-19f7609ae5e6/social_profile.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. Wonkyun World. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/1_kyun" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[프로그래머스 Lv.2 호텔 대실]]></title>
            <link>https://velog.io/@1_kyun/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.2-%ED%98%B8%ED%85%94-%EB%8C%80%EC%8B%A4</link>
            <guid>https://velog.io/@1_kyun/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.2-%ED%98%B8%ED%85%94-%EB%8C%80%EC%8B%A4</guid>
            <pubDate>Mon, 03 Jul 2023 16:53:38 GMT</pubDate>
            <description><![CDATA[<h3 id="문제설명">문제설명</h3>
<blockquote>
<p>호텔을 운영 중인 코니는 최소한의 객실만을 사용하여 예약 손님들을 받으려고 합니다. 한 번 사용한 객실은 퇴실 시간을 기준으로 10분간 청소를 하고 다음 손님들이 사용할 수 있습니다. </br>
예약 시각이 문자열 형태로 담긴 2차원 배열 book_time이 매개변수로 주어질 때, 코니에게 필요한 최소 객실의 수를 return 하는 solution 함수를 완성해주세요.</p>
</blockquote>
</br>

<h3 id="제한사항">제한사항</h3>
<blockquote>
<ul>
<li>1 ≤ book_time의 길이 ≤ 1,000</br>
</li>
</ul>
</blockquote>
<ul>
<li>book_time[i]는 [&quot;HH:MM&quot;, &quot;HH:MM&quot;]의 형태로 이루어진 배열입니다</br></li>
<li>[대실 시작 시각, 대실 종료 시각] 형태입니다.</br></li>
<li>시각은 HH:MM 형태로 24시간 표기법을 따르며, &quot;00:00&quot; 부터 &quot;23:59&quot; 까지로 주어집니다.</br></li>
<li>예약 시각이 자정을 넘어가는 경우는 없습니다.</br></li>
<li>시작 시각은 항상 종료 시각보다 빠릅니다.</li>
</ul>
</br>

<h3 id="입출력-예">입출력 예</h3>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/0496f57c-ce81-40d0-843f-83ac1d53c355/image.png" alt=""></p>
</br>

<h3 id="정답코드">정답코드</h3>
<pre><code class="language-java">import java.util.LinkedList;
import java.util.Collections;

class room implements Comparable&lt;room&gt;{

    int start;
    int end;

    public room(int start , int end){
        this.start = start;
        this.end = end;
    }

    public int compareTo(room o){
        if(this.start != o.start)return this.start-o.start;
        else return this.end-o.end;
    }
}


class Solution {
    public int solution(String[][] book_time) {
        int answer = 0;

        LinkedList&lt;room&gt;roomList = new LinkedList&lt;&gt;();
        LinkedList&lt;Integer&gt;endTime = new LinkedList&lt;&gt;();


        for(int i = 0; i &lt; book_time.length; i++){
            String[] start = book_time[i][0].split(&quot;:&quot;);
            String[] end = book_time[i][1].split(&quot;:&quot;);

            int sTime = Integer.parseInt(start[0])*60+Integer.parseInt(start[1]);
            int eTime = Integer.parseInt(end[0])*60+Integer.parseInt(end[1]);

            room r = new room(sTime,eTime);
            roomList.add(r);
        }

        Collections.sort(roomList);

        while(!roomList.isEmpty()){
            room now = roomList.poll();
            int diff = Integer.MAX_VALUE;
            int idx = -1;

            if(endTime.isEmpty())endTime.add(now.end+10);
            else{
                for(int i = 0; i &lt; endTime.size(); i++){
                    if(now.start &gt;= endTime.get(i) &amp;&amp; now.start-endTime.indexOf(i)&lt;diff){
                        diff = now.start-endTime.indexOf(i);
                        idx = i;
                    }
                }
                if(idx == -1)endTime.add(now.end+10);
                else {
                    endTime.remove(idx);
                    endTime.add(idx,now.end+10);
                }
            }

        }

        return endTime.size();
    }
}</code></pre>
</br>

<h3 id="피드백">피드백</h3>
<blockquote>
<p>강의실 배정과 비슷한 그리디 문제 시작시간 기준 정렬과, 자료구조를 활용하는 문제 걸린시간: 30분 난이도 5/10</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 Lv.2 미로 탈출]]></title>
            <link>https://velog.io/@1_kyun/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.2-%EB%AF%B8%EB%A1%9C-%ED%83%88%EC%B6%9C</link>
            <guid>https://velog.io/@1_kyun/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.2-%EB%AF%B8%EB%A1%9C-%ED%83%88%EC%B6%9C</guid>
            <pubDate>Mon, 03 Jul 2023 16:43:52 GMT</pubDate>
            <description><![CDATA[<h3 id="문제설명">문제설명</h3>
<blockquote>
<p>1 x 1 크기의 칸들로 이루어진 직사각형 격자 형태의 미로에서 탈출하려고 합니다. 각 칸은 통로 또는 벽으로 구성되어 있으며, 벽으로 된 칸은 지나갈 수 없고 통로로 된 칸으로만 이동할 수 있습니다. </br>
통로들 중 한 칸에는 미로를 빠져나가는 문이 있는데, 이 문은 레버를 당겨서만 열 수 있습니다. 레버 또한 통로들 중 한 칸에 있습니다. </br>
따라서, 출발 지점에서 먼저 레버가 있는 칸으로 이동하여 레버를 당긴 후 미로를 빠져나가는 문이 있는 칸으로 이동하면 됩니다. 이때 아직 레버를 당기지 않았더라도 출구가 있는 칸을 지나갈 수 있습니다. 미로에서 한 칸을 이동하는데 1초가 걸린다고 할 때, 최대한 빠르게 미로를 빠져나가는데 걸리는 시간을 구하려 합니다. </br>
미로를 나타낸 문자열 배열 maps가 매개변수로 주어질 때, 미로를 탈출하는데 필요한 최소 시간을 return 하는 solution 함수를 완성해주세요. 만약, 탈출할 수 없다면 -1을 return 해주세요.</p>
</blockquote>
</br>
</br>

<h3 id="제한사항">제한사항</h3>
<blockquote>
</blockquote>
<ul>
<li>5 ≤ maps의 길이 ≤ 100, 5 ≤ maps[i]의 길이 ≤ 100 </br> </li>
<li>maps[i]는 다음 5개의 문자들로만 이루어져 있습니다.
  S : 시작 지점
  E : 출구
  L : 레버
  O : 통로
  X : 벽   </br> </li>
<li>시작 지점과 출구, 레버는 항상 다른 곳에 존재하며 한 개씩만 존재합니다.
출구는 레버가 당겨지지 않아도 지나갈 수 있으며, 모든 통로, 출구, 레버, 시작점은 여러 번 지나갈 수 있습니다.</li>
</ul>
</br> 

<h3 id="입출력-예">입출력 예</h3>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/ebc367b3-7500-4e2e-9211-fd8f1017dc5d/image.png" alt=""></p>
</br>
</br>

<h3 id="정답코드">정답코드</h3>
<pre><code class="language-java">import java.util.Queue;
import java.util.LinkedList;

class Node{

    int x;
    int y;
    int depth;

    Node(int x, int y, int depth){
        this.x = x;
        this.y = y;
        this.depth = depth;
    }
}


class Solution {
    static char [][] map;
    static int N = 0;
    static int M = 0;
    static int startX = 0;
    static int startY = 0;
    static int leverX = 0;
    static int leverY = 0;
    static int endX = 0;
    static int endY = 0;
    static int answer = 0; 
    static int [] dx = {-1,1,0,0};
    static int [] dy = {0,0,-1,1};

    public int solution(String[] maps) {

        N = maps.length;
        M = maps[0].length();

        map = new char[N][M]; 

        for(int i = 0; i &lt; N; i++){
            String input = maps[i];
            for(int j = 0; j &lt; M; j++){
                map[i][j] = input.charAt(j);
                if(input.charAt(j) == &#39;S&#39;){
                    startX = i;
                    startY = j;
                }
                else if(input.charAt(j) == &#39;L&#39;){
                    leverX = i;
                    leverY = j;
                }
                else if(input.charAt(j) == &#39;E&#39;){
                    endX = i;
                    endY = j;
                }
            }
        }

        int StoL = bfs(startX,startY,&#39;L&#39;);
        if(StoL == -1)return -1;
        answer+=StoL;

        int LtoE = bfs(leverX,leverY,&#39;E&#39;);

        if(LtoE == -1)return -1;
        else{
            System.out.println(LtoE);
            return answer+=LtoE;
        }

    }

    public static int bfs(int Bx, int By,  char c){

        Queue&lt;Node&gt;queue = new LinkedList&lt;&gt;();
        Node nd = new Node(Bx,By,0);
        queue.offer(nd);
        boolean [][] visited = new boolean[N][M];
        visited[Bx][By] = true;


        while(!queue.isEmpty()){ 
            Node nowNode = queue.poll();
            int x = nowNode.x;
            int y = nowNode.y;
            int depth = nowNode.depth;
            if(map[x][y] == c)return nowNode.depth;

            for(int i = 0; i &lt; 4; i++){
                int nx = x+dx[i];
                int ny = y+dy[i];

                if(nx&lt;0||ny&lt;0||nx&gt;=N||ny&gt;=M||map[nx][ny]==&#39;X&#39;||visited[nx][ny])continue;

                Node newNode = new Node(nx,ny,depth+1);
                queue.offer(newNode);
                visited[nx][ny] = true;
            }
        }

        return -1;
    }
}</code></pre>
</br>

<h3 id="피드백">피드백</h3>
<blockquote>
<p>최단거리 문제는 BFS를 이용하는데 굳이 Depth별로 할 필요가 없다면 일반적인 버전으로 풀자, 그리고 distance를 직접 안 새고 visited에 한번에 처리해서 visited[nx][ny] = visited[x][y]+1 식으로도 가능 걸린시간 40분, 난이도 : 4/10</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로젝트] 스프링부트 서버 배포: 인텔리제이 war, jar파일 export하기 ]]></title>
            <link>https://velog.io/@1_kyun/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EC%84%9C%EB%B2%84-%EB%B0%B0%ED%8F%AC-%EC%9D%B8%ED%85%94%EB%A6%AC%EC%A0%9C%EC%9D%B4-war-jar%ED%8C%8C%EC%9D%BC-export%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@1_kyun/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EC%84%9C%EB%B2%84-%EB%B0%B0%ED%8F%AC-%EC%9D%B8%ED%85%94%EB%A6%AC%EC%A0%9C%EC%9D%B4-war-jar%ED%8C%8C%EC%9D%BC-export%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 03 Jul 2023 16:24:11 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>스프링부트 RestAPI 서버를 배포하기 위한 전처리 과정이 필요. swagger이외에 AWS EC2, Netlify, Heroku 등등 서버에 배포하려면 프로젝트를 war또는 jar파일로 export해야한다. </p>
</blockquote>
</br>

<h3 id="jar-war-파일">JAR, WAR 파일</h3>
<p>기본적으로 JAR, WAR 모두 Java의 jar 옵션 (java -jar)을 이용해 생성된 압축(아카이브) 파일로, 애플리케이션을 쉽게 배포하고 동작시킬 수 있도록 관련 파일(리소스, 속성 파일 등)을 패키징 한 것</p>
</br>

<h3 id="jar-java-archive">JAR (Java Archive)</h3>
<ul>
<li>JAVA 어플리케이션이 동작할 수 있도록 자바 프로젝트를 압축한 파일</li>
<li>Class (JAVA리소스, 속성 파일), 라이브러리 파일을 포함함
JRE(JAVA Runtime Environment)만 있어도 실행 가능함 (java -jar 프로젝트네임.jar)</li>
</ul>
</br>

<h3 id="war-web-application-archive">WAR (Web Application Archive)</h3>
<ul>
<li><p>Servlet / Jsp 컨테이너에 배치할 수 있는 웹 애플리케이션(Web Application) 압축파일 포맷
웹 관련 자원을 포함함 (JSP, Servlet, JAR, Class, XML, HTML, Javascript)</p>
</li>
<li><p>사전 정의된 구조를 사용함 (WEB-INF, META-INF)
별도의 웹서버(WEB) or 웹 컨테이너(WAS) 필요</p>
</li>
<li><p>JAR파일의 일종으로 웹 애플리케이션 전체를 패키징 하기 위한 JAR 파일이다.</p>
</li>
</ul>
</br>

<h3 id="어떤-걸-써야하는가">어떤 걸 써야하는가?</h3>
<ul>
<li><p>SpringBoot를 사용한다면 Jar</p>
</li>
<li><p>JAR, WAR 파일 애플리케이션 리소스를 패키징 하는 방법에 차이가 있을 뿐, 뭘 사용해야 하느냐는 개발자의 판단에 따름. </p>
</li>
<li><p>꼭 WAR를 사용해야만 하는 이유(꼭 JSP를 사용하여 화면을 구성해야 한다 / 외장 WAS를 이용할 계획이 있다)가 아니라면 뭘 사용할지에 대한 완벽한 해답은 없다.</p>
</li>
</ul>
<p>하지만 Sprinag boot에서 가이드하는 표준은 JAR(JSP, 외장톰켓을 안사용)이니까 JAR를 사용하여 서비스하는 것이 좋다.</p>
</br> 

<h3 id="인텔리제이-프로젝트---war파일-만들기">인텔리제이 프로젝트 -&gt; war파일 만들기</h3>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/5e743292-18ba-4de8-b3c7-9194f9cfca29/image.png" alt=""></p>
<p>상위 탭에 view -&gt; Tool Windows -&gt; Maven 클릭 </br></p>
</br>

<p><img src="https://velog.velcdn.com/images/1_kyun/post/dd2bb955-2900-4c61-84b8-6a34c6547cbf/image.png" alt=""></p>
<p>clean -&gt; complie -&gt; install을 순서대로 누른다</p>
</br>

<p><img src="https://velog.velcdn.com/images/1_kyun/post/beb8fbaa-ed11-48e7-8999-61f61e05aa68/image.png" alt=""></p>
<p>.m2 폴더에 내 패키지 폴더를 보면 war파일이 만들어져있다. </p>
</br>
</br>


<h3 id="인텔리제이-프로젝트---jar파일-만들기">인텔리제이 프로젝트 -&gt; jar파일 만들기</h3>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/174fd661-5dc6-4a92-b50d-edd6861804d7/image.png" alt=""></p>
<p>File -&gt; Project Structure -&gt; Artifacts -&gt; + 버튼 -&gt; JAR -&gt; From modules with dependences 클릭</p>
</br>

<p><img src="https://velog.velcdn.com/images/1_kyun/post/cf80e601-4262-426c-813e-dd4f96ce453b/image.png" alt=""></p>
<p>Build -&gt; Build Artifacts 클릭</p>
</br>

<p><img src="https://velog.velcdn.com/images/1_kyun/post/681d8f4a-2d14-4426-8637-c1f79ff99ab8/image.png" alt=""></p>
<p>Action -&gt; Build 클릭</p>
</br>

<p><img src="https://velog.velcdn.com/images/1_kyun/post/bc57582b-867f-4c36-be7f-bfa1b6b002b0/image.png" alt=""></p>
<p>out폴더 -&gt; artifacts -&gt; project.jar 파일 생성</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[오류노트] - Swagger 3.0 설정시 발생하는 NullPointer 오류]]></title>
            <link>https://velog.io/@1_kyun/%EC%98%A4%EB%A5%98%EB%85%B8%ED%8A%B8-Swagger-3.0-%EC%84%A4%EC%A0%95%EC%8B%9C-%EB%B0%9C%EC%83%9D%ED%95%98%EB%8A%94-NullPointer-%EC%98%A4%EB%A5%98</link>
            <guid>https://velog.io/@1_kyun/%EC%98%A4%EB%A5%98%EB%85%B8%ED%8A%B8-Swagger-3.0-%EC%84%A4%EC%A0%95%EC%8B%9C-%EB%B0%9C%EC%83%9D%ED%95%98%EB%8A%94-NullPointer-%EC%98%A4%EB%A5%98</guid>
            <pubDate>Fri, 23 Jun 2023 09:32:50 GMT</pubDate>
            <description><![CDATA[<h2 id="오류-내용">오류 내용</h2>
<blockquote>
<p>org.springframework.context.ApplicationContextException: Failed to start bean&#39;documentationPluginsBootstrapper&#39;; nested exception is java.lang.NullPointerException</br>
at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:181) ~[spring-context-5.3.13.jar:5.3.13]</br>
at org.springframework.context.support.DefaultLifecycleProcessor.access 200(DefaultLifecycleProcessor.java:54) ~[spring-context-5.3.13.jar:5.3.13]</br>
at org.springframework.context.support.DefaultLifecycleProcessorLifecycleGroup.start(DefaultLifecycleProcessor.java:356) ~[spring-context-5.3.13.jar:5.3.13]
at java.lang.Iterable.forEach(Iterable.java:75) ~[na:1.8.0_311]</br>
at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:155) ~[spring-context-5.3.13.jar:5.3.13]</br>
at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:123) ~[spring-context-5.3.13.jar:5.3.13]</br>
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:935) ~[spring-context-5.3.13.jar:5.3.13]</br>
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:586) ~[spring-context-5.3.13.jar:5.3.13]</br>
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) ~[spring-boot-2.6.1.jar:2.6.1] </br>
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:730) ~[spring-boot-2.6.1.jar:2.6.1] </br>
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:412) ~[spring-boot-2.6.1.jar:2.6.1] </br>
at org.springframework.boot.SpringApplication.run(SpringApplication.java:302) ~[spring-boot-2.6.1.jar:2.6.1] </br>
at com.ej.batchtest.BatchTestApplication.main(BatchTestApplication.java:18) [main/:na]</br>
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_311]</br>
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_311]</br>
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_311]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_311]</br>
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) [spring-boot-devtools-2.6.1.jar:2.6.1]
Caused by: java.lang.NullPointerException: null</br>
at springfox.documentation.spring.web.WebMvcPatternsRequestConditionWrapper.getPatterns(WebMvcPatternsRequestConditionWrapper.java:56) ~[springfox-spring-webmvc-3.0.0.jar:3.0.0]</br>
at springfox.documentation.RequestHandler.sortedPaths(RequestHandler.java:113) ~[springfox-core-3.0.0.jar:3.0.0]</br>
at springfox.documentation.spi.service.contexts.Orderings.lambda$byPatternsCondition$3(Orderings.java:89) ~[springfox-spi-3.0.0.jar:3.0.0]</p>
</blockquote>
</br>
</br>

<h2 id="환경">환경</h2>
<blockquote>
<p>인텔리제이</br>
jdk11
SpringBoot 2.6.1
gradle
Swagger 3.0.0
SwaggerUI 3.0.0</p>
</blockquote>
</br>
</br>


<h2 id="해결방법">해결방법</h2>
</br>

<ol>
<li>스웨거 설정한 class에 WebMvcConfiguationSupport 를 확장시킨다.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/04a1fedc-adca-4d91-8c32-48d404025771/image.png" alt=""></p>
<ul>
<li>오류가 난 코드에는 extends를 따로 안 했었음 </li>
</ul>
</br>

<ol start="2">
<li>새로운 경로를 잡아준다 (extends한 거 Override)</li>
</ol>
<pre><code class="language-java">@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
   registry.addResourceHandler(&quot;/swagger-ui/**&quot;).addResourceLocations(&quot;classpath:/META-INF/resources/webjars/springfox-swagger-ui/&quot;);
   registry.addResourceHandler(&quot;/webjars/**&quot;).addResourceLocations(&quot;classpath:/META-INF/resources/webjars/springfox-swagger-ui/&quot;);
}
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 Lv.2 광물 캐기]]></title>
            <link>https://velog.io/@1_kyun/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.2-%EA%B4%91%EB%AC%BC-%EC%BA%90%EA%B8%B0</link>
            <guid>https://velog.io/@1_kyun/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.2-%EA%B4%91%EB%AC%BC-%EC%BA%90%EA%B8%B0</guid>
            <pubDate>Wed, 14 Jun 2023 22:43:23 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-설명">문제 설명</h2>
<blockquote>
<p>마인은 곡괭이로 광산에서 광석을 캐려고 합니다. 마인은 다이아몬드 곡괭이, 철 곡괭이, 돌 곡괭이를 각각 0개에서 5개까지 가지고 있으며, 곡괭이로 광물을 캘 때는 피로도가 소모됩니다. 각 곡괭이로 광물을 캘 때의 피로도는 아래 표와 같습니다. </br>
<img src="https://velog.velcdn.com/images/1_kyun/post/d5f8e757-2cfe-4ec7-9e98-3cfcbb773584/image.png" alt="">
예를 들어, 철 곡괭이는 다이아몬드를 캘 때 피로도 5가 소모되며, 철과 돌을 캘때는 피로도가 1씩 소모됩니다. 각 곡괭이는 종류에 상관없이 광물 5개를 캔 후에는 더 이상 사용할 수 없습니다.</br>
마인은 다음과 같은 규칙을 지키면서 최소한의 피로도로 광물을 캐려고 합니다.</br></p>
</blockquote>
<ul>
<li>사용할 수 있는 곡괭이중 아무거나 하나를 선택해 광물을 캡니다.</li>
<li>한 번 사용하기 시작한 곡괭이는 사용할 수 없을 때까지 사용합니다.</li>
<li>광물은 주어진 순서대로만 캘 수 있습니다.</li>
<li>광산에 있는 모든 광물을 캐거나, 더 사용할 곡괭이가 없을 때까지 광물을 캡니다. </br>
즉, 곡괭이를 하나 선택해서 광물 5개를 연속으로 캐고, 다음 곡괭이를 선택해서 광물 5개를 연속으로 캐는 과정을 반복하며, 더 사용할 곡괭이가 없거나 광산에 있는 모든 광물을 캘 때까지 과정을 반복하면 됩니다.</br>
마인이 갖고 있는 곡괭이의 개수를 나타내는 정수 배열 picks와 광물들의 순서를 나타내는 문자열 배열 minerals가 매개변수로 주어질 때, 마인이 작업을 끝내기까지 필요한 최소한의 피로도를 return 하는 solution 함수를 완성해주세요.</li>
</ul>
<p></br></br></p>
<h2 id="제한사항">제한사항</h2>
<blockquote>
<p>picks는 [dia, iron, stone]과 같은 구조로 이루어져 있습니다. </br></p>
</blockquote>
<ul>
<li>0 ≤ dia, iron, stone ≤ 5</li>
<li>dia는 다이아몬드 곡괭이의 수를 의미합니다.</li>
<li>iron은 철 곡괭이의 수를 의미합니다.</li>
<li>stone은 돌 곡괭이의 수를 의미합니다.</li>
<li>곡괭이는 최소 1개 이상 가지고 있습니다.</br></br></li>
<li>5 ≤ minerals의 길이 ≤ 50 </li>
<li>minerals는 다음 3개의 문자열로 이루어져 있으며 각각의 의미는 다음과 같습니다.</li>
<li>diamond : 다이아몬드</li>
<li>iron : 철</li>
<li>stone : 돌</li>
</ul>
<p></br></br></p>
<h2 id="입출력-예">입출력 예</h2>
<p><img src="blob:https://velog.io/a7726ae5-c38f-49bb-8d1e-79df6c14194c" alt="업로드중.."></p>
<p></br></br></p>
<h2 id="정답코드">정답코드</h2>
<pre><code class="language-java">import java.util.*;

class fiveMin implements Comparable&lt;fiveMin&gt;{
    int dia;
    int iron;
    int stone;

    public fiveMin(int dia, int iron, int stone){
        this.dia = dia;
        this.iron = iron;
        this.stone = stone;
    }

    //다이아&gt;철&gt;돌이 많은 미네랄 수로 정렬 
    @Override
    public int compareTo(fiveMin o){
        if(o.dia == this.dia){
            if(o.iron == this.iron){
                return o.stone - this.stone;
            }
            return o.iron - this.iron;
        }
        return o.dia - this.dia;
    } 
}


class Solution {
    public int solution(int[] picks, String[] minerals) {
        int answer = 0;

        ArrayList&lt;fiveMin&gt;minList = new ArrayList&lt;&gt;();

        int total = picks[0]+picks[1]+picks[2]; //총 곡괭이 수
        int d = 0;
        int ir = 0;
        int s = 0;

         //광물 5개씩 나눠서 객체 생성하기 
        int numOfFiveMin = 0;
        if(minerals.length % 5 == 0) numOfFiveMin = (int)minerals.length/5;
        else numOfFiveMin = (int)minerals.length/5+1;

        //min(곡괭이 갯수,전체를 5로 나눈 갯수)만큼의 광물 세트가 생긴다 
        numOfFiveMin = Math.min(numOfFiveMin,total);

        int cnt = 1;
        for(int i = 0; i &lt; minerals.length; i++){
            if(minerals[i].equals(&quot;diamond&quot;))d++;
            if(minerals[i].equals(&quot;iron&quot;))ir++;
            if(minerals[i].equals(&quot;stone&quot;))s++;

            if(i &gt; numOfFiveMin*5)break;

            if(i!=0 &amp;&amp; (cnt%5==0||i==minerals.length-1)){
                fiveMin fm = new fiveMin(d,ir,s); 
                minList.add(fm);
                d = 0;
                ir = 0;
                s = 0;
            }  
            cnt++;
        }

        Collections.sort(minList); 

        int pickNum = 0;
        loop:
        for(int i = 0; i &lt; minList.size(); i++){
            fiveMin fm = minList.get(i);
            //System.out.println(fm.dia+&quot; &quot;+fm.iron+&quot; &quot;+fm.stone);

            //현재 곡괭이를 다 쓴 경우 
            if(picks[pickNum] == 0){
                if(pickNum == 2)break;

                else if(pickNum == 1){
                     if(picks[2] == 0)break;
                     else pickNum = 2;
                }

                else if(pickNum == 0){
                    if(picks[1] == 0 &amp;&amp; picks[2] != 0) pickNum = 2;
                    else if(picks[1] == 0 &amp;&amp; picks[2] == 0)break;
                    else pickNum = 1;
                }
            }

            //다이아 곡괭이인 경우
            if(pickNum == 0){
                answer+= fm.dia + fm.iron +fm.stone;
                picks[0]--;
            }

            //철 곡괭이인 경우
            else if(pickNum == 1){
                answer+= 5*fm.dia + fm.iron +fm.stone;
                picks[1]--;
            }

            //돌 곡괭이인 경우
            else {
                answer+= 25*fm.dia + 5*fm.iron +fm.stone;
                picks[2]--;
            }
        }
        return answer;
    }
}</code></pre>
<p></br></br></p>
<h2 id="피드백">피드백</h2>
<p>5개로 묶어서 sorting 하는데 문제 조건에서는 광물 순서대로 캐야한다고 나와있다 
여기서 문제가 되는 케이스 -&gt; 곡괭이 갯수가 부족해서 뒤에는 못 캐는데 얘를 sorting 해버려서 
우선순위에 들어오는 경우가 발생할 수 있다. 문제 조건을 제대로 읽자</p>
<blockquote>
<p>아이디어를 떠올리는 건 어렵지 않지만 자잘한 조건 처리가 조금 까다로운 문제 난이도 5.5/10, 걸린시간 1시간</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 Lv.2 과제 진행하기
]]></title>
            <link>https://velog.io/@1_kyun/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.2-%EA%B3%BC%EC%A0%9C-%EC%A7%84%ED%96%89%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@1_kyun/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.2-%EA%B3%BC%EC%A0%9C-%EC%A7%84%ED%96%89%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 12 Jun 2023 15:35:53 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-설명">문제 설명</h2>
<blockquote>
<p>과제를 받은 루는 다음과 같은 순서대로 과제를 하려고 계획을 세웠습니다.</br>
과제는 시작하기로 한 시각이 되면 시작합니다.</br>
새로운 과제를 시작할 시각이 되었을 때, 기존에 진행 중이던 과제가 있다면 진행 중이던 과제를 멈추고 새로운 과제를 시작합니다.</br>
진행중이던 과제를 끝냈을 때, 잠시 멈춘 과제가 있다면, 멈춰둔 과제를 이어서 진행합니다.</br>
만약, 과제를 끝낸 시각에 새로 시작해야 되는 과제와 잠시 멈춰둔 과제가 모두 있다면, 새로 시작해야 하는 과제부터 진행합니다.</br>
멈춰둔 과제가 여러 개일 경우, 가장 최근에 멈춘 과제부터 시작합니다.</br>
과제 계획을 담은 이차원 문자열 배열 plans가 매개변수로 주어질 때, 과제를 끝낸 순서대로 이름을 배열에 담아 return 하는 solution 함수를 완성해주세요.</p>
</blockquote>
</br>
</br>

<h2 id="제한사항">제한사항</h2>
<blockquote>
<ul>
<li>3 ≤ plans의 길이 ≤ 1,000</li>
</ul>
</blockquote>
<ul>
<li>plans의 원소는 [name, start, playtime]의 구조로 이루어져 있습니다.</li>
<li>name : 과제의 이름을 의미합니다.</li>
<li>2 ≤ name의 길이 ≤ 10</li>
<li>name은 알파벳 소문자로만 이루어져 있습니다.</li>
<li>name이 중복되는 원소는 없습니다.</li>
<li>start : 과제의 시작 시각을 나타냅니다.</li>
<li>&quot;hh:mm&quot;의 형태로 &quot;00:00&quot; ~ &quot;23:59&quot; 사이의 시간값만 들어가 있습니다.</li>
<li>모든 과제의 시작 시각은 달라서 겹칠 일이 없습니다.</li>
<li>과제는 &quot;00:00&quot; ... &quot;23:59&quot; 순으로 시작하면 됩니다. 즉, 시와 분의 값이 작을수록 더 빨리 시작한 과제입니다.</li>
<li>playtime : 과제를 마치는데 걸리는 시간을 의미하며, 단위는 분입니다.</li>
<li>1 ≤ playtime ≤ 100</li>
<li>playtime은 0으로 시작하지 않습니다.</li>
<li>배열은 시간순으로 정렬되어 있지 않을 수 있습니다.</li>
<li>진행중이던 과제가 끝나는 시각과 새로운 과제를 시작해야하는 시각이 같은 경우 진행중이던 과제는 끝난 것으로 판단합니다.</li>
</ul>
</br>
</br>

<h2 id="입출력-예">입출력 예</h2>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/7106b900-3108-414c-8571-e246ddc56205/image.png" alt=""></p>
</br>
</br>

<h2 id="정답코드">정답코드</h2>
<pre><code class="language-java">//1. 시간이 빠른 순으로 진행해야 하니까 시간을 &quot;:&quot;을 기준으로 split 해서 분으로 바꿔서 sort
//2. 가장 최근에 멈춘 과제부터 다시 시작하니까 LIFO Stack을 사용한다
//3. 현재 과제를 하면서 그 다음 과제의 시작시간이 언제인지 tracking 한다. 
//4. 완료가 된 순서대로 ArrayList에 넣는다 

import java.util.*;

class homework implements Comparable&lt;homework&gt; {

    String name;
    int startTime;
    int time;

    public homework(String name, int startTime, int time){
        this.name = name;
        this.startTime = startTime;
        this.time = time;
    }

    public int compareTo(homework o){
        return this.startTime - o.startTime;
    }
}

class rest {

    String name;
    int restTime;

    public rest(String name, int restTime){
        this.name = name;
        this.restTime = restTime;
    }
}

class Solution {
    public String[] solution(String[][] plans) {
        String[] answer = {};

        PriorityQueue&lt;homework&gt;pq = new PriorityQueue&lt;&gt;();
        ArrayList&lt;String&gt;result = new ArrayList&lt;&gt;();
        Stack&lt;rest&gt;restStack = new Stack&lt;&gt;();


        for(String [] plan : plans){
            String name = plan[0];
            int time = Integer.parseInt(plan[2]);

            String [] temp = plan[1].split(&quot;:&quot;);
            int startTime = Integer.parseInt(temp[0])*60 + Integer.parseInt(temp[1]);
            pq.offer(new homework(name, startTime, time));
        }


        int nextStart = 0;
        int nowEnd, diff;

        while(!(pq.isEmpty()&amp;&amp;restStack.isEmpty())){

            //List에 할 일이 남아있을 때
            if(!pq.isEmpty()){
                homework now = pq.poll();
                nowEnd = now.startTime+now.time;

                if(!pq.isEmpty())nextStart = pq.peek().startTime;
                else if(pq.isEmpty()){
                    result.add(now.name);
                    continue;
                }

                //지금 하는 과제 중간에 다른 과제를 시작해야한다면 stack에 남은시간과 함께 추가하기 
                if(nowEnd &gt; nextStart){
                    diff = nowEnd - nextStart;
                    rest task = new rest(now.name,diff);
                    restStack.push(task);
                }

                //지금하는 일을 다음 과제 시작전에 마칠 수 있을 때 
                else{ 
                    result.add(now.name);
                    if(restStack.isEmpty()||nowEnd == nextStart||pq.isEmpty())continue;

                    //과제를 하고 남은 시간 
                    diff = nextStart - nowEnd;

                    //남은 시간을 다 써도 stack 첫번째 일을 못 끝내는 경우
                    if(diff &lt; restStack.peek().restTime){
                        restStack.peek().restTime-=diff;
                    }

                    //남은 시간 동안 1개 이상의 과제를 할 수 있을 때
                    else{                   
                        //과제를 모두 끝낼 수 있을 때 까지 stack에서 꺼내 과제를 한다
                        while (diff &gt; 0){
                            if(restStack.isEmpty())break;
                            rest nowRest = restStack.pop();

                            //하나를 끝내고 이 다음 과제도 수행이 가능하면
                            if(diff - nowRest.restTime &gt;= 0){
                                diff -= nowRest.restTime;
                                result.add(nowRest.name);
                                continue;
                            }

                            //이번 과제를 모두 끝내지 못하는 경우 
                            if(diff - nowRest.restTime &lt; 0){
                                rest addRest = new rest(nowRest.name,nowRest.restTime-diff);
                                restStack.push(addRest);
                                break;
                            }
                        }
                    }  
                }
            }

            //List에 할 일이 없을 때 stack에 남은 일들을 처리 
            else{
                while(!restStack.isEmpty()){
                    rest nowRest = restStack.pop();
                    result.add(nowRest.name);
                }
            }
        }

        answer = new String[result.size()];
        for(int i = 0; i &lt; result.size(); i++){
            answer[i] = result.get(i);
        }

        return answer;
    }
}</code></pre>
</br>
</br>

<h2 id="피드백">피드백</h2>
<blockquote>
<p>문제 자체는 쉬움(딱히 큰 알고리즘이 있는 건 아님) 하지만 구현 난이도가 높고 자료구조를 잘 활용해야하는 문제. 실수 없이 잘 훑어보자. 난이도 6/10, 걸린시간 1시간 30분</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 Lv.2 연속된 부분 수열의 합]]></title>
            <link>https://velog.io/@1_kyun/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.2-%EC%97%B0%EC%86%8D%EB%90%9C-%EB%B6%80%EB%B6%84-%EC%88%98%EC%97%B4%EC%9D%98-%ED%95%A9</link>
            <guid>https://velog.io/@1_kyun/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.2-%EC%97%B0%EC%86%8D%EB%90%9C-%EB%B6%80%EB%B6%84-%EC%88%98%EC%97%B4%EC%9D%98-%ED%95%A9</guid>
            <pubDate>Sat, 10 Jun 2023 09:24:29 GMT</pubDate>
            <description><![CDATA[<h3 id="문제-설명">문제 설명</h3>
<blockquote>
<p>비내림차순으로 정렬된 수열이 주어질 때, 다음 조건을 만족하는 부분 수열을 찾으려고 합니다.
기존 수열에서 임의의 두 인덱스의 원소와 그 사이의 원소를 모두 포함하는 부분 수열이어야 합니다.
부분 수열의 합은 k입니다. </br>
합이 k인 부분 수열이 여러 개인 경우 길이가 짧은 수열을 찾습니다.</br>
길이가 짧은 수열이 여러 개인 경우 앞쪽(시작 인덱스가 작은)에 나오는 수열을 찾습니다.</br>
수열을 나타내는 정수 배열 sequence와 부분 수열의 합을 나타내는 정수 k가 매개변수로 주어질 때, 위 조건을 만족하는 부분 수열의 시작 인덱스와 마지막 인덱스를 배열에 담아 return 하는 solution 함수를 완성해주세요. 이때 수열의 인덱스는 0부터 시작합니다.</p>
</blockquote>
</br>

<h3 id="제한사항">제한사항</h3>
<blockquote>
<p>5 ≤ sequence의 길이 ≤ 1,000,000</br>
1 ≤ sequence의 원소 ≤ 1,000</br>
sequence는 비내림차순으로 정렬되어 있습니다.</br>
5 ≤ k ≤ 1,000,000,000</br>
k는 항상 sequence의 부분 수열로 만들 수 있는 값입니다.</br></p>
</blockquote>
</br> 

<h3 id="입출력-예">입출력 예</h3>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/c733cbb0-d4ab-428c-a67f-39e017102228/image.png" alt=""></p>
</br>

<h3 id="정답코드">정답코드</h3>
<pre><code class="language-java">
//1. k보다 작은 원소까지만 탐색한다 
//2. 투포인터 이용해서 앞+뒤로 따로 탐색 값이 커지면 뒤를 당기고 값이 작아지면 앞을 민다
//3. 백준 회전초밥 문제와 동일

class Solution {
    public int[] solution(int[] sequence, int k) {
        int[] answer = {};

        int min_left = 0;
        int min_right = sequence.length;

        int left = 0;
        int right = 0;
        int sum = sequence[0];

        while(left &lt; sequence.length &amp;&amp; right &lt; sequence.length) {

            if (sequence[left] &gt; k) {
                break;
            }

            //부분 수열의 합이 k일 때는 조건에 따라 업데이트
            if (sum == k) {
                if (min_right - min_left &gt; right-left) {
                    min_left = left;
                    min_right = right;
                } else if (min_right - min_left == right - left) {
                    if (min_left &gt; left) {
                        min_left = left;
                        min_right = right;
                    }
                }
            }

            //부분 수열의 합이 k보다 작다면 오른쪽을 민다
            if (sum &lt;= k) {
                right++;
                if (right &lt; sequence.length) {
                    sum += sequence[right];
                }
            } 

            //부분 수열의 합이 k보다 크다면 왼쪽을 당긴다
            else {
                sum -= sequence[left];
                left++;
            }
        }

        answer = new int[]{min_left, min_right};
        return answer;
    }
}</code></pre>
<h3 id="피드백">피드백</h3>
<blockquote>
<p>완전 탐색으로 풀 경우 O(n^2)이 나오기 때문에 1,000,000^2은 안 됨 즉 최대 O(nlogn)으로 접근해야하는데 연속된 수열의 합은 투포인터로 접근이 가능하다 난이도 7/10 걸린시간 1시간 &lt;다시 한 번 풀어보가&gt; </p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 Lv.2 요격 시스템]]></title>
            <link>https://velog.io/@1_kyun/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.2-%EC%9A%94%EA%B2%A9-%EC%8B%9C%EC%8A%A4%ED%85%9C</link>
            <guid>https://velog.io/@1_kyun/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.2-%EC%9A%94%EA%B2%A9-%EC%8B%9C%EC%8A%A4%ED%85%9C</guid>
            <pubDate>Sat, 10 Jun 2023 09:13:13 GMT</pubDate>
            <description><![CDATA[<h3 id="문제-설명">문제 설명</h3>
<blockquote>
<p>A 나라가 B 나라를 침공하였습니다. B 나라의 대부분의 전략 자원은 아이기스 군사 기지에 집중되어 있기 때문에 A 나라는 B 나라의 아이기스 군사 기지에 융단폭격을 가했습니다.</br>
A 나라의 공격에 대항하여 아이기스 군사 기지에서는 무수히 쏟아지는 폭격 미사일들을 요격하려고 합니다. 이곳에는 백발백중을 자랑하는 요격 시스템이 있지만 운용 비용이 상당하기 때문에 미사일을 최소로 사용해서 모든 폭격 미사일을 요격하려 합니다.</br>
A 나라와 B 나라가 싸우고 있는 이 세계는 2 차원 공간으로 이루어져 있습니다. A 나라가 발사한 폭격 미사일은 x 축에 평행한 직선 형태의 모양이며 개구간을 나타내는 정수 쌍 (s, e) 형태로 표현됩니다. B 나라는 특정 x 좌표에서 y 축에 수평이 되도록 미사일을 발사하며, 발사된 미사일은 해당 x 좌표에 걸쳐있는 모든 폭격 미사일을 관통하여 한 번에 요격할 수 있습니다. 단, 개구간 (s, e)로 표현되는 폭격 미사일은 s와 e에서 발사하는 요격 미사일로는 요격할 수 없습니다. 요격 미사일은 실수인 x 좌표에서도 발사할 수 있습니다.</br>
각 폭격 미사일의 x 좌표 범위 목록 targets이 매개변수로 주어질 때, 모든 폭격 미사일을 요격하기 위해 필요한 요격 미사일 수의 최솟값을 return 하도록 solution 함수를 완성해 주세요.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/9d9b0d6f-b173-40b9-9ee0-d72fee3f8eb3/image.png" alt=""></p>
</br>
</br>

<h3 id="제한-사항">제한 사항</h3>
<blockquote>
<p>1 ≤ targets의 길이 ≤ 500,000
targets의 각 행은 [s,e] 형태입니다.
이는 한 폭격 미사일의 x 좌표 범위를 나타내며, 개구간 (s, e)에서 요격해야 합니다.
0 ≤ s &lt; e ≤ 100,000,000</p>
</blockquote>
</br>
</br>

<h3 id="입출력-예">입출력 예</h3>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/f68036ed-efcc-4cff-ab61-fa758b4b23f7/image.png" alt=""></p>
<h3 id="정답코드">정답코드</h3>
<pre><code class="language-java">import java.util.*;

class missile implements Comparable&lt;missile&gt; {
    int start;
    int end; 

    public missile(int start, int end){
        this.start = start;
        this.end = end;
    }

    public int compareTo(missile m){
        if(this.start != m.start)return this.start - m.start;
        return this.end - m.end;
    }

}


class Solution {
    public int solution(int[][] targets) {
        int answer = 0;

        PriorityQueue&lt;missile&gt;pq = new PriorityQueue&lt;&gt;();

        //시작 순서가 빠른 순으로, 같다면 끝나는 지점이 빠른 순으로
        for(int i = 0; i &lt; targets.length; i++){
            missile m = new missile(targets[i][0],targets[i][1]);
            pq.add(m);
        }


        int end = -1; 

        while(!pq.isEmpty()){
            missile m = pq.poll(); 

            //다음 미사일의 시작 지점이 앞의 끝 지점을 넘는다면 새로운 미사일로 요격해야한다
            if(m.start &gt;= end){
                answer++;
                end = m.end;
                continue;
            }

            //미사일 길이의 끝이 짧은 걸로 업데이트 이전 미사일로 요격은 가능 but 끝지점이 줄어든다
            if(m.end &lt; end){
                end = m.end;
            }

        }

        return answer;
    }
}</code></pre>
<blockquote>
<p>백준에 회의실 배정문제와 비슷한 그리디 문제. 딱 보자마자 그리디 인 것을 눈치채야한다. 전형적인 유형이긴 함 난이도 6/10 걸린시간 1시간 10분 </p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 18114 블랙 프라이데이 (Gold 5)]]></title>
            <link>https://velog.io/@1_kyun/%EB%B0%B1%EC%A4%80-18114-%EB%B8%94%EB%9E%99-%ED%94%84%EB%9D%BC%EC%9D%B4%EB%8D%B0%EC%9D%B4-Gold-5</link>
            <guid>https://velog.io/@1_kyun/%EB%B0%B1%EC%A4%80-18114-%EB%B8%94%EB%9E%99-%ED%94%84%EB%9D%BC%EC%9D%B4%EB%8D%B0%EC%9D%B4-Gold-5</guid>
            <pubDate>Tue, 16 May 2023 15:48:53 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>너무 한번에 해결할려고 하니까 로직도 꼬이고 복잡해짐, 그냥 차근차근 갯수 구하면 되는 문제였음. 완탐으로 가능한 거 같으면 최적화를 너무 생각하지 말고 일단 완탐답게 구현하자
걸린시간 1시간     난이도 4/10</p>
</blockquote>
<pre><code class="language-java">
/*  Set 자료구조 이용해서 하나씩 차근차근 확인하기 
    1개일 때 -&gt; 그냥 확인 
    2개일 때 -&gt; 완탐으로 확인
    3개일 때 -&gt; 완탐 돌리면서 총 금액 - 2개 합을 뽑을 수 
    있는지 확인하기 
/*

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.StringTokenizer;

public class BlackFriday {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int c = Integer.parseInt(st.nextToken());
        int[] arr = new int[n];

        HashSet&lt;Integer&gt; hs = new HashSet&lt;&gt;();
        st = new StringTokenizer(br.readLine());

        //1개로 가능한지 확인
        for (int i = 0; i &lt; n; i++) {
            int cur = Integer.parseInt(st.nextToken());
            arr[i] = cur;
            hs.add(cur);
            if (cur == c) {
                System.out.println(1);
                return;
            }
        }

        //2개로 가능한지 확인
        for (int i = 0; i &lt; n; i++) {
            int remain = c-arr[i];
            if (arr[i] == remain) continue;
            if (hs.contains(remain)) {
                System.out.println(1);
                return;
            }
        }               

        //3개로 가능한지 확인
        for (int i = 0; i &lt; n; i++) {
            for (int j = i+1; j &lt; n; j++) {
                int remain = c-(arr[i]+arr[j]);

                //같은 무게는 들어있지 않으니까
                if (remain == arr[i] || remain == arr[j]) continue;
                if (hs.contains(remain)) {
                    System.out.println(1);
                    return;
                }
            }
        }
        System.out.println(0);
    }
}



</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 18405 경쟁적 전염 (Gold 5)]]></title>
            <link>https://velog.io/@1_kyun/%EB%B0%B1%EC%A4%80-18405-%EA%B2%BD%EC%9F%81%EC%A0%81-%EC%A0%84%EC%97%BC-Gold-5</link>
            <guid>https://velog.io/@1_kyun/%EB%B0%B1%EC%A4%80-18405-%EA%B2%BD%EC%9F%81%EC%A0%81-%EC%A0%84%EC%97%BC-Gold-5</guid>
            <pubDate>Tue, 16 May 2023 15:44:35 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>분명 쉬운 문제였는데 좀 해맨 문제였다 일단 ~~한 순으로 가 나온다면 무지성 PQ박지 말고 그냥 arrayList나 다른 방법 생각하기 &amp; 최대한 간단하고 쉽게 구현하자 
걸린시간 1시간 10분,  난이도 5.5/10</p>
</blockquote>
<pre><code class="language-java">

/*
 * 쉬운 BFS, 정렬 문제일 수록 정확하고 빨리 풀자
 * 너무 복잡하게 구현하고 있다는 생각이 든다면 제대로 구현하고 있는지 확인하자
 * 
 */

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.StringTokenizer;

class virus implements Comparable&lt;virus&gt; {
    int x;
    int y;
    int num;

    public virus(int x, int y, int num) {
        super();
        this.x = x;
        this.y = y;
        this.num = num;
    }

    @Override
    public int compareTo(virus o) {
        return this.num - o.num;
    }

}

public class CompetitiveInfection {
    static int N, K, S, X, Y;
    static int[][] map;
    static int[] dx = { -1, 1, 0, 0 };
    static int[] dy = { 0, 0, -1, 1 };
    static List&lt;virus&gt; VirusList;

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

        N = Integer.parseInt(st.nextToken());
        K = Integer.parseInt(st.nextToken());
        VirusList= new LinkedList&lt;&gt;();
        map = new int[N][N];

        for (int i = 0; i &lt; N; i++) {
            String[] in = br.readLine().split(&quot; &quot;);
            for (int j = 0; j &lt; N; j++) {    
                int input = Integer.parseInt(in[j]);
                map[i][j] = input;
                if(input!= 0) {
                    virus v = new virus(i, j, input);
                    VirusList.add(v);
                }
            }
        }

        Collections.sort(VirusList);

        st = new StringTokenizer(br.readLine());

        S = Integer.parseInt(st.nextToken());
        X = Integer.parseInt(st.nextToken())-1;
        Y = Integer.parseInt(st.nextToken())-1;

        if(map[X][Y]!=0) {
            System.out.println(map[X][Y]);
            System.exit(0);
        }

        if(S==0) {
            System.out.println(0);
            System.exit(0);
        }
        spread();
    }

    public static void spread() {
        int cnt = 0;
        Queue&lt;virus&gt;VirusQ = new LinkedList&lt;&gt;();

        for(int i = 0; i &lt; VirusList.size(); i++) {
            VirusQ.offer(VirusList.get(i));
        }

        while (!VirusQ.isEmpty()) {
            int size = VirusQ.size();
            for (int n = 0; n &lt; size; n++) {
                virus nowVirus = VirusQ.poll();
                int x = nowVirus.x;
                int y = nowVirus.y;
                int num = nowVirus.num;

                for (int i = 0; i &lt; 4; i++) {
                    int nx = x + dx[i];
                    int ny = y + dy[i];

                    if (nx &lt; 0 || nx &gt;= N || ny &lt; 0 || ny &gt;= N || map[nx][ny] != 0)
                        continue;

                    if(nx == X &amp;&amp; ny == Y) {
                        System.out.println(num);
                        System.exit(0);
                    }

                    map[nx][ny] = num;
                    virus nextVirus = new virus(nx, ny, num);
                    VirusQ.add(nextVirus);
                }
            }

            cnt++;
            if(cnt==S) {
                System.out.println(0);
                System.exit(0);
            }
        }

    }

}
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Framework : Vue.js] Vuex]]></title>
            <link>https://velog.io/@1_kyun/Framework-Vue.js-Vuex</link>
            <guid>https://velog.io/@1_kyun/Framework-Vue.js-Vuex</guid>
            <pubDate>Mon, 15 May 2023 01:53:16 GMT</pubDate>
            <description><![CDATA[<h2 id="vuex">vuex</h2>
<ul>
<li><p>Vue.js application에 대한 상태관리패턴 + 라이브러리 </p>
</li>
<li><p>application 모든 component들의 중앙 저장소 역할(데이터 관리)</p>
</li>
<li><p>상위(부모) 하위(자식)의 단계가 많이 복잡해 진다면 데이터의 전달하는 부분이 매우 복잡해 짐</p>
</li>
<li><p>application이 여러 구성 요소로 구성되고 더 커지는 경우 데이터를 공유하는 문제가 발생</p>
</li>
</ul>
</br>

<h3 id="부모-자식-컴포넌트간의-data-전달">부모-자식 컴포넌트간의 data 전달</h3>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/94bfe746-7645-4c92-8ee4-6ee7eb64e130/image.png" alt=""></p>
</br>

<h3 id="동위-컴포넌트-간의-data-전달">동위 컴포넌트 간의 data 전달</h3>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/e2bcf874-df59-4a36-857a-9d725add81f9/image.png" alt=""></p>
</br>

<h3 id="vuex-1">vuex</h3>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/9a223065-d763-48a2-b4ae-1862bbb9474c/image.png" alt=""></p>
</br>

<h3 id="상태관리패턴">상태관리패턴</h3>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/6c33860c-10fe-44f4-9ebf-7b62b64a69f7/image.png" alt=""></p>
</br>
</br>

<h2 id="vuex-핵심컨셉">vuex 핵심컨셉</h2>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/52193ced-988d-4224-bf9a-77211101abd3/image.png" alt=""></p>
<h3 id="vuex-구성요소---state">vuex 구성요소 - state</h3>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/4150537a-ec78-4cac-848c-797fc57a3778/image.png" alt=""></p>
</br>

<h3 id="vuex-구성요소---actions">vuex 구성요소 - actions</h3>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/874f6bd2-5825-4e98-b0c2-7d7eead5f3d2/image.png" alt=""></p>
</br>

<h3 id="vuex-구성요소---mutations">vuex 구성요소 - mutations</h3>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/f0c93c3e-1fdf-4f6b-b032-cb1e4c023ae0/image.png" alt=""></p>
</br>

<h3 id="vuex-구성요소---getters">vuex 구성요소 - getters</h3>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/fc93fcab-8005-4430-b258-fc4f5ba791c2/image.png" alt=""></p>
</br>

<h2 id="저장소---vuex">저장소 - vuex</h2>
<ul>
<li><p>State: 단일 상태 트리를 사용. application마다 하나의 저장소를 관리 (data)</p>
</li>
<li><p>Getters: Vue Instance의 Copmuted와 같은 역할. State를 기반으로 계산(computed)</p>
</li>
<li><p>Mutations: State의 상태를 변경하는 유일한 방법 (동기 methods)</p>
</li>
<li><p>Actions: 상태를 변이 시키는 대신 액션으로 변이에 대한 커밋 처리 (비동기 methods)</p>
</li>
</ul>
<br>

<h3 id="vuex-설정">vuex 설정</h3>
<ul>
<li>module 시스템과 함께 사용시 Vue.use()를 통해 Vuex 설정 </li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/8be9461d-c31c-4dbb-b5e5-e1a636a2e795/image.png" alt=""></p>
</br>
</br>

<h2 id="저장소---state">저장소 - state</h2>
<h3 id="vuex-단계별-이해하기">vuex 단계별 이해하기</h3>
<ul>
<li>step01: vuex 사용 </li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/5a92d4a1-e021-4efa-b3f4-782f4d9ffe7b/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/10878d4a-ef28-428a-af57-7d06d4d1aba4/image.png" alt=""></p>
</br>

<h3 id="저장소-store---state">저장소 (Store) - state</h3>
<ul>
<li><p>저장소에서 data 속성의 역할 </p>
</li>
<li><p>application에서 공유해야 할 data를 관리 </p>
</li>
<li><p>state에 접근하는 방식: this.$store.state.data_name</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/1e5e4246-df8c-4c73-83f1-3f4e815c69b1/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/63743887-1394-43c9-a89d-f3e45b3498d4/image.png" alt=""></p>
</br>
</br>

<h2 id="저장소---getters">저장소 - getters</h2>
<h3 id="저장소---getters-1">저장소 - Getters</h3>
<ul>
<li><p>Component가 vuex의 state를 직접 접근하는 코드가 중복된다면?</p>
</li>
<li><p>해결: Store의 State를 참조하는 Getters를 활용 </p>
</li>
<li><p>정의 </p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/79d409b5-fce5-48bd-83e5-a89c55b50772/image.png" alt=""></p>
<ul>
<li>사용</li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/8d65f8a9-7a2a-4ac9-a628-b728798cb325/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/041d21e4-7344-4060-8a0b-27ff5f020c1c/image.png" alt=""></p>
<ul>
<li>step02 Getters 등록 </li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/7f8dc12b-74d5-459d-bfc2-9ce7a68ffbcb/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/1e14262e-59ed-4e79-9e36-a34c131e0ba8/image.png" alt=""></p>
</br>
</br>

<h2 id="저장소---mapgetters">저장소 - mapGetters</h2>
<ul>
<li><p>getters를 조금 더 간단하게 호출 </p>
</li>
<li><p>주의: Babel 관련 에러 발생시 해결 </p>
</li>
</ul>
</br>

<h3 id="저장소---mapgetters-1">저장소 - mapGetters</h3>
<ul>
<li>step 03 </li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/5fb3ff2e-6874-4a95-8d02-d6c8b44b713b/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/1e0085a9-b5cc-49e6-a3fe-00e2e07624d6/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/21e9297e-e6dc-4a85-ad44-e98f35eefdd8/image.png" alt=""></p>
</br>
</br>

<h2 id="저장소---mutations">저장소 - mutations</h2>
<h3 id="저장소store---mutations">저장소(store) - Mutations</h3>
<ul>
<li><p>State의 값을 변결하기 위해서 사용 </p>
</li>
<li><p>각 컴포넌트에서 State의 값을 직접 변경하는 것은 권장하지 않는 방식 </p>
</li>
<li><p>State의 값의 추적을 위해 동기적 기능에 사용 </p>
</li>
<li><p>Mutations는 직접 호출이 불가능하고 store.commit(&#39;정의된 이름&#39;)으로 호출 </p>
</li>
<li><p>step 04 Mutations 등록</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/3e5bb5b0-e66d-4949-98be-82ecf50b2f34/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/bfa8cf5e-6fa6-4b2b-89e6-069306598529/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/79023db4-7b85-4db9-983a-bf2608510e6a/image.png" alt=""></p>
<ul>
<li>step 05 </li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/a52ec770-3080-4a87-92b9-2c952abbc309/image.png" alt=""></p>
</br>
</br>

<h2 id="저장소---actions">저장소 - actions</h2>
<h3 id="저장소store---actions">저장소(Store) - Actions</h3>
<ul>
<li><p>비동기 작업의 결과를 적용하려고 할 때 사용 </p>
</li>
<li><p>Mutations는 상태 관리를 위해 동기적으로 처리하고 비동기적인 처리는 Actions가 담당 </p>
</li>
<li><p>Actions는 비동기 로직의 처리가 종료되면 Mutations를 호출</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/92ce7136-d02e-4139-8007-df9278ad58db/image.png" alt=""></p>
</br>

<ul>
<li>step 06</li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/dd828b44-2a37-44e6-867a-176a88399a4c/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/a6741197-af5b-4b8b-9ac2-4cb6c110251d/image.png" alt=""></p>
<br>

<ul>
<li>step 07 mapActions</li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/207671ab-7f53-4094-9a47-a849af291404/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 1461 도서관 (Gold 5)]]></title>
            <link>https://velog.io/@1_kyun/%EB%B0%B1%EC%A4%80-1461-%EB%8F%84%EC%84%9C%EA%B4%80-Gold-5</link>
            <guid>https://velog.io/@1_kyun/%EB%B0%B1%EC%A4%80-1461-%EB%8F%84%EC%84%9C%EA%B4%80-Gold-5</guid>
            <pubDate>Thu, 11 May 2023 07:30:03 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/1461">백준 1461 도서관</a></p>
<blockquote>
<p>전통적인 그리디 문제 but 아이디어가 좋은 문제였음 
풀이시간: 30분 난이도 5/10</p>
</blockquote>
<pre><code class="language-java">package algo;


/*
 * 1. 양수 음수 나누기 
 * 2. 각 부호별로 절대값이 높은 N개씩 묶기 절대값이 큰 거리만 가면 된다
 * 3. 절대값이 제일 큰 1그룹은 제일 마지막에 추가 
 * 
 * 7 2
 * -39 -37 -29  -28  -6  2  11 
 * (-39,-37) (-29,-28) (11,2), -6
 * (11+29+6)*2 + 39
 * 46*2+39 = 131
 * 
 */

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Library {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        int sum = 0;

        String [] in = br.readLine().split(&quot; &quot;);
        int [] books = new int[N];

        //음수 양수를 기준으로 나누고 절대값이 높은 순부터 정렬
        PriorityQueue&lt;Integer&gt;minus = new PriorityQueue&lt;&gt;((o1,o2) -&gt; (o2-o1));
        PriorityQueue&lt;Integer&gt;plus = new PriorityQueue&lt;&gt;((o1,o2) -&gt; (o2-o1));


        for(int i = 0; i&lt; N; i++) {
            int Now = Integer.parseInt(in[i]);
            books[i] = Now;
            if(Now&lt;0)minus.offer(Math.abs(Now));
            else plus.offer(Now);
        }

        ArrayList&lt;Integer&gt;total = new ArrayList&lt;&gt;();

        int cnt = 0;

        //양수 음수 별로 거리가 먼 것들 부터 M개 만큼 묶어서 전체 리스트에 추가 
        //여기서 묶음별 가장 큰 값 만큼만 가면 된다 -&gt; 가는 길에 놔두면 되니까
        while(!minus.isEmpty()) {
            int temp = minus.poll();
            if(cnt == 0)total.add(temp);
            cnt++;
            if(cnt == M)cnt = 0; 
        }

        cnt = 0;
        while(!plus.isEmpty()) {
            int temp = plus.poll();
            if(cnt == 0)total.add(temp);
            cnt++;
            if(cnt == M)cnt = 0; 
        }

        Collections.sort(total);

        //가장 먼 책을 제외하고는 책을 다시 가지러 와야함
        for(int i = 0; i &lt; total.size()-1; i++) {
            sum += 2*total.get(i);
        }

        //가장 거리가 먼 책은 1번만 더하고
        sum += total.get(total.size()-1);

        System.out.println(sum);
    }

}
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 16500 문자열 판별 (Gold 5)]]></title>
            <link>https://velog.io/@1_kyun/%EB%B0%B1%EC%A4%80-16500-%EB%AC%B8%EC%9E%90%EC%97%B4-%ED%8C%90%EB%B3%84-Gold-5</link>
            <guid>https://velog.io/@1_kyun/%EB%B0%B1%EC%A4%80-16500-%EB%AC%B8%EC%9E%90%EC%97%B4-%ED%8C%90%EB%B3%84-Gold-5</guid>
            <pubDate>Thu, 11 May 2023 06:38:34 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/16500">백준 16500 문자열 판별 </a></p>
<blockquote>
<p>자료구조 + 문자열 + BFS 결합 문제였다 DP로도 푸는 거 같았는데 익숙한 BFS로 구현함 차근차근 케이스 따져가면서 푸는게 쉽지많은 않았음
걸린시간 1시간 난이도 5.5/10</p>
</blockquote>
<pre><code class="language-java">
/*
 * softwarecontest
 * 9
 * so
 * ware
 * softftware
 * con
 * conte
 * test
 * t
 * s
 * 
 * queue에 넣어서 가능한 것들 판별 
 * 뒤에서 부터 판별 
 * 
 * depth 1:
 * test -&gt; 가능 replace =&gt; &quot;softwarecon&quot; Q in
 * t -&gt; 가능 replace =&gt; &quot;softwarecontes&quot; Q in
 * 
 * depth 2:
 * con -&gt; 가능 replace =&gt; &quot;software&quot; Q in
 * s -&gt; 가능 replace =&gt; &quot;softwareconte&quot; Q in
 * 
 * depth 3:
 * ware -&gt; 가능 replace =&gt; &quot;soft&quot; Q in
 * ftware -&gt; 가능 replace =&gt; &quot;so&quot; Q in
 * conte -&gt; software set에 의해 걸러짐
 * 
 * 부분 문자열 == 목표 문자열 이면 만들 수 있다 
 * 
 */

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Set;

public class StringCheck {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String target = br.readLine();
        int N = Integer.parseInt(br.readLine());
        Set&lt;String&gt;wordSet = new HashSet&lt;&gt;();

        ArrayList&lt;String&gt; words = new ArrayList&lt;&gt;();

        for (int i = 0; i &lt; N; i++) {
            words.add(br.readLine());
        }

        Queue&lt;String&gt; wordQ = new LinkedList&lt;&gt;();
        wordQ.offer(target);

        //BFS로 접근
        while (!wordQ.isEmpty()) {
            int Qsize = wordQ.size();
            for (int q = 0; q &lt; Qsize; q++) {
                String now = wordQ.poll();
                loop: for (int i = 0; i &lt; N; i++) {
                    int wordSize = words.get(i).length();
                    if(wordSize&gt;now.length())continue;

                    // 끝 글자가 같을 때
                    if (words.get(i).charAt(wordSize - 1) == now.charAt(now.length() - 1)) {
                        //해당글자가 부분문자열이 되는지 확인 
                        for (int j = 1; j &lt;= wordSize; j++) {
                            if (words.get(i).charAt(wordSize - j) != now.charAt(now.length() - j))
                                continue loop;
                        }
                        String newWord = now.substring(0, now.length() - wordSize);

                        //현재 문자열과 부분 문자열이 같다면 가능하다
                        if (now.length() == wordSize ) {
                            System.out.println(1);
                            System.exit(0);
                        }

                        //set에 넣어가면서 중복되는 문자는 추가하지 않는다 
                        if(wordSet.contains(newWord))continue;
                        wordQ.add(newWord);
                        wordSet.add(newWord);
                    }
                }
            }
        }

        System.out.println(0);

    }

}
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 2470 두 용액 (Gold 5)]]></title>
            <link>https://velog.io/@1_kyun/%EB%B0%B1%EC%A4%80-2470-%EB%91%90-%EC%9A%A9%EC%95%A1-Gold-5</link>
            <guid>https://velog.io/@1_kyun/%EB%B0%B1%EC%A4%80-2470-%EB%91%90-%EC%9A%A9%EC%95%A1-Gold-5</guid>
            <pubDate>Wed, 10 May 2023 05:33:09 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/2470">백준 2470 두 용액</a></p>
<blockquote>
<p>이분탐색, 투포인터의 대표적인 문제 아이디어도 금방 떠올랐고 쉽게 풀었음 
걸린시간 15분 난이도 2/10</p>
</blockquote>
<pre><code class="language-java">/*
 * 1. 용액을 정렬 N이 최대 100000이므로 NlogN으로 가능 
 * 2. 양쪽 끝에서 시작 음수이면 앞에서 땡겨오기 양수이면 뒤에서 밀기 =&gt; 최솟값 갱신
 * 3. 0이되면 출력하고 끝내기
 * 4. left_idx == right_idx이면 종료
 */

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class TwoSolution {

    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        int [] solution = new int[N];
        int sol1= 0;
        int sol2= 0;
        int diff = Integer.MAX_VALUE;

        String [] in = br.readLine().split(&quot; &quot;);

        for(int i = 0; i &lt; N; i++) {
            solution[i] = Integer.parseInt(in[i]);
        }

        //배열정렬
        Arrays.sort(solution);

        int left = 0;
        int right = N-1;

        //범위를 넘어가지 않는 선에서 
        while(left &lt; right) {
            int sum = solution[left]+solution[right]; 
            if(Math.abs(sum)&lt;diff) {
                sol1 = solution[left];
                sol2 = solution[right];
                diff = Math.abs(sum);
            }

            if(sum==0) {
                System.out.println(sol1+&quot; &quot;+sol2);
                System.exit(0);
            }
            //음수이면 앞에서 밀어준다
            else if(sum&lt;0) {
                left++;
            }
            //양수이면 뒤에서 민다
            else {
                right--;
            }
        }

        System.out.println(sol1+&quot; &quot;+sol2);
    }
}
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 4811 알약 (Gold 5)]]></title>
            <link>https://velog.io/@1_kyun/%EB%B0%B1%EC%A4%80-4811-%EC%95%8C%EC%95%BD-Gold-5</link>
            <guid>https://velog.io/@1_kyun/%EB%B0%B1%EC%A4%80-4811-%EC%95%8C%EC%95%BD-Gold-5</guid>
            <pubDate>Wed, 10 May 2023 04:56:30 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/4811">백준 4811 알약</a></p>
<blockquote>
<p>생각보다 규칙 찾기 어려웠음, 단순히 주어진 input, output만 보고 식을 구할 수 없는 경우도 생각해야한다. + 어떤 부분이 중복되는지 잘 찾아주자 
걸린시간 40분 난이도 6.5/10</p>
</blockquote>
<pre><code class="language-java">/*
 * 알약 0개 dp[0] = 1
 * 알약 1개 dp[1] = 1
 * 알약 2개 dp[2] = 2
 * 
 * 작은 알약은 경우의 수가 생기지 않음 
 * 큰거 2개 작은 거 1개가 남음 
 * 
 * 작은 알약 -&gt; 큰 알약 -&gt; 큰 알약 
 * 작은 알약을 먹고나면 나머지 큰알약들을 먹는 수와 동일 
 * dp[0]*dp[2] = 2
 * 
 * 큰 알약 먹고 나면 dp[1] 작은 알약 2개 큰 알약 1개 dp[1]가 남음 
 * 큰 알약 -&gt; 작은 알약 -&gt; 큰 알약 
 * dp[1]*dp[1] = 1
 * 
 * 앞에 큰 알약 2개 먹는 거는 dp[2]
 * 큰 알약 -&gt; 큰 알약 -&gt; 작은 알약
 * dp[2]*dp[0] = 2

 */

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Pill {

    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        long [] dp = new long [31];
        dp[0] = 1;
        dp[1] = 1;
        dp[2] = 2;

        for(int i = 3; i &lt; 31; i++) {
            for(int j = 0; j &lt; i; j++) {
                dp[i] += dp[j]*dp[i-j-1];
            }
        }

        while(true) {
            int N = Integer.parseInt(br.readLine());
            if(N==0) {
                bw.flush();
                bw.close();
                System.exit(0);
            }
            bw.write(dp[N]+&quot;\n&quot;);
        }    
    }
}
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 23352 방탈출 (Gold 5)]]></title>
            <link>https://velog.io/@1_kyun/%EB%B0%B1%EC%A4%80-23352-%EB%B0%A9%ED%83%88%EC%B6%9C-Gold-5</link>
            <guid>https://velog.io/@1_kyun/%EB%B0%B1%EC%A4%80-23352-%EB%B0%A9%ED%83%88%EC%B6%9C-Gold-5</guid>
            <pubDate>Wed, 10 May 2023 02:39:25 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/23352">백준 23352 방탈출</a></p>
<blockquote>
<p>전통적인 BFS 문제, 문제 이해는 쉽게 했는데 마지막 조건 처리랑 visited처리로 시간을 좀 날려먹었다.
걸린 시간 45분 난이도 3/10</p>
</blockquote>
<pre><code class="language-java">
/*
 * BFS depth 별로 수행하는 기본문제 
 * 대신 조건에 따라서 depth를 비교해가며 업데이트 해줘야한다
 * 1개만 있을 때 조건 다르게 수행 
 */


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Deque;
import java.util.LinkedList;
import java.util.StringTokenizer;

class Node {
    int x;
    int y;

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

public class EscapeRoom {
    static int N, M;
    static int[][] map;
    static boolean[][] visited;
    static int[] dx = { -1, 1, 0, 0 };
    static int[] dy = { 0, 0, -1, 1 };
    static int answer = 0;
    static int maxDepth = 0;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());

        map = new int[N][M];


        // input 받기
        for (int i = 0; i &lt; N; i++) {
            String[] in = br.readLine().split(&quot; &quot;);
            for (int j = 0; j &lt; M; j++) {
                map[i][j] = Integer.parseInt(in[j]);
            }
        }

        for (int i = 0; i &lt; N; i++) {
            for (int j = 0; j &lt; M; j++) {
                if (map[i][j] == 0)
                    continue;
                bfs(i, j);
            }
        }

        System.out.println(answer);
    }

    public static void bfs(int a, int b) {

        visited = new boolean[N][M];

        int result = map[a][b];
        Deque&lt;Node&gt; q = new LinkedList&lt;&gt;();
        Node start = new Node(a, b);
        q.add(start);
        visited[a][b] = true;

        int depth = 0;
        int max = -1;

        //depth별 BFS
        while (!q.isEmpty()) {
            int size = q.size();
            max = -1;
            depth++;
            for (int n = 0; n &lt; size; n++) {
                Node now = q.poll();
                int x = now.x;
                int y = now.y;
                max = Math.max(max,map[x][y]);
                for (int i = 0; i &lt; 4; i++) {
                    int nx = x + dx[i];
                    int ny = y + dy[i];
                    if (nx &lt; 0 || nx &gt;= N || ny &lt; 0 || ny &gt;= M || map[nx][ny] == 0 || visited[nx][ny])
                        continue;
                    Node newNode = new Node(nx, ny);
                    visited[nx][ny] = true;
                    q.offer(newNode);
                }
            }
        }

        //1칸짜리가 비밀번호가 될 수 있는 경우
        if(maxDepth&lt;=1 &amp;&amp; depth==1) {
            answer =  Math.max(answer,result);
            return;
        }

        //depth가 더 깊은 경우엔 무조건 업데이트 
        if(maxDepth&lt;depth) { 
            maxDepth = depth;
            answer = result+max;
        }
        //depth가 같은 경우엔 최댓값을 업데이트
        else if(maxDepth==depth) {
            answer = Math.max(answer,result+max);
        }

    }
}
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Framework : Vue.js] Vue Router]]></title>
            <link>https://velog.io/@1_kyun/Framework-Vue.js-Vue-Router</link>
            <guid>https://velog.io/@1_kyun/Framework-Vue.js-Vue-Router</guid>
            <pubDate>Wed, 10 May 2023 00:57:36 GMT</pubDate>
            <description><![CDATA[<h1 id="vue-router">Vue-router</h1>
<h2 id="vue-router-1">Vue-router</h2>
<ul>
<li><p>라우팅: 웹 페이지 간의 이동 방법</p>
</li>
<li><p>Vue.js의 공식 라우터 </p>
</li>
<li><p>라우터는 컴포넌트와 매핑 </p>
</li>
<li><p>Vue를 이용한 SPA를 제작할 때 유용</p>
</li>
<li><p>URL에 따라 컴포넌트를 연결하고 설정된 컴포넌트를 보여준다 </p>
</li>
</ul>
</br>

<h2 id="vue-router-연결">Vue-router 연결</h2>
<ul>
<li>&#39;routes&#39; 옵션과 함께 router instance 생성
<img src="https://velog.velcdn.com/images/1_kyun/post/ca41c599-e472-47d3-9f2b-e3f1d01b1b6c/image.png" alt=""></li>
</ul>
<br>

<h2 id="vue-router-이동-및-렌더링">vue-router 이동 및 렌더링</h2>
<ul>
<li><p>네비게이션을 위해 route-link 컴포넌트를 사용</p>
</li>
<li><p>속성은 &#39;to&#39; prop을 사용 </p>
</li>
<li><p>기본적으로 <code>&#39;&lt;router-link&gt;&#39;</code> 는 <code>&#39;&lt;a&gt;&#39;</code> 태그로 렌더링</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/03f34dcd-62d8-4d49-bd8c-004bad260131/image.png" alt=""></p>
<ul>
<li>현재 라우트에 맞는 컴포넌트가 렌더링 된다 </li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/1bd70838-1148-43cb-95c0-04aac67d0f99/image.png" alt=""></p>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/1_kyun/post/7ee8f190-422d-4f4a-a850-7ba6066f4d91/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/1_kyun/post/e8afceb2-ec4e-460a-a787-11888070356b/image.png" alt=""></th>
</tr>
</thead>
</table>
</br>

<ul>
<li>app.js </li>
</ul>
<pre><code class="language-js">// 라우트 컴포넌트
import Main from &#39;./components/Main.js&#39;;
import Board from &#39;./components/Board.js&#39;;
import QnA from &#39;./components/QnA.js&#39;;
import Gallery from &#39;./components/Gallery.js&#39;;

// 라우터 객체 생성
const router = new VueRouter({
  routes: [
    {
      path: &#39;/&#39;,
      component: Main,
    },
    {
      path: &#39;/board&#39;,
      component: Board,
    },
    {
      path: &#39;/qna&#39;,
      component: QnA,
    },
    {
      path: &#39;/gallery&#39;,
      component: Gallery,
    },
  ],
});

// Vue 인스턴트 라우터 주입
const app = new Vue({
  el: &#39;#app&#39;,
  router,
});
</code></pre>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/4da8fa29-80a0-4b46-bfd6-c59d6710f934/image.png" alt=""></p>
</br>

<h2 id="router-route">$router, $route</h2>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/cc9fd72c-11ee-450b-9d13-89c305a354c0/image.png" alt=""></p>
<ul>
<li>board.js </li>
</ul>
<pre><code class="language-js">export default {
  template: `&lt;div&gt;
    자유 게시판
    &lt;ul&gt;
      &lt;li v-for=&quot;i in 5&quot;&gt;
        &lt;router-link :to=&quot;&#39;/board/&#39; + i&quot;&gt;{{i}}번 게시글&lt;/router-link&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/div&gt;`,
};</code></pre>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/1_kyun/post/d1cc240f-e8a4-4ea5-baaa-b6a7538554cf/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/1_kyun/post/c8ed966a-d151-4d41-80d4-afa5980f5b20/image.png" alt=""></th>
</tr>
</thead>
</table>
</br>

<ul>
<li>BoardView.js </li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/6be5576a-3df2-415b-8d53-810a253dfaea/image.png" alt=""></p>
</br>

<h2 id="이름을-가지는-라우트">이름을 가지는 라우트</h2>
<ul>
<li><p>라우트는 연결하거나 탐색을 수행할 때 이름이 있는 라우트를 사용 </p>
</li>
<li><p>Router Instance를 생성하는 동안 routes 옵션에 지정 </p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/ce092c41-aae0-4c78-b26b-730397249f0c/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/3392a792-5ce1-49fc-b7c3-fa9feaca87c5/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/90387741-9d8b-4cb6-b0d4-db23f0189be4/image.png" alt=""></p>
</br>

<h2 id="프로그래밍-방식-라우터">프로그래밍 방식 라우터</h2>
<ul>
<li><code>router-link</code>를 사용하여 선언적 네비게이션 anchor 태그를 만드는 것 외에도 라우터의 instance method를 사용하여 프로그래밍으로 수행</li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/6a604f13-1b46-4d43-acea-785241b681aa/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/c74ef020-244d-480b-b67f-615625e86366/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/71e8526b-7a00-4ff0-888d-aab75f6540a1/image.png" alt=""></p>
</br>

<h2 id="중첩된-라우트">중첩된 라우트</h2>
<ul>
<li><p>앱 UI는 일반적으로 여러 단계로 중첩 된 컴포넌트 구조임 </p>
</li>
<li><p>URL의 세그먼트가 중첩 된 컴포넌트의 특정 구조와 일치하는 것을 활용</p>
</li>
</ul>
</br>

<ul>
<li>등록폼</li>
</ul>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/1_kyun/post/395a3120-ad8b-454d-b2c0-c7e8967005ad/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/1_kyun/post/103f80b7-1b1c-4fef-9399-347cc846d695/image.png" alt=""></th>
</tr>
</thead>
</table>
</br>

<ul>
<li>수정폼</li>
</ul>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/1_kyun/post/bb282394-d6ac-4593-962a-a4fb45ed6f94/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/1_kyun/post/c4546353-08cb-4584-a46c-992a01e0c07c/image.png" alt=""></th>
</tr>
</thead>
</table>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/ba2987de-f629-4e0d-ba40-68ac84d46789/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/2e752fe6-a16f-495a-a5cb-87da3c4b3127/image.png" alt=""></p>
</br>

<h2 id="라우트-리다이렉트">라우트 리다이렉트</h2>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/08903535-0978-4d4d-8cf1-d0b5e2bf3aa3/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Framework : Vue.js] CSS 렌더링 이벤트 컴포넌트]]></title>
            <link>https://velog.io/@1_kyun/Framework-Vue.js-CSS-%EB%A0%8C%EB%8D%94%EB%A7%81-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8</link>
            <guid>https://velog.io/@1_kyun/Framework-Vue.js-CSS-%EB%A0%8C%EB%8D%94%EB%A7%81-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8</guid>
            <pubDate>Wed, 10 May 2023 00:28:49 GMT</pubDate>
            <description><![CDATA[<h1 id="vue-instance-속성---method-filter-computed-watch">Vue Instance 속성 - method, filter, computed, watch</h1>
</br>

<h2 id="vue-method">Vue method</h2>
<ul>
<li><p>Vue Instance는 생성과 관련된 data 및 method 정의 가능 </p>
</li>
<li><p>method 안에서 data를 &quot;this.데이터이름&quot; 으로 접근가능</p>
</li>
</ul>
<pre><code>&lt;body&gt;
    &lt;div id=&quot;app&quot;&gt;
      &lt;div&gt;data : {{message}}&lt;/div&gt;
      &lt;div&gt;method kor : {{helloKor()}}&lt;/div&gt;
      &lt;div&gt;method eng : {{helloEng()}}&lt;/div&gt;
    &lt;/div&gt;
    &lt;script&gt;
      new Vue({
        el: &#39;#app&#39;,
        data: {
          message: &#39;Hello 안녕하세요&#39;,
          name: &#39;홍길동&#39;,
        },
        methods: {
          helloEng() {
            return &#39;Hello &#39; + this.name;
          },
          helloKor() {
            return &#39;안녕 &#39; + this.name;
          },
        },
      });
    &lt;/script&gt;
  &lt;/body&gt;</code></pre><ul>
<li>결과 </li>
</ul>
<pre><code>data : Hello 안녕하세요
method kor : 안녕 홍길동
method eng : Hello 홍길동</code></pre></br>

<h2 id="vue-method-1">Vue method</h2>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/90b75c02-fc14-413e-b2a1-ff3801aa0d3b/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/6656771f-ff3a-49ca-82b7-5b6dfe35efee/image.png" alt=""></p>
</br>

<h2 id="vue-filter">Vue filter</h2>
<ul>
<li><p>뷰의 필터는 화면에 표시되는 텍스트의 형식을 쉽게 변환해주는 기능 </p>
</li>
<li><p>filter를 이용하여 표현식에 새로운 결과 형식을 적용</p>
</li>
<li><p>중괄호 보간법 [{{}}] 또는 v-bind 속성에서 사용이 가능 </p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/50ddb490-0e7f-44d1-8b0b-9cf756bd7404/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/9480a9fc-c0bf-4ffd-8ca3-ed2f28db051b/image.png" alt=""></p>
</br>

<h2 id="vue-filter-사용-예">Vue filter 사용 예</h2>
<ul>
<li>천단위마다 &#39;,&#39; 찍기 전화 번호에 &#39;-&#39; 넣기 </li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/383df2d9-8593-4b27-8a13-040b83e27256/image.png" alt=""></p>
</br>

<h2 id="vue-computed-속성">Vue computed 속성</h2>
<ul>
<li><p>특정 데이터의 변경사항을 실시간으로 처리 </p>
</li>
<li><p>캐싱을 이용하여 데이터의 변경이 없을 경우 캐싱된 데이터를 반환. &gt;&gt; 값</p>
</li>
<li><p>Setter와 Getter를 직접 지정할 수 있음 </p>
</li>
<li><p>작성은 method 형태로 작성하면서 Vue에서 proxy 처리하여 property처럼 사용 </p>
</li>
</ul>
</br>

<pre><code class="language-java">&lt;body&gt;
  &lt;div id=&quot;app&quot;&gt;
    &lt;input type=&quot;text&quot; v-model=&quot;message&quot; /&gt;
    &lt;p&gt;원본 메시지: &quot;{{ message }}&quot;&lt;/p&gt;
    &lt;p&gt;역순으로 표시한 메시지1: &quot;{{ reversedMsg }}&quot;&lt;/p&gt;
    &lt;p&gt;역순으로 표시한 메시지2: &quot;{{ reversedMsg }}&quot;&lt;/p&gt;
    &lt;p&gt;역순으로 표시한 메시지3: &quot;{{ reversedMsg }}&quot;&lt;/p&gt;
  &lt;/div&gt;
  &lt;script&gt;
    var vm = new Vue({
      el: &#39;#app&#39;,
      data: {
        message: &#39;안녕하세요 여러분&#39;,
      },
      computed: {
        reversedMsg: function () {
          console.log(&#39;꺼꾸로 찍기&#39;);
          return this.message.split(&#39;&#39;).reverse().join(&#39;&#39;);
        },
      },
    });
  &lt;/script&gt;
&lt;/body&gt;</code></pre>
</br>

<pre><code>안녕하세요 여러분
원본 메시지: &quot;안녕하세요 여러분&quot;

역순으로 표시한 메시지1: &quot;분러여 요세하녕안&quot;

역순으로 표시한 메시지2: &quot;분러여 요세하녕안&quot;

역순으로 표시한 메시지3: &quot;분러여 요세하녕안&quot;

----------------------------------------
거꾸로 찍기
test21.html:61 Live reload enabled.</code></pre></br>

<pre><code>&lt;body&gt;
  &lt;div id=&quot;app&quot;&gt;
    &lt;input type=&quot;text&quot; v-model=&quot;message&quot; /&gt;
    &lt;p&gt;원본 메시지: &quot;{{ message }}&quot;&lt;/p&gt;
    &lt;p&gt;역순으로 표시한 메시지1: &quot;{{ reversedMsg() }}&quot;&lt;/p&gt;
    &lt;p&gt;역순으로 표시한 메시지2: &quot;{{ reversedMsg() }}&quot;&lt;/p&gt;
    &lt;p&gt;역순으로 표시한 메시지3: &quot;{{ reversedMsg() }}&quot;&lt;/p&gt;
  &lt;/div&gt;
  &lt;script&gt;
    var vm = new Vue({
      el: &#39;#app&#39;,
      data: {
        message: &#39;안녕하세요 여러분&#39;,
      },
      methods: {
        reversedMsg: function () {
          console.log(&#39;꺼꾸로 찍기&#39;);
          return this.message.split(&#39;&#39;).reverse().join(&#39;&#39;);
        },
      },
    });
  &lt;/script&gt;
&lt;/body&gt;</code></pre><pre><code>안녕하세요 여러분
원본 메시지: &quot;안녕하세요 여러분&quot;

역순으로 표시한 메시지1: &quot;분러여 요세하녕안&quot;

역순으로 표시한 메시지2: &quot;분러여 요세하녕안&quot;

역순으로 표시한 메시지3: &quot;분러여 요세하녕안&quot;

test21_1.html:27 거꾸로 찍기 3번 실행 
test21_1.html:61 Live reload enabled.</code></pre><table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/1_kyun/post/871bfbbd-c7dd-44f9-bae5-d33ec6539edd/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/1_kyun/post/d077399f-7bcb-4eae-8106-d502389bff91/image.png" alt=""></th>
</tr>
</thead>
</table>
</br>

<h2 id="vue-watch-속성">Vue watch 속성</h2>
<ul>
<li>Vue Instance의 특정 property가 변경될 때 실행할 콜백 함수 설정 </li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/390a1573-ac39-4906-8873-bfa3c5877ec7/image.png" alt=""></p>
<pre><code>원본 메시지: &quot;Hello Everyone&quot;

역순으로 표시한 메시지: &quot;enoyrevE olleH&quot;

Hello Everyone</code></pre><ul>
<li><p>Computed는 종속된 data가 변경되었을 경우 그 data를 다시 계산하여 캐싱한다 </p>
</li>
<li><p>Watch의 경우는 data가 변경되었을 경우 다른 data를 변경하는 작업을 한다 </p>
</li>
</ul>
</br>

<h2 id="vue-event">Vue Event</h2>
<ul>
<li><p>DOM Event를 청취하기 위해 v-on directive 사용</p>
</li>
<li><p>inline event handling</p>
</li>
<li><p>method를 이용한 event handling</p>
</li>
</ul>
</br>

<h3 id="vue-event-청취-v-on">Vue Event 청취: v-on</h3>
<ul>
<li>v-on directive를 사용하여 DOM 이벤트를 듣고 트리거 될 때 JavaScript를 실행할 수 있다</li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/3c85e8ac-a365-4d74-972f-67e669a9f928/image.png" alt=""></p>
</br>

<h2 id="method-event-handler">method event handler</h2>
<ul>
<li>이벤트 발생시 처리 로직을 v-on에 넣기 힘들다. 이 때문에 v-on에서는 이벤트 발생시 처리해야 하는 method의 이름을 받아 처리</li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/9030fe9f-2499-44c0-b943-ead9ebcea039/image.png" alt=""></p>
</br>

<h2 id="inline-method-handler">Inline method handler</h2>
<ul>
<li><p>메소드 이름을 직접 바인딩 하는 대신 인라인 JavaScript 구문에 메소드를 사용할 수도 있다 </p>
</li>
<li><p>원본 DOM 이벤트에 엑세스 해야 하는 경우 특별한 $event 변수를 사용해 메소드에 전달할 수도 있다 </p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/7a53710c-30ab-46cc-bbc9-11d04b46f75c/image.png" alt=""></p>
</br>

<h2 id="이벤트-수식어-event-modifier">이벤트 수식어 (Event Modifier)</h2>
<ul>
<li><p>method 내에서 작업도 가능하지만 method는 DOM의 이벤트를 처리하는 것 보다 data 처리를 위한 로직만 작업하는 것이 좋다 </p>
</li>
<li><p>이 문제를 해결하기 위해 Vue는 v-on 이벤트에 이벤트 수식어를 제공한다 </p>
</li>
<li><p>수식어는 점으로 표시된 접미사이다 </p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/121d39f4-b248-41bc-b17a-f1eda35baf58/image.png" alt=""></p>
</br>

<p><img src="https://velog.velcdn.com/images/1_kyun/post/16c2fdc0-7791-471b-9ab0-57843e9f4ee9/image.png" alt=""></p>
</br>

<h2 id="키-수식어-key-modifier">키 수식어 (Key Modifier)</h2>
<ul>
<li>Vue는 이벤트를 수신할 때 v-on에 대한 키 수식어를 추가할 수 있다 </li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/f4b0669f-b8c8-43e0-86f8-c4baf924639b/image.png" alt=""></p>
</br>

<p><img src="https://velog.velcdn.com/images/1_kyun/post/0ec847a0-a89b-4f57-9da4-30361e491cff/image.png" alt=""></p>
</br>

<h2 id="ref-refs">ref, $refs</h2>
<ul>
<li><p>뷰에서는 $refs 속성을 이용해 DOM에 접근할 수 있다 </p>
</li>
<li><p>단, 뷰의 가장 중요한 목적 중 하나는 개발자가 DOM을 다루지 않게 하는 것이므로, 되도록 ref를 사용하는 것을 피하는 것이 좋다 </p>
</li>
</ul>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/1_kyun/post/dc1d3633-6abd-4261-b530-f1842f981b34/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/1_kyun/post/d1ffdcf0-05da-4b44-b909-b4a5dd7a6b95/image.png" alt=""></th>
</tr>
</thead>
</table>
</br>


<h1 id="css-class-binding">CSS class binding</h1>
<h2 id="class-binding">class binding</h2>
<ul>
<li><p>element의 class와 style을 변경 </p>
</li>
<li><p>v-bind:class는 조건에 따라 class를 적용할 수 있다</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/25468409-7af1-46ff-920f-d329355c2e5e/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/023ad69a-ebd1-41fe-9674-da6d746934d0/image.png" alt=""></p>
</br>

<h1 id="form-input-binding">form input binding</h1>
<h2 id="폼-입력-바인딩">폼 입력 바인딩</h2>
<ul>
<li><p>v-model directive를 사용하여 폼 input과 textarea element에 양방향 데이터 바인딩을 생성할 수 있다 </p>
<ul>
<li><p>text와 textarea 태그는 value 속성과 input 이벤트를 사용한다 </p>
</li>
<li><p>체크박스들과 라디오 버튼들은 checked 속성과 change이벤트를 사용한다 </p>
</li>
<li><p>Select 태그는 value를 prop으로, change를 이벤트로 사용한다</p>
</li>
</ul>
</li>
</ul>
</br>


<h3 id="form-text-textarea">form-text, textarea</h3>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/65904686-3e57-46c4-869a-e01109446b37/image.png" alt=""></p>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/1_kyun/post/740b370f-ad04-489d-8f60-2cd36f72de03/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/1_kyun/post/cf2c8444-9c9d-48bd-bedc-a0558959f70c/image.png" alt=""></th>
</tr>
</thead>
</table>
</br>

<h3 id="form-checkbox">form-checkbox</h3>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/da8132ff-7a71-493f-90ac-4a82c14adc9e/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/2c7c716c-b068-450e-8e39-59bad963979d/image.png" alt=""></p>
</br>

<h3 id="form-radio">form-radio</h3>
<ul>
<li>radio의 경우 선택된 항목의 value 속성의 값을 관리</li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/0b68b4c0-080e-47b4-bf1d-0762650ddbbb/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/a5e36735-512a-4151-8abe-5e7c2f20befe/image.png" alt=""></p>
</br>

<h3 id="form---select">form - select</h3>
<ul>
<li><p>select box일 경우 선택된 항목의 value 속성의 값을 관리 </p>
</li>
<li><p>v-model 표현식의 초기 값이 어떤 옵션에도 없으면 <code>&lt;select&gt;</code> element는 선택없음 상태로 렌더링 된다 </p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/45ccc1fe-8137-4cfb-b87b-43bfbf998c83/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/59a77491-867a-44f8-beac-9a822c912c5b/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/1320c93a-90f9-49df-8e02-81c1f96c8ff0/image.png" alt=""></p>
<ul>
<li>v-for를 이용한 동적 option 렌더링 </li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/a85db7cb-4d33-454f-8c8b-676c2f138573/image.png" alt=""></p>
</br>

<h3 id="form---수식어">form - 수식어</h3>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/7c4f0c8d-3ad0-483c-871f-8573a801fe37/image.png" alt=""></p>
</br>

<h1 id="component">Component</h1>
<h2 id="컴포넌트">컴포넌트</h2>
<ul>
<li><p>Vue의 가장 강력한 기능 중 하나</p>
</li>
<li><p>HTML Element를 확장하여 재사용 가능한 코드를 캡슐화 </p>
</li>
<li><p>Vue Component는 Vue Instance이기도 하기 때문에 모든 옵션 객체를 사용 가능 </p>
</li>
<li><p>Life Cycle Hook 사용 가능 </p>
</li>
<li><p>전역 컴포넌트와 지역 컴포넌트 </p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/d783427b-ea99-419a-b34a-dcc3f8a2db58/image.png" alt=""></p>
</br>

<h2 id="전역-컴포넌트-등록">전역 컴포넌트 등록</h2>
<ul>
<li><p>전역 컴포넌트를 등록하려면 Vue.component(tagName, options)를 사용 </p>
</li>
<li><p>권장하는 컴포넌트 이름: 케밥 표기법(전부 소문자 -)</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/a94aa8fc-740a-4f40-9667-da795d211dd1/image.png" alt=""></p>
<br>

<h2 id="지역-컴포넌트-등록">지역 컴포넌트 등록</h2>
<ul>
<li>컴포넌트를 Components 인스턴스 옵션으로 등록함으로써 다른 인스턴스/컴포넌트 범위에서만 사용할 수 있는 컴포넌트를 만들 수 있다</li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/6283bc0a-3eb1-465c-9c3d-00b57a41e645/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/33843dc8-7e3f-4f32-b3eb-503cc6d916a2/image.png" alt=""></p>
<br>

<h2 id="component-template">Component Template</h2>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/2516c0a5-8fae-4339-ade3-9d8cb9349620/image.png" alt=""></p>
<br>

<h2 id="component-data-공유-문제--해결">Component data 공유 문제 &amp; 해결</h2>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/093a4033-ce80-43dc-a916-2d977f2bce64/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/35c2559c-7345-4bd6-9afc-ad40630f3199/image.png" alt=""></p>
</br>
</br>

<h1 id="component간-통신">Component간 통신</h1>
<h2 id="컴포넌트간-통신">컴포넌트간 통신</h2>
<ul>
<li><p>상위(부모)-하위(자식) 컴포넌트 간의 data 전달 방법</p>
</li>
<li><p>부모에서 자식: props라는 특별한 속성을 전달 (Pass Props)</p>
</li>
<li><p>자식에서 부모: event로만 전달 가능 (Emit Event)</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/ec86eff5-992d-4590-a0e9-07d018fe9527/image.png" alt=""></p>
</br>

<h2 id="상위에서-하위-컴포넌트로-data-전달">상위에서 하위 컴포넌트로 data 전달</h2>
<ul>
<li><p>하위 컴포넌트는 상위 컴포넌트의 값을 직접 참조 불가능 </p>
</li>
<li><p>data와 마찬가지로 props 속성의 값을 template에서 사용이 가능 </p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/87cd00c2-0638-41f1-ac83-ca2e775d7d47/image.png" alt=""></p>
</br>


<h2 id="literal-props">Literal props</h2>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/ae73536b-3a03-47d6-b595-7ade94ccb1af/image.png" alt=""></p>
</br>

<h2 id="랜더링-과정">랜더링 과정</h2>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/e4af5924-d2fe-4162-ac6e-a1746045eda9/image.png" alt=""></p>
</br>

<h2 id="동적-props">동적 props</h2>
<ul>
<li><p>v-bind를 사용하여 부모의 데이터에 props를 동적으로 바인딩 할 수 있다</p>
</li>
<li><p>데이터가 상위에서 업데이트 될 때 마다 하위 데이터로도 전달 된다 </p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/8150e74b-c822-411c-86e4-73d2d1e30519/image.png" alt=""></p>
<ul>
<li>v-bind에 대한 단축 구문을 사용하는 것이 더 간단함 </li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/cbf08885-d1e1-4c9f-b678-7225f5a768c9/image.png" alt=""></p>
<pre><code class="language-javascript">
&lt;div id=&quot;app&quot;&gt;
    &lt;child-comp area=&quot;부산&quot; v-bind:msg=&quot;msg[parseInt(Math.random() * 5)]&quot;&gt;&lt;/child-comp&gt;
    &lt;child-comp area=&quot;광주&quot; v-bind:msg=&quot;msg[parseInt(Math.random() * 5)]&quot;&gt;&lt;/child-comp&gt;
    &lt;child-comp area=&quot;구미&quot; v-bind:msg=&quot;msg[parseInt(Math.random() * 5)]&quot;&gt;&lt;/child-comp&gt;
    &lt;child-comp area=&quot;대전&quot; v-bind:msg=&quot;msg[parseInt(Math.random() * 5)]&quot;&gt;&lt;/child-comp&gt;
    &lt;child-comp area=&quot;서울&quot; v-bind:msg=&quot;msg[parseInt(Math.random() * 5)]&quot;&gt;&lt;/child-comp&gt;
  &lt;/div&gt;
  &lt;template id=&quot;childcomp&quot;&gt;
    &lt;div&gt;
      &lt;h2&gt; {{area}} {{msg}}&lt;/h2&gt;
    &lt;/div&gt;
  &lt;/template&gt;
  &lt;script&gt;
    Vue.component(&quot;child-comp&quot;, {
      props: [&quot;area&quot;, &quot;msg&quot;],
      template: &quot;#childcomp&quot;,
    });
    new Vue({
      el: &quot;#app&quot;,
      data: {
        msg: [&quot;굿^^&quot;, &quot;최고!!&quot;, &quot;실화냐?&quot;, &quot;좋아요*&quot;, &quot;짱!!&quot;],
      },
    });
  &lt;/script&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/7030869f-de27-4a7d-ad18-413de288fd3b/image.png" alt=""></p>
</br>
</br>

<pre><code class="language-javascript">&lt;div id=&quot;app&quot;&gt;
    &lt;child-comp v-for=&quot;(area, i) in areas&quot; :key=&quot;i&quot; :area=&quot;area&quot; 
                        v-bind:msg=&quot;msg[parseInt(Math.random() * 5)]&quot;&gt;
    &lt;/child-comp&gt;
  &lt;/div&gt;
  &lt;template id=&quot;childcomp&quot;&gt;
    &lt;div&gt;
      &lt;h2&gt; {{area}}지역 {{msg}}&lt;/h2&gt;
    &lt;/div&gt;
  &lt;/template&gt;
  &lt;script&gt;
    Vue.component(&quot;child-comp&quot;, {
      props: {
        area: String,
        msg: {
          type: String,
          require: true,
        },
      },
      template: &quot;#childcomp&quot;,
    });
    new Vue({
      el: &quot;#app&quot;,
      data: {
        areas: [&quot;부산&quot;, &quot;광주&quot;, &quot;구미&quot;, &quot;대전&quot;, &quot;서울&quot;],
        msg: [&quot;굿^^&quot;, &quot;최고!!&quot;, &quot;실화냐?&quot;, &quot;좋아요*&quot;, &quot;짱!!&quot;],
      },
    });
  &lt;/script&gt;</code></pre>
</br>

<h2 id="객체의-속성properties전달-props">객체의 속성(properties)전달 props</h2>
<ul>
<li>오브젝트의 모든 속성을 전달 할 경우, v-bind:prop-name 대신 v-bind 만 작성함으로써 모든 속성을 prop으로 전달할 수 있다 </li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/9ff3eff2-a022-40ac-9b5d-6985d96c3bef/image.png" alt=""></p>
</br>

<p><img src="https://velog.velcdn.com/images/1_kyun/post/7ed553d8-7563-4b50-8f04-ba00991a05ac/image.png" alt=""></p>
</br>

<h2 id="사용자-정의-이벤트">사용자 정의 이벤트</h2>
<ul>
<li><p>이벤트 이름</p>
<ul>
<li>컴포넌트 및 props와는 달리, 이벤트는 자동 대소문자 변환을 제공하지 않는다. </br></li>
<li>대소문자를 혼용하는 대신에 emit할 정확한 이벤트 이름을 작성하는 것을 권장 </br></li>
<li>v-on 이벤트 리스너는 항상 자동으로 소문자 변환되기 때문에 v-on:myEvent는 자동으로 v-on:myevent로 변환 된다. 이름이 my-event일 경우 myEvent 이벤트를 들을 수 없다 </br></li>
<li>이러한 이유로, 이벤트 이름에는 kebab-case를 사용하는 것이 권장됨</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/6be7ac22-edbf-49cc-a9b2-101bff1a9994/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/e026a2e2-db8a-4123-81be-f44591230e75/image.png" alt=""></p>
<br>

<h2 id="하위에서-상위-컴포넌트로-event-전달">하위에서 상위 컴포넌트로 event 전달</h2>
<ul>
<li><p>하위 컴포넌트에서 상위 컴포넌트가 지정한 이벤트를 발생($emit)</p>
</li>
<li><p>상위 컴포넌트는 하위 컴포넌트가 발생한 이벤트를 수신(on)하여 data처리 </p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/cc37100c-1c17-4fdc-81a9-d4365a9479b2/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/f6d10d4b-8be7-4c16-93f9-1da46ae06f35/image.png" alt=""></p>
</br>

<h2 id="비-상하위간-통신">비 상하위간 통신</h2>
<ul>
<li><p>비어 있는 Vue Instance 객체를 Event Bus로 사용 </p>
</li>
<li><p>복잡해질 경우 상태관리 라이브러리인 Vuex 사용 권장 </p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/4f449d63-bd46-4987-bf17-563385fff0d1/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/9c40a029-a521-4090-9b28-ecb4ac46bc47/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/1_kyun/post/4eaae72d-f3c8-4668-801c-8e16c5e39c62/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 2212 센서 (Gold 5)]]></title>
            <link>https://velog.io/@1_kyun/%EB%B0%B1%EC%A4%80-2212-%EC%84%BC%EC%84%9C-Gold-5</link>
            <guid>https://velog.io/@1_kyun/%EB%B0%B1%EC%A4%80-2212-%EC%84%BC%EC%84%9C-Gold-5</guid>
            <pubDate>Tue, 09 May 2023 08:47:17 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>생각보다 아이디어 생각해내는데 조금 오래 걸림 -&gt; 문제 해석에 시간이 걸림 문제 구현 난이도 자체는 쉬운편 
걸린시간 40분  난이도 5/10</p>
</blockquote>
<pre><code class="language-java">/*
    만약에 집중국의 수가 센서수보다 많으면 0이 나온다 
    중복되는 센서 처리 해주기 (처음 초기화 할 때)
    집중국 갯수-1개 많큼 거리를 무시해줄 수 있다 

    original 1 3 6 7 9     
    diff     2 3 1 2  여기서 집중국이 2개 -&gt; 최댓값 1개 제외가능 

    original 3 6 7 8 10 12 14 15 18 20
    diff      3 1 1 2 2 2 1 3 2 집중국이 5개 -&gt; 최댓값 4개 제외가능 
    sum(dif) = 17 - 10 = 7
 */

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Sensor {

    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        int K = Integer.parseInt(br.readLine());

        int[] nums = new int[N];
        int[] diff = new int[N-1];

        if(N&lt;=K) {
            System.out.println(0);
            System.exit(0);
        }

        String [] input = br.readLine().split(&quot; &quot;);
        for(int i = 0; i &lt; N; i++) {
            nums[i] = Integer.parseInt(input[i]);
        }


        Arrays.sort(nums);

        for(int i = 1; i&lt; N; i++) {
            diff[i-1] = nums[i] - nums[i-1];
        }

        Arrays.sort(diff);

        int sum = 0;
        for(int i = 0; i &lt; (N-1)-(K-1); i++) {
            sum+=diff[i];
        }

        System.out.println(sum);
    }

}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 1956 운동 (Gold 4)]]></title>
            <link>https://velog.io/@1_kyun/%EB%B0%B1%EC%A4%80-1956-%EC%9A%B4%EB%8F%99-Gold-4</link>
            <guid>https://velog.io/@1_kyun/%EB%B0%B1%EC%A4%80-1956-%EC%9A%B4%EB%8F%99-Gold-4</guid>
            <pubDate>Tue, 09 May 2023 02:12:20 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>간선이 양수인 그래프에서 최단 사이클을 찾는 문제 -&gt; 플로이드 워셜
구현도 간단하고 시간도 얼마 안 걸림 
걸린시간 20분, 난이도 2.5/10</p>
</blockquote>
<pre><code class="language-java">/*
 * 다익스트라의 경우 한 지점에서 다른 특정 지점까지의 최단 경로를 구하는 알고리즘이다. 
 * 그러나 모든 지점에서 다른 모든 지점까지의 최단 경로를 모두 구해야하는 경우 플로이드 워셜 알고리즘 이용
 * 이 문제는 싸이클을 구해야하니까 MST (x), n to n 최소거리, 간선은 양수 FW이용
 * 만약에 음수인 간선이 존재했다면 Bellman-Ford를 이용해야함 
 */

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Exercise {
    static int INF = 10000000;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());    
        int V = Integer.parseInt(st.nextToken());
        int E = Integer.parseInt(st.nextToken());

        int[][] adj = new int[V+1][V+1];

        for(int i = 0; i &lt; V+1; i++) {
            for(int j = 0; j &lt; V+1; j++) {
                adj[i][j] = INF;
            }
        }

        //인접리스트 초기화 
        for(int i = 0; i &lt; E; i++) {
            st = new StringTokenizer(br.readLine());
            int s = Integer.parseInt(st.nextToken());
            int e = Integer.parseInt(st.nextToken());
            int c = Integer.parseInt(st.nextToken());
            adj[s][e] = c;
        }


        //플로이드 워셜
        for(int i = 1; i &lt; V+1; i++) {
            for(int j = 1; j &lt; V+1; j++) {
                for(int k = 1; k &lt; V+1; k++) {
                    adj[j][k] = Math.min(adj[j][k],adj[j][i]+adj[i][k]);
                }
            }
        }

        //사이클을 찾는 문제이므로 1-&gt;1 2-&gt;2 ... n -&gt; n인 경우를 찾는다 
        int result = INF;
        for(int i = 1; i &lt; V+1; i++) {
            result = Math.min(result, adj[i][i]);
        }

        if(result==INF)System.out.println(-1);
        else System.out.println(result);
    }
}</code></pre>
]]></description>
        </item>
    </channel>
</rss>