<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>끄적끄적 딸깍딸깍 개발일지</title>
        <link>https://velog.io/</link>
        <description>배운것을 끄적끄적 올리는 개발 블로그</description>
        <lastBuildDate>Sun, 07 Jul 2024 13:56:39 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>끄적끄적 딸깍딸깍 개발일지</title>
            <url>https://velog.velcdn.com/images/hello_hyun/profile/4a6860c4-4535-489e-b00f-a3524a66de0c/image.webp</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. 끄적끄적 딸깍딸깍 개발일지. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/hello_hyun" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[7/07]]></title>
            <link>https://velog.io/@hello_hyun/707</link>
            <guid>https://velog.io/@hello_hyun/707</guid>
            <pubDate>Sun, 07 Jul 2024 13:56:39 GMT</pubDate>
            <description><![CDATA[<p>dd</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[7/06]]></title>
            <link>https://velog.io/@hello_hyun/706</link>
            <guid>https://velog.io/@hello_hyun/706</guid>
            <pubDate>Sat, 06 Jul 2024 13:26:08 GMT</pubDate>
            <description><![CDATA[<p>fㅇ</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[07/05]]></title>
            <link>https://velog.io/@hello_hyun/0705</link>
            <guid>https://velog.io/@hello_hyun/0705</guid>
            <pubDate>Fri, 05 Jul 2024 14:13:09 GMT</pubDate>
            <description><![CDATA[<p>dd</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[07/03]]></title>
            <link>https://velog.io/@hello_hyun/0703</link>
            <guid>https://velog.io/@hello_hyun/0703</guid>
            <pubDate>Wed, 03 Jul 2024 14:39:00 GMT</pubDate>
            <description><![CDATA[<p>ㅇㅇ</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[07/02]]></title>
            <link>https://velog.io/@hello_hyun/0702</link>
            <guid>https://velog.io/@hello_hyun/0702</guid>
            <pubDate>Tue, 02 Jul 2024 13:13:28 GMT</pubDate>
            <description><![CDATA[<p>dd</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[7/01]]></title>
            <link>https://velog.io/@hello_hyun/701</link>
            <guid>https://velog.io/@hello_hyun/701</guid>
            <pubDate>Mon, 01 Jul 2024 11:43:12 GMT</pubDate>
            <description><![CDATA[<p>dd</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[6/30]]></title>
            <link>https://velog.io/@hello_hyun/630</link>
            <guid>https://velog.io/@hello_hyun/630</guid>
            <pubDate>Sun, 30 Jun 2024 12:58:00 GMT</pubDate>
            <description><![CDATA[<p>냉무</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[6/29]]></title>
            <link>https://velog.io/@hello_hyun/629</link>
            <guid>https://velog.io/@hello_hyun/629</guid>
            <pubDate>Sat, 29 Jun 2024 10:57:45 GMT</pubDate>
            <description><![CDATA[<p>dd</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[6/26]]></title>
            <link>https://velog.io/@hello_hyun/626</link>
            <guid>https://velog.io/@hello_hyun/626</guid>
            <pubDate>Wed, 26 Jun 2024 12:09:55 GMT</pubDate>
            <description><![CDATA[<h1 id="dd">dd</h1>
]]></description>
        </item>
        <item>
            <title><![CDATA[6/25 요양중]]></title>
            <link>https://velog.io/@hello_hyun/625-%EC%9A%94%EC%96%91%EC%A4%91</link>
            <guid>https://velog.io/@hello_hyun/625-%EC%9A%94%EC%96%91%EC%A4%91</guid>
            <pubDate>Tue, 25 Jun 2024 11:40:46 GMT</pubDate>
            <description><![CDATA[<p>냉무</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[06/24 요로결석]]></title>
            <link>https://velog.io/@hello_hyun/0624-%EC%9A%94%EB%A1%9C%EA%B2%B0%EC%84%9D</link>
            <guid>https://velog.io/@hello_hyun/0624-%EC%9A%94%EB%A1%9C%EA%B2%B0%EC%84%9D</guid>
            <pubDate>Mon, 24 Jun 2024 12:08:33 GMT</pubDate>
            <description><![CDATA[<p>죽는줄</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[6/24 냉]]></title>
            <link>https://velog.io/@hello_hyun/624-%EB%83%89</link>
            <guid>https://velog.io/@hello_hyun/624-%EB%83%89</guid>
            <pubDate>Sun, 23 Jun 2024 11:58:18 GMT</pubDate>
            <description><![CDATA[<p>냉..무..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[6/22]]></title>
            <link>https://velog.io/@hello_hyun/622</link>
            <guid>https://velog.io/@hello_hyun/622</guid>
            <pubDate>Sat, 22 Jun 2024 11:31:29 GMT</pubDate>
            <description><![CDATA[<p>치킨맛난다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[6/21 냉무]]></title>
            <link>https://velog.io/@hello_hyun/621-%EB%83%89%EB%AC%B4</link>
            <guid>https://velog.io/@hello_hyun/621-%EB%83%89%EB%AC%B4</guid>
            <pubDate>Fri, 21 Jun 2024 13:16:12 GMT</pubDate>
            <description><![CDATA[<p>치킨이먹고싶다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[6/20 냉무 ]]></title>
            <link>https://velog.io/@hello_hyun/620-%EB%83%89%EB%AC%B4</link>
            <guid>https://velog.io/@hello_hyun/620-%EB%83%89%EB%AC%B4</guid>
            <pubDate>Thu, 20 Jun 2024 12:38:12 GMT</pubDate>
            <description><![CDATA[<p>넘피곤,..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 완주하지 못한 선수]]></title>
            <link>https://velog.io/@hello_hyun/619-%EC%88%98%EC%A0%95</link>
            <guid>https://velog.io/@hello_hyun/619-%EC%88%98%EC%A0%95</guid>
            <pubDate>Wed, 19 Jun 2024 13:04:41 GMT</pubDate>
            <description><![CDATA[<p>냉무 </p>
<p>수정해야함 알고리즘 풀시간이 부족해</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[알고리즘.java] 누울 자리를 찾아라 키워드 : 문자열]]></title>
            <link>https://velog.io/@hello_hyun/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98.java-%EB%88%84%EC%9A%B8-%EC%9E%90%EB%A6%AC%EB%A5%BC-%EC%B0%BE%EC%95%84%EB%9D%BC-%ED%82%A4%EC%9B%8C%EB%93%9C-%EB%AC%B8%EC%9E%90%EC%97%B4</link>
            <guid>https://velog.io/@hello_hyun/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98.java-%EB%88%84%EC%9A%B8-%EC%9E%90%EB%A6%AC%EB%A5%BC-%EC%B0%BE%EC%95%84%EB%9D%BC-%ED%82%A4%EC%9B%8C%EB%93%9C-%EB%AC%B8%EC%9E%90%EC%97%B4</guid>
            <pubDate>Tue, 18 Jun 2024 13:29:53 GMT</pubDate>
            <description><![CDATA[<p>오늘은 백준 누울 자리를 search 해보는 문제를 풀도록 해보자</p>
<p>알바? 회사에서 몰래 푸는 문제라 더 재밌었던건 안비밀이다.</p>
<p>실버5 문제이다</p>
<p><a href="https://www.acmicpc.net/problem/1652">문제링크</a></p>
<h1 id="문제">문제</h1>
<p><img src="https://velog.velcdn.com/images/hello_hyun/post/6c25da9a-fb66-4da0-b103-5a7703fe66da/image.png" alt=""></p>
<h1 id="입력">입력</h1>
<p><img src="https://velog.velcdn.com/images/hello_hyun/post/ab8a39fd-0f7a-44b4-9c07-7627fb6240fd/image.png" alt=""></p>
<h1 id="출력">출력</h1>
<p><img src="https://velog.velcdn.com/images/hello_hyun/post/9efbe4dd-d292-4f3c-a992-036da5701616/image.png" alt=""></p>
<h2 id="예제-입력-1">예제 입력 1</h2>
<pre><code class="language-java">5
....X
..XX.
.....
.XX..
X....</code></pre>
<p>문제를 해석해보자 NXN인 방이 하나 있다 </p>
<p>그렇다면 내가 입력한 값이 방의 넓이가 되는구나 그러면 방을 하나 만들자 라고 생각했다.</p>
<pre><code class="language-java">Scanner sc = new Scanner(System.in);
int n = sc.nextInt();

방 생성
char[][] place = new char[n][n];</code></pre>
<p>방을 생성하였으니 이제 방 안에 입력값을 넣어보도록 하자</p>
<pre><code class="language-java">for (int i = 0; i &lt; n; i++) {
            String s = sc.next();
            for (int j = 0; j &lt; n; j++) {
                place[i][j] = s.charAt(j);
            }
        }</code></pre>
<p>이제 준비물은 완벽해 졌다 </p>
<p>요즘 나는 바로 문제를 풀어볼려고 하지 않고 메모장에 한번 입력예제를 적어보았다.</p>
<p>코드를 써내려가기전에 어떻게하면 될지 고민해보는 시간을 줄여주는거 같다 .</p>
<p>또한 회사 쉬는시간에 짬짬히 풀기에 나름 생각해본 방법이기도 하다.</p>
<p>( 아이패드가 고장나서 그림을 못그리는것도 있다 ) </p>
<p><img src="https://velog.velcdn.com/images/hello_hyun/post/6720e75f-93e2-4398-b36d-e1e8f11d3db3/image.png" alt=""></p>
<p>여튼 한번 메모장에 넣고 생각을해보았다.</p>
<p><img src="https://velog.velcdn.com/images/hello_hyun/post/1d53d484-481f-463c-a1d3-e52a60717d29/image.png" alt=""></p>
<p>이런 형태가 있을것이다</p>
<p>내가 찾아야하는건 누울 공간이다 문제를 보면 눕기 가능한 범위는 &#39;.&#39; 이 점이 2개 이상이여야한다.</p>
<p>그렇다면 내가 찾아야할 것은 세로의 눕기 가능한 공간의 횟수 + 가로의 눕기 가능한 공간의 횟수이다.</p>
<h3 id="메모장-생각정리">메모장 생각정리</h3>
<p><img src="blob:https://velog.io/f22875c5-f675-49ac-9fc9-4953449a31e2" alt="업로드중.."></p>
<pre><code class="language-java"> int vertical = 0;
 int horizontal = 0;</code></pre>
<p>총 잘 수 있는 공간이 될 녀석들이다.</p>
<p>이 녀석들은 세로 와 가로의 &#39;.&#39;의 갯수를 세어주는 녀석들이다 </p>
<pre><code class="language-java">int width = 0;
int hight = 0;</code></pre>
<p>자 이제 조건을 다시 생각해보자 </p>
<p>똑바로 &#39;.&#39;이 2개 이상 / 가로 세로 누울수있다.</p>
<p>난 총 2개의 거름망을 생성해야겠다고 생각했다</p>
<pre><code class="language-java">1. &#39;.&#39;일때 width의 갯수 증가
2. 값이 x 거나 or j == n-1일 경우라고 생각했다 
n-1 인 이유는 j가 숫자 인덱스가 4까지 때문이다.
3. 누울 공간이 2개 이상일때
</code></pre>
<pre><code class="language-java">place[i][j] = s.charAt(j);</code></pre>
<p>이녀석의 세로값을 구하려면</p>
<pre><code class="language-java">place[i][j] 을 들어가보면 된다.</code></pre>
<p>이 후 첫번째 거름망을 하나 설치해주자</p>
<pre><code class="language-java">만약에 세로 값에 &#39;.&#39; 이 있다면 
width의 값을 증가시켜주자 

만약에 가로 값에 &#39;.&#39; 이 있다면
hight의 값을 증가시켜주자.</code></pre>
<p>이제 코드를 한번 봐보자</p>
<pre><code class="language-java">
        for (int i = 0; i &lt; n; i++) {
            // 몇칸 갔는지 ( ex : &#39;.&#39;
            int width = 0;
            int hight = 0;

            for (int j = 0; j &lt; n; j++) {
                // 세로값구하기
                if(place[i][j] == &#39;.&#39;){
                    width++;
                }</code></pre>
<p>여기까지 보았다면 그림판으로 그림을 그려보겠다 </p>
<p><img src="https://velog.velcdn.com/images/hello_hyun/post/eaabfa3f-2ede-4877-bf42-4ba90a3c6948/image.png" alt=""></p>
<p>이렇게 될것이다 </p>
<p>2번째 거름망을 설치해보겠다</p>
<pre><code class="language-java"> if(place[i][j] == &#39;X&#39;  || j==n-1){
       if(width &gt;= 2){
           horizontal++;
         }
     width = 0;
}
</code></pre>
<p><img src="https://velog.velcdn.com/images/hello_hyun/post/0377c1be-166f-4709-a681-24c13cdcfebd/image.png" alt=""></p>
<p>or 조건에서 &#39;X&#39;녀석을 만나게되어 마지막 거름망으로 &#39;.&#39;갯수가 2보다 크거나 같으면</p>
<p>세로로 누을공간++ 이렇게 해준것이다.</p>
<pre><code class="language-java">j==n-1 
이 부분이 이해가 가지않는다면 </code></pre>
<p><img src="https://velog.velcdn.com/images/hello_hyun/post/ce99c95a-0e26-4485-9aaf-787c05b3404a/image.png" alt=""></p>
<p>이 부분을 생각하면 된다.</p>
<p>이후 2번째 세로의 &#39;.&#39;갯수를 구해주기위해 width를 초기화 시켜주었다.</p>
<p>이제 세로가 끝났으니 <code>가로</code>도 똑같은 매커니즘으로 구하면된다 </p>
<h2 id="코드">코드</h2>
<pre><code class="language-java">import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();

        // 장소 생성
        char[][] place = new char[n][n];

        for (int i = 0; i &lt; n; i++) {
            String s = sc.next();
            for (int j = 0; j &lt; n; j++) {
                place[i][j] = s.charAt(j);
            }
        }

        // 총 잘 장소가 몇개 인지
        int vertical = 0;
        int horizontal = 0;

        for (int i = 0; i &lt; n; i++) {
            // 몇칸 갔는지 ( ex : &#39;.&#39;
            int width = 0;
            int hight = 0;

            for (int j = 0; j &lt; n; j++) {
                // 세로값구하기
                if(place[i][j] == &#39;.&#39;){
                    width++;
                }

                if(place[i][j] == &#39;X&#39;  || j==n-1){
                    if(width &gt;= 2){
                        horizontal++;
                    }
                    width = 0;
                }

                // 가로값 구하기
                if(place[j][i] == &#39;.&#39;){
                    hight++;
                }

                if(place[j][i] == &#39;X&#39; || j== n-1){
                    if(hight &gt;=  2){
                        vertical++;
                    }
                    hight = 0;
                }

            }
        }

        System.out.println(horizontal + &quot; &quot; + vertical);

    }
}
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[알고리즘.java] 리트코드 Count Items Matching a Rule 을 풀어보자 [키워드 : 문자열 ]]]></title>
            <link>https://velog.io/@hello_hyun/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98.java-%EB%A6%AC%ED%8A%B8%EC%BD%94%EB%93%9C-Count-Items-Matching-a-Rule-%EC%9D%84-%ED%92%80%EC%96%B4%EB%B3%B4%EC%9E%90-%ED%82%A4%EC%9B%8C%EB%93%9C-%EB%AC%B8%EC%9E%90%EC%97%B4</link>
            <guid>https://velog.io/@hello_hyun/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98.java-%EB%A6%AC%ED%8A%B8%EC%BD%94%EB%93%9C-Count-Items-Matching-a-Rule-%EC%9D%84-%ED%92%80%EC%96%B4%EB%B3%B4%EC%9E%90-%ED%82%A4%EC%9B%8C%EB%93%9C-%EB%AC%B8%EC%9E%90%EC%97%B4</guid>
            <pubDate>Mon, 17 Jun 2024 12:47:48 GMT</pubDate>
            <description><![CDATA[<p>문제 </p>
<p><img src="https://velog.velcdn.com/images/hello_hyun/post/a3eb5be3-6b91-489a-aedc-9a1db7e00dca/image.png" alt=""></p>
<p>우선 풀기 전 문제를 이해를 해보도록하자</p>
<p>items라는 배열안에 각각 값들이 주어졌다.</p>
<p>순서대로 type , color , name 순이다 이후 다음 중 하나가 참일 경우 규칙과 일치하다고 한다.</p>
<p>ruleKey 가 type이면 ruleValue도 type 이다</p>
<p>다른 예로 들자면 ruleKey가 color면 ruleValue는 color의 값중 하나 예를들어 sliver 이런 식 일 것이다.</p>
<p>이 후 key값에 따른 value값으로 items 안에 어떤 인덱스가 value값을 포함하고 있는지 찾는 문제이다.</p>
<p>자 이제 입력 예시를 한번 보도록하자</p>
<p><img src="https://velog.velcdn.com/images/hello_hyun/post/3384343f-1f21-4a84-acc6-2df3b7c032e1/image.png" alt=""></p>
<pre><code class="language-JAVA">List&lt;List&lt;String&gt;&gt; 형태로 들어가 있는 리스트 가 있다.</code></pre>
<p>그림으로 표현하자면 </p>
<p><img src="https://velog.velcdn.com/images/hello_hyun/post/f1944d70-74d7-4742-b4e6-41b17a8120c9/image.jpeg" alt=""></p>
<p>이런 형태일 것이다 ( 악필 ㅈㅅ )</p>
<p>자 여기서 문제에 대해서 다시한번 떠올려보자</p>
<p>배열안에 들어가는 유형은 순서가 보장된다 절때 바뀌지않는다</p>
<p><img src="https://velog.velcdn.com/images/hello_hyun/post/4bd83299-2681-43fd-a8f6-75bd7446df49/image.jpeg" alt=""></p>
<p>그렇다면 key에 따라서 바뀌는 value값으로 배열에 있는 값을 비교해 탐색해주면 되지않을까 ?
<img src="https://velog.velcdn.com/images/hello_hyun/post/8e9b0786-1ee6-4ae0-b48f-9033fd7b8bad/image.jpeg" alt=""></p>
<p>라는 기가막힌 생각을 하게 된거다.</p>
<p>자 이제 코드를 써내려가 보도록하자.</p>
<pre><code class="language-java">int searchTpye = 0;</code></pre>
<p>유형을 탐색해 줄 변수를 하나 만들어두자</p>
<p>이후</p>
<pre><code class="language-java">if(ruleKey.equals(&quot;color&quot;)){
            searchType = 1;
        }

        if(ruleKey.equals(&quot;name&quot;)){
            searchType = 2;
        }
</code></pre>
<p>각각 key에 따라 변수의 값을 재정의 해주자</p>
<pre><code>key의 값에 따라서 value값이 바뀐다 
0은 기본 type , 1은 color , 2는 name 으로 바뀔것이다.</code></pre><pre><code class="language-java">이후 우리의 정답이 될 변수를 하나 만들어주자
int answer = 0;</code></pre>
<p>이후에 key값으로 인해 변화된 serachType 녀석으로 순회하며 ruleValue와 맞는 녀석이 나온다면 matches++ 시켜 답을 얻어가주자</p>
<pre><code class="language-java"> for (int i = 0; i &lt; items.size(); j++) {
          if(items.get(i).get(searchType).equals(ruleValue)){
                matches++;
           }
       }
</code></pre>
<p>이 코드가 이해가 가지 않는다면 아래 그림으로 설명해 보겠다</p>
<p><img src="https://velog.velcdn.com/images/hello_hyun/post/c165d259-b4e5-4d35-9ddf-b0e8db90c9aa/image.jpg" alt=""></p>
<p>대충 여태 설명한 걸 그림으로 표현하면 이렇게 될 것이다 </p>
<p>이제 key값의 유형에따라서 searchData의 값이 바뀔것이다.</p>
<p>type이면 기본적으로 0
color면 1
name면 2로</p>
<p>왜 이렇게 만들수 있는 그이유는 </p>
<p><img src="https://velog.velcdn.com/images/hello_hyun/post/55467396-3e59-4f91-9ae2-8e8784255b7d/image.jpg" alt=""></p>
<p>바로 배열안에 주어진 유형의 순서가 절대 변하지 않기 때문이다.</p>
<p>이제 for문에서 searchData(searchTpye 이였네용 죄송 ㅎㅎ ㅋㅋ ㅈㅅ!! )값으로 배열을 탐색해 값이 있으면 값을 증가 시켜주면 된다.</p>
<p><img src="https://velog.velcdn.com/images/hello_hyun/post/8e269348-237c-41cc-82de-8aa382848449/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[알고리즘.java] 프로그래머스 lv1 폰켓몬 ]]></title>
            <link>https://velog.io/@hello_hyun/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-0%EC%9D%BC%EC%B0%A8-TIL-%EB%B0%8F-%ED%9A%8C%EA%B3%A0%EB%A1%9D-HASHSET</link>
            <guid>https://velog.io/@hello_hyun/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-0%EC%9D%BC%EC%B0%A8-TIL-%EB%B0%8F-%ED%9A%8C%EA%B3%A0%EB%A1%9D-HASHSET</guid>
            <pubDate>Mon, 20 May 2024 13:37:33 GMT</pubDate>
            <description><![CDATA[<p> 코테 스터디가 시작되는 날이다 코테를 조금 풀어봤지만 본격적으로 해보지는 않았기에 
조금(?) 무서웠다.</p>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/1845">문제링크 폰켓몬</a></p>
<p>문제 제목부터 너무 귀여웠다 폰켓몬이라니.. 과연 문제 난이도는 어떨까 ?</p>
<p><img src="https://velog.velcdn.com/images/hello_hyun/post/e5adca93-98ed-4215-9fc5-6ee86d888315/image.png" alt=""></p>
<p>이게 무슨 말이지..?</p>
<p>내 뇌를 누군가 꿀밤먹인거 같은 느낌이였다.</p>
<p>이게 비기너 수준의 문제라구..? 하며 겁을 먹어버렸다.</p>
<p>그래도 풀어야지 .. 해야지.. 하며 다시 마음을 다잡고 천천히 문제를 읽어내려갔다.</p>
<p>일단 문제를 정리해보자면</p>
<p>착각할수 있는 문장이 있었다 이 문제는 선택할 수 있는 경우의 수가 아니라 선택할 수 있는 &#39;포켓몬 종류의 수&#39;가 최대일 때를 구하는 것이다</p>
<p>[3,3,3,2,2,2] 이 배열이 있을경우 안에 6마리의 폰켓몬이 있으므로</p>
<p>총 3마리의 폰켓몬을 골라야만 합니다.. 가장 많은 종류의 폰켓몬을 고르기 위해서는 3번 포켓몬 한마리 2번폰켓몬 2마리를 고르거나 혹은 2번폰켓몬 2마리와 3번폰켓몬 1마리 이렇게 고를수 있습니다 </p>
<p>입력받은 nums 배열에 원소값들이 존재하는데</p>
<p>이 배열에서 최대 num의 길이 / 2 만큼 원소를 선택 가능하다.</p>
<p>예를 들어서 만약 배열의 길이가 6이라고하면 총 3개를 선택 할 수 있는것이다.</p>
<p>하지만 원소를 선택할 경우 중복되는 원소는 선택하면 안된다.</p>
<p>예시를 보도록 하자</p>
<p><img src="https://velog.velcdn.com/images/hello_hyun/post/512fe906-4716-486e-a71b-11fdd5bd34a2/image.png" alt=""></p>
<p>처음 예를 보면 [ 3, 1, 2 ,3 ] 을 입력받았다고 생각해보자</p>
<p>nums = [3,1,2,3] 에서는 nums 의 길이 / 2 즉 최대 2개만 선택이 가능하다</p>
<p>여기서 문제 조건에 중복된 원소는 고를 필요가 없으니 nums = [1,2,3] 에서 최대 2개를 고를 수 있다 즉 정답은 2가 되는것이다.</p>
<p>그렇다면 다른 예시를 봐보자 [3,3,3,2,2,2] 를 입력받았다고 해보자.</p>
<p>이어서 nums 의 길이 / 2 는 3 이다 이때 중복된 원소는 고를 필요는 없으니 [3,2] 에서 최대 3개만 고르면 되지만 중복 원소를 제거하면 원소가 2개밖에 없다 이럴경우 nums에 있는 것들을 모두 골라주면 정답이 된다고 생각했다.</p>
<p>결국 이때 중요한 키워드는 <code>중복 제거</code> 라는 키워드인거 같아 공부를 하기 시작했다.</p>
<p>내가 아는 HASHSET .. </p>
<p>일단 중복제거 해주는 녀석으로만 알고있었다.. 사실 자세하게 공부하진 않았다 </p>
<p>그때 당시 공부했을땐 과정이 뭐 중요한가 ? 라고 생각했지만 요즘 들어서 개발을 공부할땐 <code>과정</code>과 <code>왜?</code> 라는게 참 중요하다고 생각한다.</p>
<h2 id="hashset-이란">HASHSET 이란?</h2>
<p>일단 자바의 hashset은 set인터페이스에서 지원하는 구현 클래스 라고한다.</p>
<p>순서대로 입력되지 않고 일정하게 유지되지 않는게 특징이다</p>
<p>또한 null 값도 허용한다 그리고 가장 중요한 특징은 중복을 허용하지 않는다는 것이다.</p>
<h2 id="그렇다면-중복은-어떻게-걸러냄">그렇다면 중복은 어떻게 걸러냄?</h2>
<p>hashset은 객체를 저장하기 전에 먼저 객체의 hashcode()메소드를 호출해 해시코드를 얻어낸 다음 저장되어 있는 객체들의 해시 코드와 비교한뒤 같은 해시코드가 있따면 다시 equals()메소드로 두 객체를 비교하여 true값이 나온다면 동일한 객체로 판단하고 저장하지 않는다.</p>
<p>문자열을 hashset에 저장할 경우 같은 문자열을 갖는 string 객체는 동일한 객체로 간주되고 다른 문자열을 갖는 string 객체는 다른 객체로 간주되는데 그 이유는 string 클래스가 hashcode()와 equals() 메소드를 재정의 하여 같은 문자열일 경우 hashCode() 의 리턴값을 같게 equlas() 의 리턴값은  true 값이 나오도록 했기 때문이다.</p>
<h2 id="어떻게-사용함-">어떻게 사용함 ??</h2>
<p>hashset 의 변수를 선언하는 방법이다 .</p>
<pre><code class="language-java">HashSet&lt;Integer&gt; set = new HashSet&lt;Integer&gt;();
HashSet&lt;String&gt; set = new HashSet&lt;String&gt;();</code></pre>
<p>이렇게 HashSet&lt;데이터타입&gt; 변수명 = new HashSet&lt;데이터타입&gt;(); 으로 선언해 주면 된다</p>
<h3 id="값-추가">값 추가</h3>
<pre><code class="language-java">public class HashSetTest {
    public static void main(String[] args)  {    
        // Integer
        HashSet&lt;Integer&gt; set = new HashSet&lt;Integer&gt;();    

        set.add(1);
        set.add(2);
        set.add(3);
        set.add(1);

        // String
        HashSet&lt;String&gt; set2 = new HashSet&lt;String&gt;();

        set2.add(&quot;a&quot;);
        set2.add(&quot;b&quot;);
        set2.add(&quot;c&quot;);
        set2.add(&quot;a&quot;);
    }
}
</code></pre>
<p>HashSet의 add(value) 메소드를 사용하여 값을 추가합니다
추가되는 값은 HashSet&lt;데이터타입&gt;의 맞는 데이터만 추가해줍니다</p>
<h3 id="값-삭제">값 삭제</h3>
<pre><code class="language-java">public class HashSetTest {
    public static void main(String[] args)  {    
        // Integer
        HashSet&lt;Integer&gt; set = new HashSet&lt;Integer&gt;();    
        set.remove(1);
        set.clear();

        // String
        HashSet&lt;String&gt; set2 = new HashSet&lt;String&gt;();
        set2.remove(&quot;a&quot;);
        set2.clear();
    }
}</code></pre>
<p>HashSet의 remove(value) 메소드를 사용하면 원하는 value 값만 삭제가 된다.</p>
<h3 id="크기-구하기">크기 구하기.</h3>
<pre><code class="language-java">public class HashSetTest {
    public static void main(String[] args)  {    
        // Integer
        HashSet&lt;Integer&gt; set = new HashSet&lt;Integer&gt;();    

        set.add(1);
        set.add(2);
        set.add(3);
        set.add(1);
        System.out.println(&quot;set의 크기 : &quot; + set.size());

        // String
        HashSet&lt;String&gt; set2 = new HashSet&lt;String&gt;();

        set2.add(&quot;a&quot;);
        set2.add(&quot;b&quot;);
        set2.add(&quot;c&quot;);
        set2.add(&quot;a&quot;);
        System.out.println(&quot;set2의 크기 : &quot; + set2.size());
    }
}</code></pre>
<p>Size() 메소드 사용시 둘 다 결과가 3으로 출력이 됩니다</p>
<h3 id="검색하기">검색하기</h3>
<pre><code class="language-java">public class HashSetTest {
    public static void main(String[] args)  {    
        // Integer
        HashSet&lt;Integer&gt; set = new HashSet&lt;Integer&gt;();    

        set.add(1);
        set.add(2);
        set.add(3);
        set.add(1);

        System.out.println(&quot;1은 있는가? : &quot; + set.contains(1));

        // String
        HashSet&lt;String&gt; set2 = new HashSet&lt;String&gt;();

        set2.add(&quot;a&quot;);
        set2.add(&quot;b&quot;);
        set2.add(&quot;c&quot;);
        set2.add(&quot;a&quot;);

        System.out.println(&quot;a는 있는가? : &quot; + set2.contains(&quot;a&quot;));
    }
}
</code></pre>
<p>반환값으로는 boolean 값이 나온다 </p>
<p>코드 반환값은 true로 나오게 됩니다.</p>
<h2 id="사실-for문으로-만-풀고싶었다">사실 for문으로 만 풀고싶었다...</h2>
<p>사실 고민하다가 HashSet으로 풀긴하였지만 </p>
<pre><code class="language-java">import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;

public class Solution {

    public int solution(int[] nums){
        int answer = nums.length / 2;
        HashSet&lt;Integer&gt; numHash = new HashSet&lt;&gt;();

        for (int num : nums) {
            numHash.add(num);
        }


        if(answer &gt; numHash.size()){
            return numHash.size();
        }else {
            return answer;
        }

    }
}
</code></pre>
<p>for문으로만 풀고싶었다.</p>
<p>이유는 아직 알고리즘 초보이기도 하고 내장함수에만 의존하다보면 나중에 감도 잊을거같아서 for문으로도 풀어보았다.</p>
<pre><code class="language-java">import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;

public class Solution {

    public int solution(int[] nums){
        int[] counts = new int[200001];
        int answer = 0;
        for(int i = 0; i &lt; nums.length; i++) {
            if(counts[nums[i]] == 0) {
                answer++;
            }
            counts[nums[i]]++;
        }
        if(answer &gt; nums.length / 2) {
            answer = nums.length / 2;
        }
        return answer;

    }
}</code></pre>
<p>결론을 말해보자면 차근차근 읽고 이해하고 풀어보면 난이도 자체는 쉬운거 같다.</p>
<p>어렵지도않고 사실 이 문제는 코드를 짜는 실력보다 독해력을 요구하는 문제가 아니였을까 싶다..</p>
<p>앞으로는 문제가 길거나 어려워 보인다고해서 쫄지말고 차근차근 정리해나가 풀어보도록 하겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[java 여행기 - class 는 왜 필요함 ? ( 클래스가 필요한 이유 ) ]]></title>
            <link>https://velog.io/@hello_hyun/java-%EC%97%AC%ED%96%89%EA%B8%B0-class-%EB%8A%94-%EC%99%9C-%ED%95%84%EC%9A%94%ED%95%A8-%ED%81%B4%EB%9E%98%EC%8A%A4%EA%B0%80-%ED%95%84%EC%9A%94%ED%95%9C-%EC%9D%B4%EC%9C%A0</link>
            <guid>https://velog.io/@hello_hyun/java-%EC%97%AC%ED%96%89%EA%B8%B0-class-%EB%8A%94-%EC%99%9C-%ED%95%84%EC%9A%94%ED%95%A8-%ED%81%B4%EB%9E%98%EC%8A%A4%EA%B0%80-%ED%95%84%EC%9A%94%ED%95%9C-%EC%9D%B4%EC%9C%A0</guid>
            <pubDate>Mon, 22 Apr 2024 06:47:32 GMT</pubDate>
            <description><![CDATA[<p>원래 나는 자바스크립트로 개발을 시작했기에 처음 자바를 접할때 많이 복잡하다고 느꼇다.</p>
<p>사실 강의를 듣기전에 class ? 뭐임 ? 그냥 있으니깐 쓰지 뭐.. 이런 느낌으로 사용하였다 ..</p>
<p>그러다 보니 솔직히 어쩔때 써야할지도 모르겠고.. 왜 써야할지도 모르겠어서 많이 멘탈도 터지게되었다.</p>
<p><img src="https://velog.velcdn.com/images/hello_hyun/post/a6b1a06a-f9d0-4ff2-a9c9-19948e34a65f/image.png" alt=""></p>
<p>하지만 이번에 김영한 선생님의 강의가 출시되면서 이번 기회에 좀 제대로 개념을 가지고 가볼까 싶어서 강의를 들으며 정리해 보았다 .</p>
<h3 id="문제-학생-정보-출력-프로그램-만들기">문제: 학생 정보 출력 프로그램 만들기</h3>
<p>당신은 두 명의 학생 정보를 출력하는 프로그램을 작성해야 한다. 
각 학생은 이름, 나이, 성적을 가지고 있다.</p>
<pre><code>요구 사항:
1. 첫 번째 학생의 이름은 &quot;학생1&quot;, 나이는 15, 성적은 90입니다.
2. 두 번째 학생의 이름은 &quot;학생2&quot;, 나이는 16, 성적은 80입니다.
3. 각 학생의 정보를 다음과 같은 형식으로 출력해야 합니다: &quot;이름: [이름] 나이: [나이] 성적: [성적]&quot;
4. 변수를 사용해서 학생 정보를 저장하고 변수를 사용해서 학생 정보를 출력해야 합니다.</code></pre><p>이런 요구사항이 있다고 해보자 </p>
<p>음 .. 첫 번째 두번째 .. 어쩌구 저쩌구 .. 딸깍 딸깍 ...</p>
<pre><code class="language-java">
package class1;

public class ClassStart1 {
    public static void main(String[] args) {
        String student1Name = &quot;학생1&quot;;
        int student1Age = 15;
        int student1Grade = 90;
        String student2Name = &quot;학생2&quot;;
        int student2Age = 16;
        int student2Grade = 80;
        System.out.println(&quot;이름:&quot; + student1Name + &quot; 나이:&quot; + student1Age + &quot; 성
                적:&quot; + student1Grade);
        System.out.println(&quot;이름:&quot; + student2Name + &quot; 나이:&quot; + student2Age + &quot; 성
                적:&quot; + student2Grade);
    }
}</code></pre>
<p>음 변수를 사용해서 만들어 보았다 ..</p>
<p><img src="https://velog.velcdn.com/images/hello_hyun/post/fa558d86-5f78-49b1-b5e5-b095a46b9893/image.png" alt=""></p>
<p>근데 갑자기 학생이 늘어나면 어떻게 하지 ??</p>
<p><img src="https://velog.velcdn.com/images/hello_hyun/post/5805e593-9208-48c0-8903-3ff74d5d1a3a/image.png" alt=""></p>
<p>오 배열을 사용해볼까 ??</p>
<p>딸깍 딸깍 ..</p>
<pre><code class="language-java">package class1;

public class ClassStart2 {
    public static void main(String[] args) {
        String[] studentNames = {&quot;학생1&quot;, &quot;학생2&quot;};
        int[] studentAges = {15, 16};
        int[] studentGrades = {90, 80};
        for (int i = 0; i &lt; studentNames.length; i++) {
            System.out.println(&quot;이름:&quot; + studentNames[i] + &quot; 나이:&quot; +
                    studentAges[i] + &quot; 성적:&quot; + studentGrades[i]);
        }
    }
}
</code></pre>
<p>학생 추가 전</p>
<pre><code class="language-java">String[] studentNames = {&quot;학생1&quot;, &quot;학생2&quot;};
int[] studentAges = {15, 16};
int[] studentGrades = {90, 80};</code></pre>
<p>학생 추가 후</p>
<pre><code class="language-java">String[] studentNames = {&quot;학생1&quot;, &quot;학생2&quot;, &quot;학생3&quot;, &quot;학생4&quot;, &quot;학생5&quot;};
int[] studentAges = {15, 16, 17, 10, 16};
int[] studentGrades = {90, 80, 100, 80, 50};</code></pre>
<p><img src="https://velog.velcdn.com/images/hello_hyun/post/27db198c-94aa-45f9-8e15-99f8ae13f2e6/image.png" alt=""></p>
<p>그래서 뭐가 편해진거임 ..?</p>
<p>만약에 학생2가 도중에 <code>큰 결심</code> 을 하여 자퇴를 했다고 생각해보도록 하자</p>
<p>그 학생의 데이터를 제거하려면 각각의 배열마다 그 학생의 요소를 정확하게 찾아서 제거 해주어야 한다.</p>
<p><code>큰 결심 후</code></p>
<pre><code class="language-java">String[] studentNames = {&quot;학생1&quot;, &quot;학생3&quot;, &quot;학생4&quot;, &quot;학생5&quot;};
int[] studentAges = {15, 17, 10, 16};
int[] studentGrades = {90, 100, 80, 50};</code></pre>
<p>거기다가 한 학생의 데이터의 배열이 3개로 나누어져 있기에 배열을 각각 변경해야 한다. 
그리고 한 학생의 데이터를 관리하기 위해 3개의 배열의 인덱스 순서를 항상 정확하게 맞추어야 한다...</p>
<p>이렇게 하면 특정 학생 (ex : 학생2 )의 데이터를 변경할 때 실수할 가능성이 매우 높다.</p>
<p>이 코드는 컴퓨터가 볼 때는 아무 문제가 없지만 사람이 관리하기에는 좋은 코드가 아니다.</p>
<h2 id="정리">정리</h2>
<p>지금처럼 이름 , 나이 , 성적 을 각각 따로 나누어서 관리하는 것은 사람이 관리하기 좋은 방식이 아님.</p>
<p>사람이 관리하기 좋은 방식은 학생이라는 개념을 하나로 묶는것이다.</p>
<p>그리고 각각의 학생 별로 본인의 이름 , 나이 ,성적을 관리하는것인 것이다..!!!</p>
<p><img src="https://velog.velcdn.com/images/hello_hyun/post/39b058b8-80bd-4a14-9e25-45efd589ca67/image.png" alt=""></p>
]]></description>
        </item>
    </channel>
</rss>