<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>RyuIsangGo.log</title>
        <link>https://velog.io/</link>
        <description>이전 블로그 입니다. </description>
        <lastBuildDate>Thu, 07 Sep 2023 11:03:58 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>RyuIsangGo.log</title>
            <url>https://velog.velcdn.com/images/sunokryu_123/profile/43e7ff7c-c5ed-4458-8b13-110c7f353f6a/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. RyuIsangGo.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/sunokryu_123" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[백엔드 로드맵 정리 시리즈]]></title>
            <link>https://velog.io/@sunokryu_123/%EB%B0%B1%EC%97%94%EB%93%9C-%EB%A1%9C%EB%93%9C%EB%A7%B5-%EC%A0%95%EB%A6%AC-%EC%8B%9C%EB%A6%AC%EC%A6%88</link>
            <guid>https://velog.io/@sunokryu_123/%EB%B0%B1%EC%97%94%EB%93%9C-%EB%A1%9C%EB%93%9C%EB%A7%B5-%EC%A0%95%EB%A6%AC-%EC%8B%9C%EB%A6%AC%EC%A6%88</guid>
            <pubDate>Thu, 07 Sep 2023 11:03:58 GMT</pubDate>
            <description><![CDATA[<p><a href="https://roadmap.sh/backend">https://roadmap.sh/backend</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[자주 볼 문서 모음]]></title>
            <link>https://velog.io/@sunokryu_123/%EC%9E%90%EC%A3%BC-%EB%B3%BC-%EB%AC%B8%EC%84%9C-%EB%AA%A8%EC%9D%8C</link>
            <guid>https://velog.io/@sunokryu_123/%EC%9E%90%EC%A3%BC-%EB%B3%BC-%EB%AC%B8%EC%84%9C-%EB%AA%A8%EC%9D%8C</guid>
            <pubDate>Wed, 06 Sep 2023 13:56:11 GMT</pubDate>
            <description><![CDATA[<p><strong>1. prisma : <a href="https://www.prisma.io/docs/reference/api-reference/prisma-client-reference">https://www.prisma.io/docs/reference/api-reference/prisma-client-reference</a></strong></p>
<ol start="2">
<li>react : </li>
</ol>
<ul>
<li>react 개념서(구) : <a href="https://ko.legacy.reactjs.org/docs/hello-world.html">https://ko.legacy.reactjs.org/docs/hello-world.html</a></li>
<li>react (신) : <a href="https://react.dev/reference/react">https://react.dev/reference/react</a></li>
</ul>
<p>...</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[코습관]]></title>
            <link>https://velog.io/@sunokryu_123/%EC%BD%94%EC%8A%B5%EA%B4%80</link>
            <guid>https://velog.io/@sunokryu_123/%EC%BD%94%EC%8A%B5%EA%B4%80</guid>
            <pubDate>Tue, 05 Sep 2023 11:40:22 GMT</pubDate>
            <description><![CDATA[<ol>
<li>사고는 명확하게 한다. </li>
<li>원인 -&gt; 결과</li>
<li>코드를 수정했을 때 발생되는 결과를 예상한다. (ex.여러 곳에서 사용되는 컴포넌트를 바꿨을 때)</li>
<li>코드를 읽을 때 가독성 좋게 코드를 짜자.</li>
<li>글쓰는 연습을 하자. 
글에 기승전개가 있는 것마냥, 코드를 짤 때도 물흐르듯 자연스럽게 짜도록 노력하자.</li>
<li>내가 짠 코드가 무엇을 의미하는지, 돌아간다면 어떤 순서대로 돌아가는 건지, 안된다면 왜 안되는지 글을 쓰면서 코드를 짜자. </li>
<li>리스트 뽑을 때 출력할 양의 최대값을 지정한다. (서버 뻗는 것 방지)</li>
<li>명세서는 최대한 바꾸지 않는다. (반대로 생각해도 화나지)</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[함수 - 특정목적, 독립적]]></title>
            <link>https://velog.io/@sunokryu_123/qidn1rbw</link>
            <guid>https://velog.io/@sunokryu_123/qidn1rbw</guid>
            <pubDate>Tue, 05 Sep 2023 11:17:34 GMT</pubDate>
            <description><![CDATA[<h3 id="수학에서-함수란">수학에서 함수란</h3>
<blockquote>
<p>함수(function)란 첫 번째 집합의 임의의 한 원소가 두 번째 집합의 오직 한 원소에만 대응하는 관계를 의미합니다.
x와 y 사이에서 x의 값이 정해지면 거기에 따라 y의 값이 정해지는 관계를 가질 때 y는 x의 함수라고 부릅니다.</p>
</blockquote>
<h3 id="프로그래밍에서-함수란">프로그래밍에서 함수란</h3>
<blockquote>
<p>프로그래밍에서 함수란 특정 목적의 작업을 수행하기 위해 독립적으로 설계된 프로그램 코드의 집합으로 정의할 수 있다. </p>
</blockquote>
<h3 id="왜-함수를-사용하는가">왜 함수를 사용하는가?</h3>
<blockquote>
<ol>
<li>반복적인 프로그래밍을 피할 수 있기 때문이다. </li>
<li>프로그램을 여러 개의 함수로 나누어 작성하면, 모듈화로 인해 전체적인 코드의 가독성이 좋아진다. </li>
<li>프로그램에 문제가 발생하거나 기능의 변경이 필요할 때에도 손쉽게 유지보수를 할 수 있다. </li>
</ol>
</blockquote>
<p>여기서 중요한 키워드는 &#39;특정 목적&#39;과 &#39;독립적&#39;인 것 같다. 
그리고 이러한 결에 잘어울리는 변수명을 지어주는게 중요한 것 같다. 
예를 들어, 
함수의 이름이 getDeviceList인데 실제 함수의 기능이 
기기 리스트를 가져오는 것과 다른 기능이 덕지덕지 붙어있다면,
코드의 전반적인 흐름을 읽어나갈 때, 읽는 속도도 안날 뿐더러 두번다시 보는게 고역일 것이다.</p>
<p>다른 예로,
다른 함수와 독립적이지 못한다면 이 함수를 읽어나가다가 저 함수랑 연관되어있어서 저 함수 읽었다가 또 다른 함수 읽었다가... 이거 뭐지? 그래서 어디서 문제가 발생한건데? 싶은 순간이 많을 것으로 판단이 된다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[올바른 괄호]]></title>
            <link>https://velog.io/@sunokryu_123/%EC%98%AC%EB%B0%94%EB%A5%B8-%EA%B4%84%ED%98%B8</link>
            <guid>https://velog.io/@sunokryu_123/%EC%98%AC%EB%B0%94%EB%A5%B8-%EA%B4%84%ED%98%B8</guid>
            <pubDate>Tue, 05 Sep 2023 11:02:41 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<p><img src="https://velog.velcdn.com/images/sunokryu_123/post/777d53d1-069f-4f73-a033-031e0cb39b08/image.png" alt=""></p>
<h1 id="나의코드">나의코드</h1>
<pre><code>const solution = (s) =&gt; {
    let stack = [];
    for (let i = 0; i &lt; s.length; i++) {
        if(s[i] === &#39;(&#39;) {
            stack.push(s[i]);
        }else {
            if(stack[stack.length -1] === &#39;(&#39;) {
                stack.pop();
            }else {
                stack.push(s[i]);
            }
        }
    }
    return stack.length === 0 ? true : false;
}</code></pre><h1 id="로직흐름">로직흐름</h1>
<p>스택 관련 문제이다. </p>
<ul>
<li>stack을 만든다. </li>
<li>s를 순회한다. </li>
<li>현재 요소가 (라면 stack에 추가한다. </li>
<li>현재 요소가 )이면서 stack의 마지막 요소가 (라면 stack에서 마지막 요소를 제거한다. </li>
<li>현재 요소가 )이면서 stack의 마지막 요소가 )라면 stack에 )를 추가한다. </li>
<li>반복을 마치고, stack의 크기가 0이면 true, 아니라면 false를 반환한다. </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[같은 숫자는 싫어 ]]></title>
            <link>https://velog.io/@sunokryu_123/%EA%B0%99%EC%9D%80-%EC%88%AB%EC%9E%90%EB%8A%94-%EC%8B%AB%EC%96%B4-rsxj1hcf</link>
            <guid>https://velog.io/@sunokryu_123/%EA%B0%99%EC%9D%80-%EC%88%AB%EC%9E%90%EB%8A%94-%EC%8B%AB%EC%96%B4-rsxj1hcf</guid>
            <pubDate>Tue, 05 Sep 2023 10:51:53 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<p><img src="https://velog.velcdn.com/images/sunokryu_123/post/689f5f6b-45b0-45e4-bdff-7c8644dcbff0/image.png" alt=""></p>
<h1 id="나의코드">나의코드</h1>
<pre><code>const solution = (arr) =&gt; {
    let answer = [arr[0]];
    for(let i=1; i&lt; arr.length; i++) {
        const compareItem = answer[answer.length-1];
        if(arr[i] != compareItem) {
            answer.push(arr[i]);
        }
    }
    return answer;
}</code></pre><h1 id="로직흐름">로직흐름</h1>
<p>전형적인 스택관련 문제이다. 
스택 answer를 만들어 가장 마지막 요소와 순회중인 배열 arr의 요소를 비교하고, 이 값이 다르면 스택 answer에 현재의 arr요소를 추가한다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[K번째수]]></title>
            <link>https://velog.io/@sunokryu_123/K%EB%B2%88%EC%A7%B8%EC%88%98</link>
            <guid>https://velog.io/@sunokryu_123/K%EB%B2%88%EC%A7%B8%EC%88%98</guid>
            <pubDate>Wed, 23 Aug 2023 12:20:54 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<p><img src="https://velog.velcdn.com/images/sunokryu_123/post/4b758a79-c2e8-4673-9c3d-4efe7547e802/image.png" alt=""></p>
<h1 id="나의코드">나의코드</h1>
<pre><code>const solution = (array, commands) =&gt; {
    let result = [];
    for(let command of commands) {
        result.push(array.slice(command[0]-1, command[1]).sort((x, y) =&gt; x - y)[command[2]-1]);
    }
    return result;
}</code></pre><h1 id="로직흐름">로직흐름</h1>
<p>n번째 숫자의 인덱스는 n-1이다.
따라서 array의 n번째 숫자부터 m번째 숫자까지 자르기 위해 slice을 이용한다면 
array.slice(n-1, m)이다.</p>
<p>commands를 순회한다. 
순회중인 요소가 command라면, 
array.slice(command[0]-1, command[1])해서 array중 잘라내고
이것을 sort로 오름차순 정렬한뒤, 
command[2]-1인덱스를 추출해서 최종적으로 반환할 배열에 추가한다.</p>
<p>순회를 마치고 배열을 반환한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2016년]]></title>
            <link>https://velog.io/@sunokryu_123/2016%EB%85%84</link>
            <guid>https://velog.io/@sunokryu_123/2016%EB%85%84</guid>
            <pubDate>Wed, 23 Aug 2023 11:41:24 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<p><img src="https://velog.velcdn.com/images/sunokryu_123/post/33f932d3-e2e4-4687-95bc-574a7070d37d/image.png" alt=""></p>
<h1 id="나의코드">나의코드</h1>
<pre><code>const solution = (a, b) =&gt; {
    const howManyDays = [31,29,31,30,31,30,31,31,30,31,30,31];
    const daysOfweek = [&#39;THU&#39;,&#39;FRI&#39;,&#39;SAT&#39;,&#39;SUN&#39;,&#39;MON&#39;,&#39;TUE&#39;,&#39;WED&#39;];
    const totalDays = howManyDays.slice(0, a-1).reduce((prev, curr) =&gt; prev+curr, 0) + b;
    return daysOfweek[totalDays % 7];
}</code></pre><h1 id="로직흐름">로직흐름</h1>
<p>howManyDays : 1월부터 12월까지 일수가 들어있는 배열
daysOfweek: 목, 금, 토, 일... 반환해야 하는 요일이 들어있는 배열.
단, 1번째 인덱스를 금요일로 뒀다. 그 이유는 총 일수를 7로 나누었을 때의 인덱스를 이용해서 곧바로 값을 반환하기 위해서이다. </p>
<blockquote>
<p>예)
    1월 8일일 때 1월부터 총 8일이므로, 8 &amp; 7 === 1 즉, daysOfweek[1]은 금요일이다.
    2월 26일 일 때 1월부터 총 32 + 26 = 58일 이므로, 58 % 7 === 2 즉, daysOfweek[2]은 토요일이다.</p>
</blockquote>
<p>totalDays : 1월부터 현재 날짜까지의 총 일수이다. 
이를 구하기 위해 howManyDays의 0부터 a-2인덱스까지를 뽑아내고 이를 모두 더한뒤 + b를 한 값이다.</p>
<blockquote>
<p>예)
    5월 8일 이라면 1,2,3,4월의 일수를 모두 더한뒤 8을 더해준 값이 총 수가 된다. </p>
</blockquote>
<p>총 일수 % 7이 찾고자하는 daysOfweek의 인덱스 값이고, daysOfweek에서 이 인덱스에 해당하는 요일을 반환하면된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[명예의 전당 (1)]]></title>
            <link>https://velog.io/@sunokryu_123/%EB%AA%85%EC%98%88%EC%9D%98-%EC%A0%84%EB%8B%B9-1</link>
            <guid>https://velog.io/@sunokryu_123/%EB%AA%85%EC%98%88%EC%9D%98-%EC%A0%84%EB%8B%B9-1</guid>
            <pubDate>Wed, 23 Aug 2023 11:18:18 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<p><img src="https://velog.velcdn.com/images/sunokryu_123/post/1fdf5c0c-c8f3-4fdd-b939-bb6c29c89362/image.png" alt=""></p>
<h1 id="나의코드">나의코드</h1>
<pre><code>const solution = (k, score) =&gt; {
    let lowHonor = [];
    let arrayOfHonor = [];
    for(let i = 0; i &lt; score.length; i++) {
        if (arrayOfHonor.length &lt; k) {
            arrayOfHonor.push(score[i]);
            lowHonor.push(Math.min(...arrayOfHonor));
            continue;
        } else {
            let minValueOfHonor = Math.min(...arrayOfHonor);
            if(minValueOfHonor &lt; score[i]) {
                arrayOfHonor.sort((x, y) =&gt; y - x).pop();
                arrayOfHonor.push(score[i]);   
            }
            lowHonor.push(arrayOfHonor.sort((x, y) =&gt; x - y)[0]);
        }
    }
    return lowHonor;
}</code></pre><h1 id="로직흐름">로직흐름</h1>
<ul>
<li>lowHonor : 명예의 전당에서 가장 작은 점수가 들어있는 배열</li>
<li>arrayOfHonor : 명예의 전당 </li>
</ul>
<ol>
<li><p>0번째 인덱스부터 score.length -1인덱스까지 반복한다.</p>
</li>
<li><p>만약 명예의 전당의 배열길이가 k(= 명예의 전당 요소의 개수)보다 작다면,
 -- arrayOfHonor에 현재 점수를 추가한다.
 -- arrayOfHonor에서 가장 작은 수를 lowHonor에 추가하고 다음 인덱스로 넘어간다.</p>
</li>
<li><p>만약 명예의 전당의 배열길이가 k라면, 명예의 전당에 꽉차 있다는 의미이다.
 -- 명예의 전당에서 가장 작은 점수를 구한다.
 -- 만약 이 점수보다 현재 score가 더 크다면, 
 arrayOfHonor를 내림차순으로 정렬한뒤, 가장 작은 값을 빼버리고 현재 점수를 추가한다. 
 -- 만약 현재 점수가 더 작다면 명예의 전당에 추가하지 않는다. 
 -- 현재 점수가 명예의 전당에서 가장 작은 점수보다 크든 작든, 
 lowHonor에 현재 명예의 전당에서 가장 작은 수를 추가한다.</p>
<ol start="4">
<li>순회를 마치고 lowHonor를 반환한다.</li>
</ol>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[추억 점수]]></title>
            <link>https://velog.io/@sunokryu_123/%EC%B6%94%EC%96%B5-%EC%A0%90%EC%88%98</link>
            <guid>https://velog.io/@sunokryu_123/%EC%B6%94%EC%96%B5-%EC%A0%90%EC%88%98</guid>
            <pubDate>Wed, 23 Aug 2023 10:47:43 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<p><img src="https://velog.velcdn.com/images/sunokryu_123/post/1afc4e80-f13a-4438-a76b-164f19d5f359/image.png" alt=""></p>
<h1 id="나의코드">나의코드</h1>
<pre><code>const solution = (name, yearning, photo) =&gt; {
    const nameYearningMap = new Map();
    for(let i = 0; i &lt; name.length; i++) {
        let value = 0;
        if(i &lt; yearning.length) {
            value = yearning[i];
        }
        nameYearningMap.set(name[i], value);
    }

    return photo.map((x, i) =&gt; {
       return x.reduce((prev, curr) =&gt; {
           if(!nameYearningMap.has(curr)) return prev;
           else return prev + nameYearningMap.get(curr);
       }, 0);
    })
}</code></pre><h1 id="로직흐름">로직흐름</h1>
<ol>
<li>name의 각 그리움 점수를 Map object에 저장한다.</li>
<li>1.에서 Map object에 저장할 때, 만약 name과 yearning의 배열의 길이가 다르다면, yearning이 없는 값은 0을 저장한다. </li>
<li>photo에 map메소드를 사용해서 각각의 요소의 그리움 합을 구한 것으로 값을 변경한다.
그리움 합을 구할 땐 reduce를 사용했다. 
만약 Map Object의 key값이 없는 요소가 있다면 해당 값은 0이라고 간주했다. </li>
<li>3.에서 요소가 바뀐 배열을 반환한다.</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[푸드 파이트 대회]]></title>
            <link>https://velog.io/@sunokryu_123/%ED%91%B8%EB%93%9C-%ED%8C%8C%EC%9D%B4%ED%8A%B8-%EB%8C%80%ED%9A%8C</link>
            <guid>https://velog.io/@sunokryu_123/%ED%91%B8%EB%93%9C-%ED%8C%8C%EC%9D%B4%ED%8A%B8-%EB%8C%80%ED%9A%8C</guid>
            <pubDate>Wed, 23 Aug 2023 02:18:11 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<p><img src="https://velog.velcdn.com/images/sunokryu_123/post/1a0bf7c1-d0ad-4db1-9381-705e36efbdb5/image.png" alt="">
<img src="https://velog.velcdn.com/images/sunokryu_123/post/05ec47f0-e1ad-4f32-88ae-dae7de75d387/image.png" alt=""></p>
<h1 id="나의코드">나의코드</h1>
<pre><code>const solution = (food) =&gt; {
    let leftResult = &#39;&#39;;
    food.forEach((x, i) =&gt; {
        if(i &gt;= 1) {
         leftResult += `${i}`.repeat(Math.floor(x/2));
        }
    });
   let rightResult = [...leftResult].reverse().join(&#39;&#39;);
   return leftResult + &#39;0&#39; + rightResult;
}</code></pre><h1 id="로직흐름">로직흐름</h1>
<p>반환값은 0을 기준으로 뒤집은 모습이다. 따라서, 0을 기준으로 왼쪽 문자열을 leftResult로 놓는다.
food의 1번째 인덱스부터 인덱스를 i라 놓고 끝인덱스까지 순회한다.
i가 몇번 반복되냐면, Math.floor(food[i]/2)번 반복된다. 
따라서 i를 문자열로 만들고 repeat 메소드를 이용해서 Math.floor(food[i]/2)번 반복한뒤 leftResult에 놓는다.
이렇게 순회를 마치면 0바로 직전까지의 leftResult가 만들어진다. 
이것을 배열로 바꾸고 reverse메소드, join메소드를 사용해서 뒤집은 다음 문자열로 바꾼 값을 rightResult로 놓는다. 
leftResult + &#39;0&#39; + rightResult을 반환한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[가장 가까운 같은 글자]]></title>
            <link>https://velog.io/@sunokryu_123/%EA%B0%80%EC%9E%A5-%EA%B0%80%EA%B9%8C%EC%9A%B4-%EA%B0%99%EC%9D%80-%EA%B8%80%EC%9E%90</link>
            <guid>https://velog.io/@sunokryu_123/%EA%B0%80%EC%9E%A5-%EA%B0%80%EA%B9%8C%EC%9A%B4-%EA%B0%99%EC%9D%80-%EA%B8%80%EC%9E%90</guid>
            <pubDate>Wed, 23 Aug 2023 01:46:49 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<p><img src="https://velog.velcdn.com/images/sunokryu_123/post/d9639db8-a0d5-45c5-965c-b8fd65f8247e/image.png" alt=""></p>
<h1 id="나의코드">나의코드</h1>
<pre><code>const solution = (s) =&gt; {
    let result = [];
    for(let i = 0; i &lt; s.length; i++) {
        let findIndex = s.slice(0, i).lastIndexOf(s[i]);
        if(findIndex !== -1){
            findIndex = i - findIndex;
        }
        result.push(findIndex);
    }
    return result;
}</code></pre><h1 id="로직흐름">로직흐름</h1>
<p>0인덱스부터 s.length-1까지 순회를 한다. 
s에서 가장 첫번째 요소부터 현재 인덱스 바로 직전까지 뽑아 낸 뒤, 여기서 해당 요소를 찾는다. 여기서 가장 마지막 인덱스를 반환한다. 만약 없으면 -1을 반환한다.
만약 찾은 인덱스 값이 -1이라면 바로 result배열에 추가를 하고, -1이 아니라면 현재 순회중인 인덱스에서 찾은 인덱스 값의 차를 result배열에 추가한다. 
순회를 마친 뒤, result배열을 반환한다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[두 개 뽑아서 더하기]]></title>
            <link>https://velog.io/@sunokryu_123/%EB%91%90-%EA%B0%9C-%EB%BD%91%EC%95%84%EC%84%9C-%EB%8D%94%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@sunokryu_123/%EB%91%90-%EA%B0%9C-%EB%BD%91%EC%95%84%EC%84%9C-%EB%8D%94%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 23 Aug 2023 01:23:48 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<p><img src="https://velog.velcdn.com/images/sunokryu_123/post/c80786bf-a13d-40b4-977e-631c3b14cfcd/image.png" alt=""></p>
<h1 id="나의코드">나의코드</h1>
<pre><code>const solution = (numbers) =&gt; {

    let sumList = [];
    for(let i = 0; i&lt; numbers.length -1; i++) {
        for(let j = i+1; j &lt; numbers.length; j++) {
            sumList.push(numbers[i] + numbers[j]);
        }
    }

    const uniqueSumListSet = new Set(sumList);
    return [...uniqueSumListSet].sort((x, y) =&gt; x - y);
}</code></pre><h1 id="로직흐름">로직흐름</h1>
<p>numbers에서 두개의 요소를 선택하고 이것의 합을 배열에 저장해나간다.
이 배열을 Set Object를 이용해서 동일 요소를 제거한뒤, sort를 이용해서 오름차순으로 정렬한다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[문자열 내 마음대로 정렬하기]]></title>
            <link>https://velog.io/@sunokryu_123/%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%82%B4-%EB%A7%88%EC%9D%8C%EB%8C%80%EB%A1%9C-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@sunokryu_123/%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%82%B4-%EB%A7%88%EC%9D%8C%EB%8C%80%EB%A1%9C-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 23 Aug 2023 01:16:30 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<p><img src="https://velog.velcdn.com/images/sunokryu_123/post/0f97cf3a-52a6-442b-94ce-287b641e54ab/image.png" alt=""></p>
<h1 id="나의코드">나의코드</h1>
<pre><code>const solution = (strings, n) =&gt; {
    return strings.sort((x, y) =&gt; {
        if(x[n] &gt; y[n]) return 1;
        else if(x[n] &lt; y[n]) return -1;
        else {
            if(x &gt; y) return 1;
            else if(x &lt; y) return -1;
        }
    })
}</code></pre><h1 id="로직흐름">로직흐름</h1>
<p>n번째 인덱스로 오름차순 정렬을 한다. 
만약 n번째 인덱스의 값이 같다면, 문자열을 비교해서 사전순으로 정렬을 한다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[1차] 비밀지도]]></title>
            <link>https://velog.io/@sunokryu_123/1%EC%B0%A8-%EB%B9%84%EB%B0%80%EC%A7%80%EB%8F%84</link>
            <guid>https://velog.io/@sunokryu_123/1%EC%B0%A8-%EB%B9%84%EB%B0%80%EC%A7%80%EB%8F%84</guid>
            <pubDate>Tue, 22 Aug 2023 05:44:39 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<p><img src="https://velog.velcdn.com/images/sunokryu_123/post/a88fa1a1-b6e4-4b90-9794-8cbe234431d8/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sunokryu_123/post/022258c2-c5b8-4563-85c6-c848e8e65c5d/image.png" alt=""></p>
<h1 id="나의코드">나의코드</h1>
<pre><code>const solution = (n, arr1, arr2) =&gt; {
    // 암호화된 숫자를 해독해야 한다.
    // 하나라도 &#39;#&#39;(1)벽이면 그 자리는 1이다. 
    // 둘다 &#39; &#39;공백(0)이면 그 자리는 0이다.
    let newArr1 = arr1.map((x) =&gt; {
        let newX = x.toString(2);
        if(newX.length &lt; n) {
          newX = &#39;0&#39;.repeat(n-newX.length) + newX;
        }
        return newX;
    });

    let newArr2 = arr2.map((x) =&gt; {
        let newX = x.toString(2);
        if(newX.length &lt; n) {
          newX = &#39;0&#39;.repeat(n-newX.length) + newX;
        }
        return newX;
    });

    return newArr1.map((x, i) =&gt; {
        let newX = &#39;&#39;;
        for(let indexOfStr = 0; indexOfStr &lt; n; indexOfStr++) {
            Number(x[indexOfStr]) || Number(newArr2[i][indexOfStr]) ? newX += &#39;#&#39; : newX += &#39; &#39;;
        }
        return newX;
    })
}</code></pre><h1 id="로직흐름">로직흐름</h1>
<p> arr1 각각의 요소를 2진수로 바꾼 배열 newArr1을 만든다.
 단, newArr1의 모든 요소는 n의 자리인 2진수여야 한다. 바꾼 2진수의 길이가 n개보다 작다면 부족한만큼 앞에 0을 붙인다. </p>
<p>마찬가지로 arr2에서도 위와 동일한 방법으로 newArr2를 만든다. </p>
<p>newArr1와 newArr2의 요소를 순회하면서 해당 요소를 또 다시한번 순회해서 이루고 있는 0,1 이 두가지로 구성된 요소 안 요소를 뜯어본다.
만약
0 || 0 -&gt; 0
1 || 0 -&gt; 1
0 || 1 -&gt; 1
1 || 1 -&gt; 1
위의 상황중 어떤 상황인지 확인하고 1이라면 &#39;#&#39;, 0이라면 공백(&#39; &#39;)으로 요소 안 요소를 하나씩 바꿔나간다. </p>
<p>가장 바깥 순회까지 모두 마친 뒤, 새로 만들어진 배열을 반환한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[소수 만들기]]></title>
            <link>https://velog.io/@sunokryu_123/%EC%86%8C%EC%88%98-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@sunokryu_123/%EC%86%8C%EC%88%98-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Tue, 22 Aug 2023 04:59:00 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<p><img src="https://velog.velcdn.com/images/sunokryu_123/post/15f52e03-370d-4d3f-b484-5a3e078cfd19/image.png" alt=""></p>
<h1 id="나의코드">나의코드</h1>
<pre><code>const solution = (nums) =&gt; {
    let count = 0;
    for(let leftIndex = 0; leftIndex &lt;= nums.length-3; leftIndex++) {
        for(let centerIndex = leftIndex+1; centerIndex &lt;= nums.length -2; centerIndex++) {
            let rightIndex = centerIndex+1;
            while(rightIndex !== nums.length) {
                let sum = nums[leftIndex] + nums[centerIndex] + nums[rightIndex];
                for(let i = sum -1; i &gt; 1; i--) {
                    if(sum % i === 0) {
                        break;
                    }

                    if(i === 2) count++;
                }
                rightIndex++;
            }
        }
    }
    return count;
}</code></pre><h1 id="로직흐름">로직흐름</h1>
<p>leftIndex, centerIndex, rightIndex를 정한다.
leftIndex하나를 고정으로 두고 그 안에서 centerIndex를 고정으로 두고 rightIndex를 움직이는 반복을 끝까지 한다. 
해당 인덱스들의 합이 소수라면 카운트한다. 
모든 순회를 마치고 소수를 카운트 한 값을 반환한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[숫자 문자열과 영단어]]></title>
            <link>https://velog.io/@sunokryu_123/%EC%88%AB%EC%9E%90-%EB%AC%B8%EC%9E%90%EC%97%B4%EA%B3%BC-%EC%98%81%EB%8B%A8%EC%96%B4-lhmsyltw</link>
            <guid>https://velog.io/@sunokryu_123/%EC%88%AB%EC%9E%90-%EB%AC%B8%EC%9E%90%EC%97%B4%EA%B3%BC-%EC%98%81%EB%8B%A8%EC%96%B4-lhmsyltw</guid>
            <pubDate>Tue, 22 Aug 2023 04:44:58 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<p><img src="https://velog.velcdn.com/images/sunokryu_123/post/465cfdcc-363b-4686-891e-61496ecea072/image.png" alt=""></p>
<h1 id="나의코드">나의코드</h1>
<pre><code>const solution = (s) =&gt; {
    const matchingObj = {
        &#39;zero&#39;: 0,
        &#39;one&#39;: 1,
        &#39;two&#39;: 2,
        &#39;three&#39;: 3,
        &#39;four&#39;: 4,
        &#39;five&#39;: 5,
        &#39;six&#39;: 6,
        &#39;seven&#39;: 7,
        &#39;eight&#39;: 8,
        &#39;nine&#39;: 9
    }
    Object.keys(matchingObj).forEach((x, i) =&gt; {
       s = s.replaceAll(x, matchingObj[x]);
    })
    return Number(s);
}</code></pre><h1 id="로직흐름">로직흐름</h1>
<p>matchingObj : 문자열 숫자를 키로 두고, 숫자를 값으로 두어진 obj이다.</p>
<p>matchingObj의 key들을 순회하면서 
s에서 현재 순회중인 key를 모두 숫자로 바꾸면서 s를 업데이트한다.</p>
<p>순회를 마치고 변경된 s를 반환한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[시저 암호]]></title>
            <link>https://velog.io/@sunokryu_123/%EC%8B%9C%EC%A0%80-%EC%95%94%ED%98%B8</link>
            <guid>https://velog.io/@sunokryu_123/%EC%8B%9C%EC%A0%80-%EC%95%94%ED%98%B8</guid>
            <pubDate>Tue, 22 Aug 2023 04:25:46 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<p><img src="https://velog.velcdn.com/images/sunokryu_123/post/04c092e2-bed8-4542-9c26-d82372d0abb4/image.png" alt=""></p>
<h1 id="나의코드">나의코드</h1>
<pre><code>const solution = (s,n) =&gt; {
    const lowerCase = &#39;abcdefghijklmnopqrstuvwxyz&#39;;
    const upperCase = lowerCase.toUpperCase();
    return [...s].map((x) =&gt; {
        if(x === &#39; &#39;) return x;
        let isUpper = lowerCase.indexOf(x) === -1;
        let index = isUpper ? upperCase.indexOf(x) : lowerCase.indexOf(x);
        let newIndex = (index + n) % 26;
        return isUpper ? upperCase[newIndex] : lowerCase[newIndex];
    }).join(&#39;&#39;);
}</code></pre><h1 id="로직흐름">로직흐름</h1>
<p>lowerCase : 소문자 a<del>z
upperCase : 대문자 A</del>Z
s를 배열로 만들어서 순회를 한다. 
만약 현재 요소가 공백이라면 요소를 바꾸지 않는다.
현재 요소가 대문자인지 소문자인지 파악한다.
대문자라면 upperCase에서 소문자라면 lowerCase에서 해당 요소가 몇번째 있는지 찾는다.
그 인덱스에 n을 더하고 이 값을 알파벳 개수인 26으로 나눈 뒤, 그 나머지를 새로운 인덱스로 잡는다.
대문자라면 upperCase에서, 소문자라면 lowerCase에서 바로 위에서 구한 새로운 인덱스 값으로 현재 요소를 바꿔준다. 
순회를 마치고 배열을 문자열로 바꾼뒤 반환한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[🤔[완전탐색] - 최소직사각형]]></title>
            <link>https://velog.io/@sunokryu_123/%EC%99%84%EC%A0%84%ED%83%90%EC%83%89-%EC%B5%9C%EC%86%8C%EC%A7%81%EC%82%AC%EA%B0%81%ED%98%95</link>
            <guid>https://velog.io/@sunokryu_123/%EC%99%84%EC%A0%84%ED%83%90%EC%83%89-%EC%B5%9C%EC%86%8C%EC%A7%81%EC%82%AC%EA%B0%81%ED%98%95</guid>
            <pubDate>Tue, 22 Aug 2023 04:04:14 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<p><img src="https://velog.velcdn.com/images/sunokryu_123/post/1ea1c88d-8fc5-46c8-94e7-9187fa828504/image.png" alt=""></p>
<h1 id="나의코드">나의코드</h1>
<h1 id="로직흐름">로직흐름</h1>
]]></description>
        </item>
        <item>
            <title><![CDATA[크기가 작은 부분문자열]]></title>
            <link>https://velog.io/@sunokryu_123/%ED%81%AC%EA%B8%B0%EA%B0%80-%EC%9E%91%EC%9D%80-%EB%B6%80%EB%B6%84%EB%AC%B8%EC%9E%90%EC%97%B4</link>
            <guid>https://velog.io/@sunokryu_123/%ED%81%AC%EA%B8%B0%EA%B0%80-%EC%9E%91%EC%9D%80-%EB%B6%80%EB%B6%84%EB%AC%B8%EC%9E%90%EC%97%B4</guid>
            <pubDate>Tue, 22 Aug 2023 03:39:46 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<p><img src="https://velog.velcdn.com/images/sunokryu_123/post/31d1a80a-574d-4a86-a087-32bf4d209d9e/image.png" alt=""></p>
<h1 id="나의코드">나의코드</h1>
<pre><code>const solution = (t, p) =&gt; {
    // 뽑아내는 수의 마지막인덱스 : p.length -1 ~ 끝까지
    // 각각의 수의 첫번째 인덱스 : 마지막인덱스 - (p.length - 1)
    let result = 0;
    for(let selectNumberLastIndex = p.length -1; selectNumberLastIndex &lt; t.length; selectNumberLastIndex++) {
        let selectNumberFirstIndex = selectNumberLastIndex - (p.length -1);
        if(Number(t.slice(selectNumberFirstIndex, selectNumberLastIndex+1)) &lt;= Number(p)) result+=1;
    }
    return result;
}</code></pre><h1 id="로직흐름">로직흐름</h1>
<ul>
<li>뽑아내는 수의 마지막인덱스는 p.length -1 부터 t.length-1까지이다. </li>
<li>뽑아내는 수의 첫번째 인덱스는 : 해당 수의 마지막인덱스 - (p.length -1)이다.</li>
</ul>
<ul>
<li>마지막인덱스를 기준으로 반복문을 돌려서</li>
<li>수를 뽑아낸다. 이 수와 p를 비교해서 이 수가 p보다 작거나 같으면 최종적으로 반환해줄 변수의 값을 +1하면서 개수를 센다. </li>
</ul>
]]></description>
        </item>
    </channel>
</rss>