<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>dev-arden.log</title>
        <link>https://velog.io/</link>
        <description>잘하자</description>
        <lastBuildDate>Sun, 05 Mar 2023 07:33:53 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>dev-arden.log</title>
            <url>https://velog.velcdn.com/images/dev-arden/profile/1e8c0b6a-d63d-42b7-b0d7-6e71ccb4dea7/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. dev-arden.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dev-arden" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[프로그래머스]혼자서 하는 틱택토]]></title>
            <link>https://velog.io/@dev-arden/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%ED%98%BC%EC%9E%90%EC%84%9C-%ED%95%98%EB%8A%94-%ED%8B%B1%ED%83%9D%ED%86%A0</link>
            <guid>https://velog.io/@dev-arden/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%ED%98%BC%EC%9E%90%EC%84%9C-%ED%95%98%EB%8A%94-%ED%8B%B1%ED%83%9D%ED%86%A0</guid>
            <pubDate>Sun, 05 Mar 2023 07:33:53 GMT</pubDate>
            <description><![CDATA[<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/160585">https://school.programmers.co.kr/learn/courses/30/lessons/160585</a></p>
<p>문제 : 틱택토에서 실수를 했던, 안했던 그 결과가 규칙에 맞는지 아닌지 판단하기</p>
<p>해결 방법 :</p>
<ol>
<li>9칸짜리 보드에서 &#39;O&#39;의 개수, &#39;X&#39;의 개수, &#39;.&#39;의 개수 검사</li>
<li>9칸짜리 보드에서 가로/세로/대각선으로 &quot;OOO&quot;, &quot;XXX&quot;인지 검사</li>
<li>선공인 &#39;O&#39;가 이겼을 때와 후공인 &#39;X&#39;가 이겼을 때로 구분</li>
</ol>
<ul>
<li>선공과 후공이 동시에 이겼다면 규칙에 안맞음</li>
<li>선공이 이겼을 때 후공의 개수는 선공보다 하나 적어야 함</li>
<li>후공이 이겼을 때 선공의 개수는 후공보다 하나 많거나 똑같아야 함</li>
<li>둘다 이기지 못했을 때 선공의 개수는 후공보다 하나 많거나 똑같아야 함</li>
</ul>
<p>4.예외로 빈칸이 9개일 때는 규칙에 맞고 굳이 다 검사할 필요 없어서 바로 리턴</p>
<pre><code>class Solution {
    public int solution(String[] board) {
        int answer = -1;
        int onum = 0, xnum = 0, empty = 0;
        boolean owin = false, xwin = false;

        for(int i=0;i&lt;3;i++){
            for(int j=0;j&lt;3;j++){
                if(board[i].charAt(j) ==&#39;O&#39;){
                    onum++;
                }else if(board[i].charAt(j) ==&#39;X&#39;){
                    xnum++;
                }else{
                    empty++;
                }
            }
        }


        if(empty == 9){
            answer = 1;
            return answer;
        }

        // 가로 세로 승자 확인
        for(int i=0;i&lt;3;i++){
            if(board[i].equals(&quot;OOO&quot;)){
                owin = true;
            }
            if(board[0].charAt(i) == &#39;O&#39; &amp;&amp; board[1].charAt(i) == &#39;O&#39;){
                if(board[2].charAt(i) == &#39;O&#39;){
                    owin = true;
                }
            }
            if(board[i].equals(&quot;XXX&quot;)){
                xwin = true;
            }
            if(board[0].charAt(i) == &#39;X&#39; &amp;&amp; board[1].charAt(i) == &#39;X&#39;){
                if(board[2].charAt(i) == &#39;X&#39;){
                    xwin = true;
                    System.out.println(&quot;is&quot;);
                }
            }
        }
        //대각선 승자 확인
        if(board[0].charAt(0) == &#39;O&#39; &amp;&amp; board[1].charAt(1) == &#39;O&#39;){
            if(board[2].charAt(2) == &#39;O&#39;){
                owin = true;
            }
        }
        if(board[0].charAt(2) == &#39;O&#39; &amp;&amp; board[1].charAt(1) == &#39;O&#39;){
            if(board[2].charAt(0) == &#39;O&#39;){
                owin = true;
            }
        }
        if(board[0].charAt(0) == &#39;X&#39; &amp;&amp; board[1].charAt(1) == &#39;X&#39;){
            if(board[2].charAt(2) == &#39;X&#39;){
                xwin = true;
            }
        }  
        if(board[0].charAt(2) == &#39;X&#39; &amp;&amp; board[1].charAt(1) == &#39;X&#39;){
            if(board[2].charAt(0) == &#39;X&#39;){
                xwin = true;
            }
        }


        if(owin == true &amp;&amp; xwin == true){
            answer = 0;
        } else if(owin == true &amp;&amp; xwin == false){
            if(onum - xnum == 1){
                answer = 1;
            }else{
                answer = 0;
            }
        } else if(owin == false &amp;&amp; xwin == true){
            if(onum - xnum == 0){
                answer = 1;
            } else {
                answer = 0;
            }
        } else{
            if(onum - xnum == 0 || onum - xnum == 1){
                answer = 1;
            } else{
                answer = 0;
            }
        }

        return answer;
    }
}</code></pre><ul>
<li>여기서 한참 헤맨 이유. 세로 체크할 때 코드를 아래와 같이 잘못 짬. 그래서 뭐가 틀린건 지 한참 고민하다가 테스트 케이스 추가하면서 확인해봤다.<pre><code>if(board[i].charAt(0) == &#39;O&#39; &amp;&amp; board[i].charAt(0) == &#39;O&#39;){
     if(board[i].charAt(2) == &#39;O&#39;){
         owin = true;
     }
}</code></pre></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[HackerRank]Breadth First Search: Shortest Reach]]></title>
            <link>https://velog.io/@dev-arden/HackerRankBreadth-First-Search-Shortest-Reach</link>
            <guid>https://velog.io/@dev-arden/HackerRankBreadth-First-Search-Shortest-Reach</guid>
            <pubDate>Wed, 22 Feb 2023 04:51:25 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.hackerrank.com/challenges/bfsshortreach/problem">https://www.hackerrank.com/challenges/bfsshortreach/problem</a>
하... 이 글 진짜 쓰고 싶었다.
왜냐하면 너무 어려웠기 때문이다.</p>
<p>우선 BFS 문제를 백준에서 푼 적이 있었고 단순하게 방문 노드만 체크하면 된다고 생각했다.
하지만 여기서의 포인트는 BFS의 level을 따지는 것이었다.</p>
<p>백준에서 풀었던 과거 코드까지 되돌아보게 된 계기가 되었다.</p>
<p>우선 나의 원래 코드는 아래와 같다</p>
<pre><code>import java.io.*;
import java.util.*;

public class Main{
    static Queue&lt;Integer&gt; bq = new LinkedList&lt;&gt;();
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

    public static void print_bq(Queue&lt;Integer&gt; bq) throws Exception{
        while(!bq.isEmpty()) {
            bw.write(bq.poll() + &quot; &quot;);
        }
        bw.write(&quot;\n&quot;);
    }

    public static void bfs(ArrayList&lt;ArrayList&lt;Integer&gt;&gt; adj, boolean[] visited, Queue&lt;Integer&gt; q, int N, int M) {
        //종료조건
        if(N &lt;= M) {
            if(bq.size() == N) return ;
        } else {
            if(bq.size() == M+1) return ;
        }

        int front = q.peek();
        //예외처리 : 시작점이 간선이 없는 정점일 때 
        if(adj.get(front).size() == 0) {
            bq.add(front);
            return ;
        }

        if(visited[front] != true) {
            q.poll();
            bq.add(front);
            visited[front] = true;

            for(int i=0;i&lt;adj.get(front).size();i++) {
                if(visited[adj.get(front).get(i)] != true) {
                    q.add(adj.get(front).get(i));
                }
            }
        } 
        else {
            q.poll();
        }

        bfs(adj, visited, q, N, M);
    }



    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        int V = Integer.parseInt(st.nextToken());
        boolean[] visited = new boolean[N+1];
        Queue&lt;Integer&gt; q = new LinkedList&lt;&gt;();

        //인접리스트
        ArrayList&lt;ArrayList&lt;Integer&gt;&gt; adj = new ArrayList&lt;ArrayList&lt;Integer&gt;&gt;();
        //인접리스트 생성
        for(int i=0;i&lt;=N;i++) {
            adj.add(new ArrayList&lt;Integer&gt;());
        }
        //인접리스트 구현
        for(int i=0;i&lt;M;i++) {
            st = new StringTokenizer(br.readLine());
            int val1 = Integer.parseInt(st.nextToken());
            int val2 = Integer.parseInt(st.nextToken());
            adj.get(val1).add(val2);
            adj.get(val2).add(val1);
        }


        //인접리스트 정렬
        for(int i=0;i&lt;=N;i++) {
            Collections.sort(adj.get(i));
        }

        //call bfs
        q.add(V);
        bfs(adj, visited, q, N, M);
        print_bq(bq);

        br.close();
        bw.flush();
        bw.close();
    }
}</code></pre><p>이 코드에서 레벨을 구해주면 된다고 생각했지만, 나의 코드 자체가 레벨을 구하기에 상당히 지저분한 코드였다ㅋ..</p>
<p>그래서 결국은 q에 추가된 크기만큼 레벨을 구해주면 된다는 아이디어엔 접근했지만 내 코드를 수정하는 걸론 불가능했다.
구글링 결과 매우 심플한 bfs 코드를 봤고 정말 배우는 시간이었다.</p>
<p>열심히 알고리즘 공부해야겠다. 정말 공부된다.</p>
<p><img src="https://velog.velcdn.com/images/dev-arden/post/3988d895-3490-463b-81f5-c26724cbfcea/image.png" alt="">
뿌 듯</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[HackerRank]Pairs]]></title>
            <link>https://velog.io/@dev-arden/HackerRankPairs</link>
            <guid>https://velog.io/@dev-arden/HackerRankPairs</guid>
            <pubDate>Sun, 19 Feb 2023 06:59:04 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.hackerrank.com/challenges/pairs/problem">https://www.hackerrank.com/challenges/pairs/problem</a>
목테스트 중 시간 내에 바로 풀었던 문제.
하지만 정답을 맞추지는 못했다.</p>
<p>몇 개의 테스트 코드에서 시간 제한에 걸렸기 때문이다.</p>
<p>코드를 바꿔서 다시 도전해봤지만 계속 시간 제한에 걸림.</p>
<p>구글링 결과 -&gt; 자료구조의 문제.
<a href="https://developyo.tistory.com/114">https://developyo.tistory.com/114</a>
<a href="https://www.baeldung.com/java-hashset-arraylist-contains-performance">https://www.baeldung.com/java-hashset-arraylist-contains-performance</a></p>
<p>List.contains와 Set.contains는 시간 복잡도에서 크게 차이가 난다.
List.contains -&gt; O(n)
Set.contains -&gt; O(1)</p>
<p>자료구조를 set으로 바꾸면 해결된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[HackerRank]Truck Tour]]></title>
            <link>https://velog.io/@dev-arden/HackerRankTruck-Tour</link>
            <guid>https://velog.io/@dev-arden/HackerRankTruck-Tour</guid>
            <pubDate>Sat, 18 Feb 2023 15:17:19 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.hackerrank.com/challenges/truck-tour/problem">https://www.hackerrank.com/challenges/truck-tour/problem</a>
2일차 코테문제인 트럭 투어</p>
<p>일단 결론적으로 구글링을 했다.
<a href="https://walk-through-me.tistory.com/66">https://walk-through-me.tistory.com/66</a></p>
<p>매우 심플한 문제</p>
<p>필요한 변수는 기름양과 주유소이다.</p>
<p>for문으로 주유소들을 따라간다.
각 주유소에서 기름을 채우고 그 후 다음 주유소를 갈 때 필요한 양만큼 뺀다.
이 때 -가 되면 갈 수 없으므로 기름양을 0으로 초기화한다.
그리고 이 때, 주유소 변수를 i+1로 세팅해준다. 
다음 주유소부터 새롭게 시작하는 것이다. 
새로 시작한 주유소에서부터 기름양이 0으로 안떨어진다면 문제 없이 갈 수 있다는 뜻이 된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[HackerRank]Palindrome Index]]></title>
            <link>https://velog.io/@dev-arden/HackerRankPalindrome-Index</link>
            <guid>https://velog.io/@dev-arden/HackerRankPalindrome-Index</guid>
            <pubDate>Sat, 18 Feb 2023 15:14:54 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.hackerrank.com/challenges/palindrome-index/problem">https://www.hackerrank.com/challenges/palindrome-index/problem</a>
연주언니와 코테스터디를 시작했다.
이름하여 1일 1코테.</p>
<p>우선 결론적으로 말하자면 이 문제에서 40/105점을 획득했다.
<img src="https://velog.velcdn.com/images/dev-arden/post/06572be6-e6dc-4615-bc1c-ffde6e07eb7a/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/dev-arden/post/166273f1-8a8e-4d8f-89b5-8bceb4294c0e/image.png" alt=""></p>
<p>코드를 짜면서도 시간 제한에 걸릴 것 같다고 생각했는데 역시나 걸렸다.</p>
<p>내가 생각한 방식은 아래와 같다.</p>
<ol>
<li>펠린드롬 여부 검사</li>
<li>아니라면 인덱스를 0에서부터 증가시켜가며 스트링 전체를 다시 펠린드롬 검사</li>
</ol>
<p>구글링 해본 결과 접근 방식은 비슷했으나 훨씬 간결한 방식으로 할 수 있었다.
<a href="https://ifuwanna.tistory.com/464">https://ifuwanna.tistory.com/464</a>
<a href="https://medium.com/geekculture/optimize-palindrome-index-hackerrank-solution-ceeb5bc91e1d">https://medium.com/geekculture/optimize-palindrome-index-hackerrank-solution-ceeb5bc91e1d</a></p>
<ol>
<li>펠린드롬 여부 검사
나 : 스트링 길이가 홀수/짝수인지 구분하여 mid 인덱스를 둔다. mid 앞 스트링 == 역순(mid 뒤 스트링) -&gt; 펠린드롬
구글링 결과 : 앞, 뒤 인덱스를 조정해가며 각 캐릭터별로 같은지 비교하는 방식. (펠린드롬의 의미를 생각해보니 매우 명쾌한 풀이였다.)</li>
</ol>
<p>구글링 후 나만의 코드를 작성해보았는데 여전히 틀리는 케이스가 있음
<img src="https://velog.velcdn.com/images/dev-arden/post/3e185911-2248-4676-b959-820814b57eb0/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/dev-arden/post/17cc468c-f514-4f1d-8950-3dc85b1b7fc2/image.png" alt=""></p>
<p>왤케 어려운건지.. 일단 패스..</p>
]]></description>
        </item>
    </channel>
</rss>