<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>sarah_.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Sat, 03 Dec 2022 06:42:38 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>sarah_.log</title>
            <url>https://velog.velcdn.com/images/sarah_/profile/2d3ae172-5d93-4a03-bc93-a98ec0f1df64/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. sarah_.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/sarah_" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[TypeScript] 인터페이스(Interface)]]></title>
            <link>https://velog.io/@sarah_/TypeScript-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4Interface</link>
            <guid>https://velog.io/@sarah_/TypeScript-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4Interface</guid>
            <pubDate>Sat, 03 Dec 2022 06:42:38 GMT</pubDate>
            <description><![CDATA[<h2 id="인터페이스">인터페이스</h2>
<p>상호 간에 정의한 약속 또는 규칙.</p>
<h3 id="인터페이스-사용해보기">인터페이스 사용해보기</h3>
<p><code>getStudentDetails</code>라는 함수의 반환구조가 객체로 되어 있다고 가정해보자.</p>
<p><img src="https://velog.velcdn.com/images/sarah_/post/e4c765bd-4a53-41a0-92c3-9ec3c8f8db0d/image.png" alt=""></p>
<p><code>Student</code>라는 인터페이스를 생성해보았다.
인터페이스의 이름은 <code>대문자</code>로 시작한다.
<img src="https://velog.velcdn.com/images/sarah_/post/0ea41738-ab43-480f-9f7d-99b101434832/image.png" alt=""></p>
<p>완성된 인터페이스는 타입으로써 사용이 가능하다.
하기와 같이 <code>getStudentDetails</code> 함수의 반환 타입을<code>Student</code>라는 인터페이스로 지정해 줄 수 있다.
<img src="https://velog.velcdn.com/images/sarah_/post/e34fae1b-ac1c-4acb-b93b-398ff2171f48/image.png" alt=""></p>
<h3 id="선택적-프로퍼티">선택적 프로퍼티</h3>
<p>인터페이스를 타입으로 가지는 값은 인터페이스의 구조를 그 값으로 가지도록 강제된다. </p>
<blockquote>
<p>이 말의 의미는 함수의 리턴값은 인터페이스의 프로퍼티를 모두 포함한 객체로 리턴해주어야 한다는 뜻이다.</p>
</blockquote>
<p>❗️ 만약 인터페이스에서 선언된 <code>age</code>프로퍼티가 함수 리턴값에 포함되지 않는다면 하기와 같은 에러를 일으킬 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/sarah_/post/022ed427-c82e-42be-8ec8-ebe512550929/image.png" alt=""></p>
<blockquote>
<p>이러한 인터페이스를 조금 더 유연하게 사용하려면 인터페이스 <code>age</code> 프로퍼티 뒤에 <code>?</code>를 붙이면 된다. 
✏️ 함수의 반환값에 <code>age</code> 프로퍼티가 포함되지 않아도 된다.
✏️ 선택적 프로퍼티가 된다.
<img src="https://velog.velcdn.com/images/sarah_/post/7976e9ad-953a-4068-810e-d584ecc7a9e2/image.png" alt=""></p>
</blockquote>
<h3 id="코드의-재사용">코드의 재사용</h3>
<p>아래와 같이 <code>Student</code> 인터페이스를 재사용하여 새로운 함수에 활용할 수 있다.
<img src="https://velog.velcdn.com/images/sarah_/post/7e4b2f31-8000-4fc5-8ea2-5146d064d7cf/image.png" alt=""></p>
<h3 id="인터페이스와-메소드">인터페이스와 메소드</h3>
<p>메소드는 객체내에서 선언된 함수이다.
하기와 같이 두개의 syntax 사용이 가능하다</p>
<p><img src="https://velog.velcdn.com/images/sarah_/post/a4b56b48-4ebf-4008-ae50-7b4958d42478/image.png" alt=""></p>
<p><code>addComment</code>라는 메소드는 <code>comment</code>라는 string 타입의 매개변수를 가지며 string 값을 반환한다.</p>
<h3 id="readonly-프로퍼티">Readonly 프로퍼티</h3>
<p>읽기 전용 프로퍼티는 객체 생성시 할당된 프로퍼티의 값을 바꿀 수 없다. 
아래와 같이 프로퍼티 앞에 <code>readonly</code> 값을 추가하여 사용할 수 있고, 이 값을 수정하려 하면 에러가 뜨게 된다.
<img src="https://velog.velcdn.com/images/sarah_/post/3aaace12-4f90-4950-ac41-994845f35416/image.png" alt=""><img src="https://velog.velcdn.com/images/sarah_/post/961581c2-f045-4a9b-831f-adecdea37ec1/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TypeScript] 타입 추론, 타입 명시]]></title>
            <link>https://velog.io/@sarah_/TypeScript-%ED%83%80%EC%9E%85-%EC%B6%94%EB%A1%A0-%ED%83%80%EC%9E%85-%EB%AA%85%EC%8B%9C</link>
            <guid>https://velog.io/@sarah_/TypeScript-%ED%83%80%EC%9E%85-%EC%B6%94%EB%A1%A0-%ED%83%80%EC%9E%85-%EB%AA%85%EC%8B%9C</guid>
            <pubDate>Fri, 25 Nov 2022 13:29:20 GMT</pubDate>
            <description><![CDATA[<h2 id="타입-추론type-inference">타입 추론(type inference)</h2>
<p>자바스크립트와는 다르게 타입스크립트는 재할당 시 타입 제한을 받는다. 타입 추론에 의해 암묵적으로 변수 타입을 추론하기 때문이다.</p>
<pre><code class="language-js">let a = 5; // 타입 추론에 의해 a는 자동으로 number 타입이 된다.
a = &quot;hello&quot;;</code></pre>
<p>위 상황일 때 자바스크립트는 문제 없이 재할당이 가능하지만,
타입스크립트의 경우 아래와 같은 에러가 난다.</p>
<p>❗️ 재할당하려는 변수값이 숫자가 아니기 때문에 a 변수에 할당 될 수 없다.
<img src="https://velog.velcdn.com/images/sarah_/post/09438606-b002-4494-94db-b7ad83c23374/image.png" alt=""></p>
<p>타입스크립트에서는 변수에 타입이 지정되지 않은 경우 타입 정보를 제공하기 위해서 <code>타입 추론</code>을 한다.</p>
<blockquote>
<p>즉, 타입스크립트는 타입 표기가 없는 경우 코드를 읽고 분석하여 타입을 유추해 낼 수 있다.</p>
</blockquote>
<pre><code class="language-js">// 객체의 각 key값의 value값으로 타입을 추론
let student = {
  name: &quot;sarah&quot;,
  course: &quot;typescript&quot;,
  codingIQ: 80,
  code: function () {
    console.log(&quot;hi! typescript&quot;);
  },
};</code></pre>
<pre><code class="language-js">function calculate(score) { // score가 number 타입임을 추론
  return 100 - score;
}</code></pre>
<hr>
<h2 id="타입-명시">타입 명시</h2>
<p>변수를 선언할 때, 변수 값의 타입을 명시함으로써 변수값의 데이터 타입을 지정하는 것.</p>
<pre><code class="language-js">let studentID: number = 1234;
let studentName: string = &quot;sarah&quot;;
let age: number = 21;</code></pre>
<p>함수를 선언 할 때에는 매개변수, 함수 리턴값의 타입도 지정해 줄 수 있다.
만약 함수의 리턴값이 따로 없을 경우에는 <code>void</code> 타입을 지정해주면 된다.</p>
<p>만약에 리턴값이 존재하는 경우 하기와 같이 반환되는 객체의 구조를 타입으로 지정해 줄 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/sarah_/post/6c8a01e6-8e7c-4b97-9b8a-a539e998e7d9/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TypeScript] 특징 및 세팅]]></title>
            <link>https://velog.io/@sarah_/TypeScript</link>
            <guid>https://velog.io/@sarah_/TypeScript</guid>
            <pubDate>Fri, 25 Nov 2022 12:57:42 GMT</pubDate>
            <description><![CDATA[<p>채용 공고를 보면서 타입스크립트의 비중이 무척 크다는 것을 느꼈다. 
🐤 여태까지 미뤄왔던 타입스크립트 공부를 꾸준히 해보려고 한다. (가능하겠지..?)</p>
<hr>
<img src="https://velog.velcdn.com/images/sarah_/post/9b410430-36a0-46dd-a327-d046845184b4/image.png" width="350">


<blockquote>
<p>타입스크립트는 자바스크립트에 비해서 버그를 줄임과 동시에 유지보수가 쉽고, 질 좋은 코드를 작성할 수 있는 장점이 있다. 프로그래밍 언어인 동시에 컴파일러라고 볼 수 있다. (타입스크립트 -&gt; 자바스크립트로 컴파일)</p>
</blockquote>
<h3 id="타입스크립트-특징">타입스크립트 특징</h3>
<ul>
<li>변수 값에 데이터 타입 지정이 가능하다.<pre><code class="language-js">function add(a: number, b: number) {
return a + b;
}
</code></pre>
</li>
</ul>
<p>console.log(add(&quot;3&quot;, &quot;5&quot;)); // 8</p>
<p>```</p>
<ul>
<li><p>class와 interface의 특징을 지원함으로써 객체지향 프로그래밍 환경을 제공한다.</p>
</li>
<li><p>컴파일 타임 오류</p>
<ul>
<li>타입스크립트로 그 자체로 브라우저에서 실행 될 수 없으므로 자바스크립트로 다시 컴파일 되어야 한다. 이 과정에서 오류를 캐치할 수 있다.</li>
</ul>
</li>
</ul>
<ul>
<li>ES6에서 제공하는 모듈 선언과 모듈 호출 방식을 지원한다.</li>
</ul>
<hr>
<h3 id="타입스크립트-세팅">타입스크립트 세팅</h3>
<p>먼저 npm을 사용하여 타입스크립트를 전역으로 설치 한다.</p>
<blockquote>
<p>npm install -g typescript</p>
</blockquote>
<p>설치가 완료 되면 tsc라는 타입스크립트 명령어를 실행할 수 있게 된다. 
하기 명령어를 사용하여 프로젝트 내 <code>tsconfig.json</code> 파일을 생성한다.  <code>tsconfig.json</code>파일은 컴파일러의 옵션을 설정할 수 있다.</p>
<blockquote>
<p>tsx --init</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/sarah_/post/57c9442a-b580-4b13-8e98-7d0e9982b8a1/image.png" alt=""><img src="https://velog.velcdn.com/images/sarah_/post/69afd594-349a-44a7-a8a3-5e0710fe49db/image.png" alt=""></p>
<p>후에 index.html 과 app.ts 파일을 만들어 실행을 해보면, 아래처럼 에러가 난다!
<img src="https://velog.velcdn.com/images/sarah_/post/78068dc3-2e3c-408b-bb88-68bd900042ed/image.png" alt=""></p>
<p>이유는 <strong>브라우저가 .ts확장자 파일을 인지하지 못하기 때문이다.</strong>
이를 해결하려면 자바스크립트로 컴파일을 해준 후 실행 해주어야 한다.</p>
<p>자바스크립트로 컴파일된 파일을 만들기 위해 하기 명령어를 실행 해 준다.</p>
<blockquote>
<p>tsc app.ts</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/sarah_/post/2f1b80bf-0afe-4470-b5ed-160f2bad70f5/image.png" alt=""></p>
<p>이렇게 컴파일 된 app.ts를 실행해보면 정상 작동하게 된다.
<img src="https://velog.velcdn.com/images/sarah_/post/4a8f573b-5199-445d-bae2-5c4f9b6b9dee/image.png" alt=""></p>
<hr>
<h3 id="만약-appts파일에서-변경점이-있을-때-자동으로-appjs에-반영되게-하고-싶다면">만약, app.ts파일에서 변경점이 있을 때 자동으로 app.js에 반영되게 하고 싶다면</h3>
<blockquote>
<p>tsx -w</p>
</blockquote>
<p>명령어를 사용하면 감시모드의 컴파일 프로세스가 시작되면서 자동으로 변경사항이 반영되게 된다!</p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[daily 알고리즘 : 프로그래머스 1 level 18일차]]></title>
            <link>https://velog.io/@sarah_/daily-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-1-level-18%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@sarah_/daily-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-1-level-18%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Tue, 22 Nov 2022 09:06:10 GMT</pubDate>
            <description><![CDATA[<h1 id="나머지가-1이-되는-수-찾기">나머지가 1이 되는 수 찾기</h1>
<br>

<h2 id="문제">문제</h2>
<p>자연수 n이 매개변수로 주어집니다. n을 x로 나눈 나머지가 1이 되도록 하는 가장 작은 자연수 x를 return 하도록 solution 함수를 완성해주세요. 답이 항상 존재함은 증명될 수 있습니다.</p>
<br>

<h2 id="제한사항">제한사항</h2>
<ul>
<li>3 ≤ n ≤ 1,000,000</li>
</ul>
<br>

<h2 id="입출력-예">입출력 예</h2>
<ul>
<li>10을 3으로 나눈 나머지가 1이고, 3보다 작은 자연수 중에서 문제의 조건을 만족하는 수가 없으므로, 3을 return 해야 합니다.</li>
</ul>
<h2 id="풀이">풀이</h2>
<pre><code class="language-javascript">function solution(n) {
  let i = 1;
  while (i &lt;= n) {
    if (n % i === 1) {
      return i;
    }
    i++;
  }
}</code></pre>
<hr>
<h1 id="가운데-글자-가져오기">가운데 글자 가져오기</h1>
<br>

<h2 id="문제-1">문제</h2>
<p>단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다.</p>
<br>

<h2 id="제한사항-1">제한사항</h2>
<ul>
<li>s는 길이가 1 이상, 100이하인 스트링입니다.</li>
</ul>
<br>

<h2 id="입출력-예-1">입출력 예</h2>
<ul>
<li>&quot;abcde&quot;의 출력은 &quot;c&quot;</li>
</ul>
<br>

<h2 id="풀이-1">풀이</h2>
<pre><code class="language-javascript">function solution(s) {
  let middle = ~~(s.length / 2);
  return s.length % 2 === 0 ? `${s[middle - 1]}${s[middle]}` : s[middle];
}</code></pre>
<br>

<hr>
<h1 id="행렬의-덧셈">행렬의 덧셈</h1>
<br>

<h2 id="문제-2">문제</h2>
<p>행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.</p>
<br>

<h2 id="제한사항-2">제한사항</h2>
<ul>
<li>행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않습니다.</li>
</ul>
<br>

<h2 id="입출력-예-2">입출력 예</h2>
<ul>
<li>[[1,2],[2,3]]    [[3,4],[5,6]] =&gt;    [[4,6],[7,9]]</li>
</ul>
<br>

<h2 id="풀이-2">풀이</h2>
<pre><code class="language-javascript">function solution(arr1, arr2) {
  let firstArr = [];
  let answer = [];
  for (let i = 0; i &lt; arr1.length; i++) {
    for (let j = 0; j &lt; arr1[i].length; j++) {
      firstArr.push(arr1[i][j] + arr2[i][j]);
    }
    answer.push(firstArr);
    firstArr = [];
  }
  return answer;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[daily 알고리즘 : 프로그래머스 0 level 17일차]]></title>
            <link>https://velog.io/@sarah_/daily-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-0-level-17%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@sarah_/daily-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-0-level-17%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Fri, 18 Nov 2022 08:52:09 GMT</pubDate>
            <description><![CDATA[<h1 id="문자열-계산하기">문자열 계산하기</h1>
<br>

<h2 id="문제">문제</h2>
<p>my_string은 &quot;3 + 5&quot;처럼 문자열로 된 수식입니다. 문자열 my_string이 매개변수로 주어질 때, 수식을 계산한 값을 return 하는 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항">제한사항</h2>
<ul>
<li>연산자는 +, -만 존재합니다.</li>
<li>문자열의 시작과 끝에는 공백이 없습니다.</li>
<li>0으로 시작하는 숫자는 주어지지 않습니다.</li>
<li>잘못된 수식은 주어지지 않습니다.</li>
<li>5 ≤ my_string의 길이 ≤ 100</li>
<li>my_string을 계산한 결과값은 1 이상 100,000 이하입니다.<ul>
<li>my_string의 중간 계산 값은 -100,000 이상 100,000 이하입니다.</li>
<li>계산에 사용하는 숫자는 1 이상 20,000 이하인 자연수입니다.</li>
<li>my_string에는 연산자가 적어도 하나 포함되어 있습니다.</li>
</ul>
</li>
<li>return type 은 정수형입니다.</li>
<li>my_string의 숫자와 연산자는 공백 하나로 구분되어 있습니다.</li>
</ul>
<br>

<h2 id="입출력-예">입출력 예</h2>
<ul>
<li>3 + 4 = 7을 return 합니다.</li>
</ul>
<h2 id="풀이">풀이</h2>
<p>부호와 숫자 배열을 따로 나누어 계산을 해주었다.</p>
<pre><code class="language-javascript">function solution(my_string) {
  let answer = my_string.split(&quot; &quot;);
  let number = answer.filter((el) =&gt; el !== &quot;+&quot; &amp;&amp; el !== &quot;-&quot;);
  let etc = answer.filter((el) =&gt; el === &quot;+&quot; || el === &quot;-&quot;);
  let res = Number(number[0]);

  for (let i = 0; i &lt; etc.length; i++) {
    if (etc[i] === &quot;+&quot;) {
      res += Number(number[i + 1]);
    } else {
      res -= Number(number[i + 1]);
    }
  }
  return res;
}</code></pre>
<hr>
<h1 id="최댓값-만들기2">최댓값 만들기(2)</h1>
<br>

<h2 id="문제-1">문제</h2>
<p>정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return하도록 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항-1">제한사항</h2>
<ul>
<li>-10,000 ≤ numbers의 원소 ≤ 10,000</li>
<li>2 ≤ numbers 의 길이 ≤ 100</li>
</ul>
<br>

<h2 id="입출력-예-1">입출력 예</h2>
<ul>
<li>두 수의 곱중 최댓값은 10 * 24 = 240 입니다.</li>
</ul>
<br>

<h2 id="풀이-1">풀이</h2>
<pre><code class="language-javascript">function solution(my_string) {
  let result = [];
  for (let i = 0; i &lt; my_string.length - 1; i++) {
    for (let j = i + 1; j &lt; my_string.length; j++) {
      result.push(my_string[i] * my_string[j]);
    }
  }
  return Math.max(...result);
}</code></pre>
<br>

<hr>
<h1 id="이진수-더하기">이진수 더하기</h1>
<br>

<h2 id="문제-2">문제</h2>
<p>이진수를 의미하는 두 개의 문자열 bin1과 bin2가 매개변수로 주어질 때, 두 이진수의 합을 return하도록 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항-2">제한사항</h2>
<ul>
<li>return 값은 이진수를 의미하는 문자열입니다.</li>
<li>1 ≤ bin1, bin2의 길이 ≤ 10</li>
<li>bin1과 bin2는 0과 1로만 이루어져 있습니다.</li>
<li>bin1과 bin2는 &quot;0&quot;을 제외하고 0으로 시작하지 않습니다.</li>
</ul>
<br>

<h2 id="입출력-예-2">입출력 예</h2>
<ul>
<li>1001 + 1111 = 11000 이므로 &quot;11000&quot;을 return합니다.</li>
</ul>
<br>

<h2 id="풀이-2">풀이</h2>
<p><code>parseInt</code>와 <code>toString</code>으로 간단하게 푸는 방법도 있었지만 노가다를 해보았다.</p>
<p>10진수로 변환하여 더한 후 이진수로 다시 변환해주었다.</p>
<pre><code class="language-javascript">function solution(bin1, bin2) {
  let rev1 = [...bin1].reverse();
  let rev2 = [...bin2].reverse();
  let res1 = 0;
  let res2 = 0;

  for (let i = 0; i &lt; bin1.length; i++) {
    res1 += Number(rev1[i] * 2 ** i);
  }
  for (let i = 0; i &lt; bin2.length; i++) {
    res2 += Number(rev2[i] * 2 ** i);
  }

  let sum = res1 + res2;
  let answer = &quot;&quot;;

  if (res1 === 0 || res2 === 0) {
    answer = &quot;0&quot;;
  }

  while (sum &gt;= 1) {
    if (sum === 0) return 0;
    answer += sum % 2;
    sum = ~~(sum / 2);
  }
  return [...answer].reverse().join(&quot;&quot;);
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[daily 알고리즘 : 프로그래머스 0 level 16일차]]></title>
            <link>https://velog.io/@sarah_/daily-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-0-level-16%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@sarah_/daily-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-0-level-16%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Thu, 17 Nov 2022 10:35:29 GMT</pubDate>
            <description><![CDATA[<h1 id="겹치는-선분의-길이">겹치는 선분의 길이</h1>
<br>

<h2 id="문제">문제</h2>
<p>빨간색, 초록색, 파란색 선분이 x축 위에 있습니다. 세 선분의 x좌표 시작과 끝이 [[start, end], [start, end], [start, end]] 형태로 들어있는 2차원 배열 lines가 매개변수로 주어질 때, 두 개 이상의 선분이 겹치는 부분의 길이를return 하도록 solution 함수를 완성해보세요.</p>
<br>

<h2 id="제한사항">제한사항</h2>
<ul>
<li>lines의 길이 = 3</li>
<li>lines의 원소의 길이 = 2</li>
<li>모든 선분은 길이가 1 이상입니다.</li>
<li>lines의 원소는 [a, b] 형태이며, a, b는 각각 양 끝점 중 하나입니다.</li>
<li>-100 ≤ a &lt; b ≤ 100</li>
</ul>
<br>

<h2 id="입출력-예">입출력 예</h2>
<ul>
<li>초록색과 파란색 선분이 [2, 5], [3, 9]로 [3, 5]만큼 겹쳐있으므로 2를 return 합니다.</li>
</ul>
<h2 id="풀이">풀이</h2>
<p>너무 정신없이 풀었다..</p>
<p>lines [[0, 1], [2, 5], [3, 9]] 가 주어졌다고 가정한다.</p>
<p>arr 배열에는 [&quot;01&quot;, &quot;23&quot;, &quot;34&quot;, &quot;45&quot;, &quot;34&quot;, &quot;45&quot;, &quot;56&quot;, &quot;67&quot;, &quot;78&quot;, &quot;89&quot;] 모든 경우의 선분을 할당하였다.</p>
<p>주어진 배열에서 max값과 min값을 찾기 위해 allLines 배열에 lines에 있는 값을 전부 풀어서 배열로 넣어주었다.</p>
<p>whole 배열에는 min부터 max값까지의 모든 경우의 선분을 할당해주었다.</p>
<p>resObj는 각 선분마다 몇번 겹쳤는지 카운트하는 객체이다.</p>
<p>resObj의 value가 2 이상인 key 값이 있을 경우 count++ 를 해주어 최종 리턴해 주었다.</p>
<p>다른 사람 풀이를 보니 변수도 적게쓰고 매우 간단하게 풀던데, 다시 한번 리팩토링을 해봐야겠다.</p>
<pre><code class="language-javascript">function solution(lines) {
  let arr = []; 
  let allLines = [];
  let whole = [];
  let count = 0;
  let resObj = {};
  for (let i = 0; i &lt;= 2; i++) {
    for (let j = lines[i][0]; j &lt; lines[i][1]; j++) {
      arr.push(`${j}${j + 1}`);
    }
  }

  lines.map((el) =&gt; el.map((item) =&gt; allLines.push(item)));

  let max = Math.max(...allLines);
  let min = Math.min(...allLines);

  for (let i = min; i &lt; max; i++) {
    whole.push(`${i}${i + 1}`);
  }

  for (let i = 0; i &lt; arr.length; i++) {
    if (!resObj[arr[i]]) {
      resObj[arr[i]] = 1;
    } else {
      resObj[arr[i]]++;
    }
  }

  for (let i in resObj) {
    resObj[i] &gt;= 2 &amp;&amp; count++;
  }

  return count;
}</code></pre>
<hr>
<h1 id="k의-개수">k의 개수</h1>
<br>

<h2 id="문제-1">문제</h2>
<p>1부터 13까지의 수에서, 1은 1, 10, 11, 12, 13 이렇게 총 6번 등장합니다. 정수 i, j, k가 매개변수로 주어질 때, i부터 j까지 k가 몇 번 등장하는지 return 하도록 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항-1">제한사항</h2>
<ul>
<li>1 ≤ i &lt; j ≤ 100,000</li>
<li>0 ≤ k ≤ 9</li>
</ul>
<br>

<h2 id="입출력-예-1">입출력 예</h2>
<ul>
<li>10부터 50까지 5는 15, 25, 35, 45, 50 총 5번 등장합니다. 따라서 5를 return 합니다.</li>
</ul>
<br>

<h2 id="풀이-1">풀이</h2>
<pre><code class="language-javascript">function solution(i, j, k) {
  let arr = [];
  let count = 0;
  for (let el = i; el &lt;= j; el++) {
    arr.push(el);
  }

  arr.map((el) =&gt; {
    [...String(el)].map((item) =&gt; {
      item === String(k) &amp;&amp; count++;
    });
  });

  return count;
}
</code></pre>
<br>]]></description>
        </item>
        <item>
            <title><![CDATA[daily 알고리즘 : 프로그래머스 0 level 15일차]]></title>
            <link>https://velog.io/@sarah_/daily-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-0-level-15%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@sarah_/daily-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-0-level-15%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Tue, 15 Nov 2022 15:02:12 GMT</pubDate>
            <description><![CDATA[<h1 id="숫자-찾기">숫자 찾기</h1>
<br>

<h2 id="문제">문제</h2>
<p>정수 num과 k가 매개변수로 주어질 때, num을 이루는 숫자 중에 k가 있으면 num의 그 숫자가 있는 자리 수를 return하고 없으면 -1을 return 하도록 solution 함수를 완성해보세요.</p>
<br>

<h2 id="제한사항">제한사항</h2>
<ul>
<li>0 &lt; num &lt; 1,000,000</li>
<li>0 ≤ k &lt; 10</li>
<li>num에 k가 여러 개 있으면 가장 처음 나타나는 자리를 return 합니다.</li>
</ul>
<br>

<h2 id="입출력-예">입출력 예</h2>
<ul>
<li>232443에서 4는 4번째에 처음 등장합니다.</li>
</ul>
<h2 id="풀이">풀이</h2>
<pre><code class="language-javascript">function solution(num, k) {
  let arr = num.toString().split(&quot;&quot;);
  return arr.includes(String(k)) ? arr.indexOf(String(k)) + 1 : -1;
}</code></pre>
<hr>
<h1 id="숨어있는-숫자의-덧셈-2">숨어있는 숫자의 덧셈 (2)</h1>
<br>

<h2 id="문제-1">문제</h2>
<p>문자열 my_string이 매개변수로 주어집니다. my_string은 소문자, 대문자, 자연수로만 구성되어있습니다. my_string안의 자연수들의 합을 return하도록 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항-1">제한사항</h2>
<ul>
<li>1 ≤ my_string의 길이 ≤ 1,000</li>
<li>1 ≤ my_string 안의 자연수 ≤ 1000</li>
<li>연속된 수는 하나의 숫자로 간주합니다.</li>
<li>000123과 같이 0이 선행하는 경우는 없습니다.</li>
<li>문자열에 자연수가 없는 경우 0을 return 해주세요.</li>
</ul>
<br>

<h2 id="입출력-예-1">입출력 예</h2>
<ul>
<li>&quot;aAb1B2cC34oOp&quot;안의 자연수는 1, 2, 34 입니다. 따라서 1 + 2 + 34 = 37 을 return합니다.</li>
</ul>
<br>

<h2 id="풀이-1">풀이</h2>
<pre><code class="language-javascript">function solution(my_string) {
  let check = /[^0-9]/g;
  return my_string.split(check).reduce((a, b) =&gt; Number(a) + Number(b), 0);
}</code></pre>
<br>

<hr>
<h1 id="유한소수-판별하기">유한소수 판별하기</h1>
<br>

<h2 id="문제-2">문제</h2>
<p>소수점 아래 숫자가 계속되지 않고 유한개인 소수를 유한소수라고 합니다. 분수를 소수로 고칠 때 유한소수로 나타낼 수 있는 분수인지 판별하려고 합니다. 유한소수가 되기 위한 분수의 조건은 다음과 같습니다.</p>
<ul>
<li>기약분수로 나타내었을 때, 분모의 소인수가 2와 5만 존재해야 합니다.</li>
</ul>
<p>두 정수 a와 b가 매개변수로 주어질 때, a/b가 유한소수이면 1을, 무한소수라면 2를 return하도록 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항-2">제한사항</h2>
<ul>
<li>a, b는 정수</li>
<li>0 &lt; a ≤ 1,000</li>
<li>0 &lt; b ≤ 1,000</li>
</ul>
<br>

<h2 id="입출력-예-2">입출력 예</h2>
<ul>
<li>분수 11/22는 기약분수로 나타내면 1/2 입니다. 분모 2는 소인수가 2 뿐이기 때문에 유한소수 입니다. 따라서 1을 return합니다.</li>
</ul>
<br>

<h2 id="풀이-2">풀이</h2>
<pre><code class="language-js">function solution(a, b) {
  for (let i = a; i &gt;= 2; i--) {
    if (b % i === 0 &amp;&amp; a % i === 0) {
      b = b / i;
      break;
    }
  }

  let i = b;
  if (b === 1) return 1;

  while (i % 2 === 0 || i % 5 === 0) {
    if (i % 2 === 0) {
      i = i / 2;
    } else if (i % 5 === 0) {
      i = i / 5;
    }
  }

  return i &gt; 1 ? 2 : 1;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[daily 알고리즘 : 프로그래머스 0 level 14일차]]></title>
            <link>https://velog.io/@sarah_/daily-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-0-level-14%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@sarah_/daily-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-0-level-14%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Mon, 14 Nov 2022 02:37:13 GMT</pubDate>
            <description><![CDATA[<h1 id="세균-증식">세균 증식</h1>
<br>

<h2 id="문제">문제</h2>
<p>어떤 세균은 1시간에 두배만큼 증식한다고 합니다. 처음 세균의 마리수 n과 경과한 시간 t가 매개변수로 주어질 때 t시간 후 세균의 수를 return하도록 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항">제한사항</h2>
<ul>
<li>1 ≤ n ≤ 10</li>
<li>1 ≤ t ≤ 15</li>
</ul>
<br>

<h2 id="입출력-예">입출력 예</h2>
<ul>
<li>처음엔 2마리, 1시간 후엔 4마리, 2시간 후엔 8마리, ..., 10시간 후엔 2048마리가 됩니다. 따라서 2048을 return합니다.</li>
</ul>
<h2 id="풀이">풀이</h2>
<pre><code class="language-javascript">function solution(n, t) {
  let i = 1;
  let answer = n;
  while (i &lt;= t) {
    answer *= 2;
    i++;
  }
  return answer;
}</code></pre>
<hr>
<h1 id="n의-배수-고르기">n의 배수 고르기</h1>
<br>

<h2 id="문제-1">문제</h2>
<p>정수 n과 정수 배열 numlist가 매개변수로 주어질 때, numlist에서 n의 배수가 아닌 수들을 제거한 배열을 return하도록 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항-1">제한사항</h2>
<ul>
<li>1 ≤ n ≤ 10,000</li>
<li>1 ≤ numlist의 크기 ≤ 100</li>
<li>1 ≤ numlist의 원소 ≤ 100,000</li>
</ul>
<br>

<h2 id="입출력-예-1">입출력 예</h2>
<ul>
<li>numlist에서 12의 배수만을 남긴 [120, 600, 12, 12]를 return합니다.</li>
</ul>
<br>

<h2 id="풀이-1">풀이</h2>
<pre><code class="language-javascript">function solution(n, numlist) {
  return numlist.filter((el) =&gt; el % n === 0);
}</code></pre>
<br>

<hr>
<h1 id="자릿수-더하기">자릿수 더하기</h1>
<br>

<h2 id="문제-2">문제</h2>
<p>정수 n이 매개변수로 주어질 때 n의 각 자리 숫자의 합을 return하도록 solution 함수를 완성해주세요</p>
<br>

<h2 id="제한사항-2">제한사항</h2>
<ul>
<li>0 ≤ n ≤ 1,000,000</li>
</ul>
<br>

<h2 id="입출력-예-2">입출력 예</h2>
<ul>
<li>9 + 3 + 0 + 2 + 1 + 1 = 16을 return합니다.</li>
</ul>
<br>

<h2 id="풀이-2">풀이</h2>
<pre><code class="language-js">function solution(n) {
  return String(n)
    .split(&quot;&quot;)
    .reduce((a, b) =&gt; Number(a) + Number(b),0);
}</code></pre>
<hr>
<h1 id="문자열안에-문자열">문자열안에 문자열</h1>
<br>

<h2 id="문제-3">문제</h2>
<p>문자열 str1, str2가 매개변수로 주어집니다. str1 안에 str2가 있다면 1을 없다면 2를 return하도록 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항-3">제한사항</h2>
<ul>
<li>1 ≤ str1의 길이 ≤ 100</li>
<li>1 ≤ str2의 길이 ≤ 100</li>
</ul>
<br>

<h2 id="입출력-예-3">입출력 예</h2>
<ul>
<li>&quot;ab6CDE443fgh22iJKlmn1o&quot; str1에 str2가 존재하므로 1을 return합니다.</li>
</ul>
<br>

<h2 id="풀이-3">풀이</h2>
<pre><code class="language-js">function solution(str1, str2) {
  return str1.includes(str2) ? 1 : 2;
}</code></pre>
<hr>
<h1 id="문자열-정렬하기-2">문자열 정렬하기 (2)</h1>
<br>

<h2 id="문제-4">문제</h2>
<p>영어 대소문자로 이루어진 문자열 my_string이 매개변수로 주어질 때, my_string을 모두 소문자로 바꾸고 알파벳 순서대로 정렬한 문자열을 return 하도록 solution 함수를 완성해보세요.</p>
<br>

<h2 id="제한사항-4">제한사항</h2>
<ul>
<li>0 &lt; my_string 길이 &lt; 100</li>
</ul>
<br>

<h2 id="입출력-예-4">입출력 예</h2>
<ul>
<li>&quot;heLLo&quot;를 모두 소문자로 바꾸면 &quot;hello&quot;이고 이를 알파벳 순으로 정렬하면 &quot;ehllo&quot;입니다.</li>
</ul>
<br>

<h2 id="풀이-4">풀이</h2>
<pre><code class="language-js">function solution(my_string) {
  return my_string.toLowerCase().split(&quot;&quot;).sort().join(&quot;&quot;);
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[daily 알고리즘 : 프로그래머스 0 level 13일차]]></title>
            <link>https://velog.io/@sarah_/daily-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-0-level-13%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@sarah_/daily-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-0-level-13%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Sat, 12 Nov 2022 07:49:20 GMT</pubDate>
            <description><![CDATA[<h1 id="인덱스-바꾸기">인덱스 바꾸기</h1>
<br>

<h2 id="문제">문제</h2>
<p>문자열 my_string과 정수 num1, num2가 매개변수로 주어질 때, my_string에서 인덱스 num1과 인덱스 num2에 해당하는 문자를 바꾼 문자열을 return 하도록 solution 함수를 완성해보세요.</p>
<br>

<h2 id="제한사항">제한사항</h2>
<ul>
<li>1 &lt; my_string의 길이 &lt; 100</li>
<li>0 ≤ num1, num2 &lt; my_string의 길이</li>
<li>my_string은 소문자로 이루어져 있습니다.</li>
<li>num1 ≠ num2</li>
</ul>
<br>

<h2 id="입출력-예">입출력 예</h2>
<ul>
<li>&quot;hello&quot;의 1번째 인덱스인 &quot;e&quot;와 2번째 인덱스인 &quot;l&quot;을 바꾸면 &quot;hlelo&quot;입니다.</li>
</ul>
<h2 id="풀이">풀이</h2>
<pre><code class="language-javascript">function solution(my_string, num1, num2) {
  let arr = my_string.split(&quot;&quot;);
  let temp = arr[num1];
  arr[num1] = arr[num2];
  arr[num2] = temp;
  return arr.join(&quot;&quot;);
}</code></pre>
<hr>
<h1 id="약수-구하기">약수 구하기</h1>
<br>

<h2 id="문제-1">문제</h2>
<p>정수 n이 매개변수로 주어질 때, n의 약수를 오름차순으로 담은 배열을 return하도록 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항-1">제한사항</h2>
<ul>
<li>1 ≤ n ≤ 10,000</li>
</ul>
<br>

<h2 id="입출력-예-1">입출력 예</h2>
<ul>
<li>24의 약수를 오름차순으로 담은 배열 [1, 2, 3, 4, 6, 8, 12, 24]를 return합니다.</li>
</ul>
<br>

<h2 id="풀이-1">풀이</h2>
<pre><code class="language-javascript">function solution(n) {
  let i = 1;
  let answer = [];
  while (i &lt;= n) {
    n % i === 0 &amp;&amp; answer.push(i);
    i++;
  }
  return answer;
}</code></pre>
<br>

<hr>
<h1 id="잘라서-배열로-저장하기">잘라서 배열로 저장하기</h1>
<br>

<h2 id="문제-2">문제</h2>
<p>문자열 my_str과 n이 매개변수로 주어질 때, my_str을 길이 n씩 잘라서 저장한 배열을 return하도록 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항-2">제한사항</h2>
<ul>
<li>1 ≤ my_str의 길이 ≤ 100</li>
<li>1 ≤ n ≤ my_str의 길이</li>
<li>my_str은 알파벳 소문자, 대문자, 숫자로 이루어져 있습니다.</li>
</ul>
<br>

<h2 id="입출력-예-2">입출력 예</h2>
<ul>
<li>&quot;abc1Addfggg4556b&quot; 를 길이 6씩 잘라 배열에 저장한 [&quot;abc1Ad&quot;, &quot;dfggg4&quot;, &quot;556b&quot;]를 return해야 합니다.</li>
</ul>
<br>

<h2 id="풀이-2">풀이</h2>
<pre><code class="language-js">function solution(my_str, n) {
  let arr = my_str.split(&quot;&quot;);
  let result = [];
  while (arr.length &gt; 0) {
    let slice = arr.splice(0, n);
    result.push(slice.join(&quot;&quot;));
  }
  return result;
}</code></pre>
<hr>
<h1 id="외계어-사전">외계어 사전</h1>
<br>

<h2 id="문제-3">문제</h2>
<p>PROGRAMMERS-962 행성에 불시착한 우주비행사 머쓱이는 외계행성의 언어를 공부하려고 합니다. 알파벳이 담긴 배열 spell과 외계어 사전 dic이 매개변수로 주어집니다. spell에 담긴 알파벳을 한번씩만 모두 사용한 단어가 dic에 존재한다면 1, 존재하지 않는다면 2를 return하도록 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항-3">제한사항</h2>
<ul>
<li>spell과 dic의 원소는 알파벳 소문자로만 이루어져있습니다.</li>
<li>2 ≤ spell의 크기 ≤ 10</li>
<li>spell의 원소의 길이는 1입니다.</li>
<li>1 ≤ dic의 크기 ≤ 10</li>
<li>1 ≤ dic의 원소의 길이 ≤ 10</li>
<li>spell의 원소를 모두 사용해 단어를 만들어야 합니다.</li>
<li>spell의 원소를 모두 사용해 만들 수 있는 단어는 dic에 두 개 이상 존재하지 않습니다.</li>
<li>dic과 spell 모두 중복된 원소를 갖지 않습니다.</li>
</ul>
<br>

<h2 id="입출력-예-3">입출력 예</h2>
<ul>
<li>&quot;p&quot;, &quot;o&quot;, &quot;s&quot; 를 조합해 만들 수 있는 단어가 dic에 존재하지 않습니다. 따라서 2를 return합니다.</li>
</ul>
<br>

<h2 id="풀이-3">풀이</h2>
<pre><code class="language-js">function solution(spell, dic) {
  let word = spell.sort();
  let answer = dic.filter((el) =&gt; {
    return [...el].sort().join(&quot;&quot;) === word.join(&quot;&quot;);
  });
  if (answer.length &gt; 0) {
    return 1;
  } else return 2;
}</code></pre>
<hr>
<h1 id="제곱수-판별하기">제곱수 판별하기</h1>
<br>

<h2 id="문제-4">문제</h2>
<p>어떤 자연수를 제곱했을 때 나오는 정수를 제곱수라고 합니다. 정수 n이 매개변수로 주어질 때, n이 제곱수라면 1을 아니라면 2를 return하도록 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항-4">제한사항</h2>
<ul>
<li>1 ≤ n ≤ 1,000,000</li>
</ul>
<br>

<h2 id="입출력-예-4">입출력 예</h2>
<ul>
<li>144는 12의 제곱이므로 제곱수입니다. 따라서 1을 return합니다.</li>
</ul>
<br>

<h2 id="풀이-4">풀이</h2>
<pre><code class="language-js">function solution(n) {
  let i = 1;
  let res;
  while (i * i &lt; n) {
    i++;
  }
  i * i === n ? (res = 1) : (res = 2);
  return res;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[daily 알고리즘 : 프로그래머스 0 level 12일차]]></title>
            <link>https://velog.io/@sarah_/daily-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-0-level-12%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@sarah_/daily-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-0-level-12%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Fri, 11 Nov 2022 09:58:31 GMT</pubDate>
            <description><![CDATA[<h1 id="대문자와-소문자">대문자와 소문자</h1>
<br>

<h2 id="문제">문제</h2>
<p>문자열 my_string이 매개변수로 주어질 때, 대문자는 소문자로 소문자는 대문자로 변환한 문자열을 return하도록 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항">제한사항</h2>
<ul>
<li>1 ≤ my_string의 길이 ≤ 1,000</li>
<li>my_string은 영어 대문자와 소문자로만 구성되어 있습니다.</li>
</ul>
<br>

<h2 id="입출력-예">입출력 예</h2>
<ul>
<li>소문자는 대문자로 대문자는 소문자로 바꾼 &quot;ABcDeFGHij&quot;를 return합니다.</li>
</ul>
<h2 id="풀이">풀이</h2>
<p>my_string을 전부 대문자로 바꾼 후(answer) 두 문자열을 비교하여 대/소문자로 변환해주었다.</p>
<pre><code class="language-javascript">function solution(my_string) {
  let answer = my_string.toUpperCase();
  let result = &quot;&quot;;
  for (let i = 0; i &lt; my_string.length; i++) {
    answer[i] === my_string[i]
      ? (result += my_string[i].toLowerCase())
      : (result += my_string[i].toUpperCase());
  }
  return result;
}</code></pre>
<hr>
<h1 id="암호-해독">암호 해독</h1>
<br>

<h2 id="문제-1">문제</h2>
<p>군 전략가 머쓱이는 전쟁 중 적군이 다음과 같은 암호 체계를 사용한다는 것을 알아냈습니다.</p>
<ul>
<li>암호화된 문자열 cipher를 주고받습니다.</li>
<li>그 문자열에서 code의 배수 번째 글자만 진짜 암호입니다.</li>
</ul>
<p>문자열 cipher와 정수 code가 매개변수로 주어질 때 해독된 암호 문자열을 return하도록 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항-1">제한사항</h2>
<ul>
<li>1 ≤ cipher의 길이 ≤ 1,000</li>
<li>1 ≤ code ≤ cipher의 길이</li>
<li>cipher는 소문자와 공백으로만 구성되어 있습니다.</li>
<li>공백도 하나의 문자로 취급합니다.</li>
</ul>
<br>

<h2 id="입출력-예-1">입출력 예</h2>
<ul>
<li>&quot;dfjardstddetckdaccccdegk&quot; 의 4번째, 8번째, 12번째, 16번째, 20번째, 24번째 글자를 합친 &quot;attack&quot;을 return합니다.</li>
</ul>
<br>

<h2 id="풀이-1">풀이</h2>
<pre><code class="language-javascript">function solution(cipher, code) {
  let answer = &quot;&quot;;
  for (let i = code - 1; i &lt; cipher.length; i += code) {
    answer += cipher[i];
  }
  return answer;
}</code></pre>
<br>

<hr>
<h1 id="가까운-수">가까운 수</h1>
<br>

<h2 id="문제-2">문제</h2>
<p>정수 배열 array와 정수 n이 매개변수로 주어질 때, array에 들어있는 정수 중 n과 가장 가까운 수를 return 하도록 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항-2">제한사항</h2>
<ul>
<li>≤ array의 길이 ≤ 100</li>
<li>1 ≤ array의 원소 ≤ 100</li>
<li>1 ≤ n ≤ 100</li>
<li>가장 가까운 수가 여러 개일 경우 더 작은 수를 return 합니다.</li>
</ul>
<br>

<h2 id="입출력-예-2">입출력 예</h2>
<ul>
<li>3, 10, 28 중 20과 가장 가까운 수는 28입니다.</li>
</ul>
<br>

<h2 id="풀이-2">풀이</h2>
<p>만약 <code>[3, 10, 28, 12]</code>이 array로 주어졌을 때 이 배열을 내림차순으로 sort 후
arr 빈 배열에 n을 뺀 값 절대값을 push 해주었다.</p>
<p>가장 가까운 수가 여러개일 경우 더 작은 수를 리턴해야 하므로,
주어진 값과 일치하는 첫번째 인덱스를 반환하는 indexOf 메서드를 사용하여 
내림차순으로 sort 해주었던 배열에서 인덱스 값을 찾아 답을 리턴해주었다.</p>
<pre><code class="language-js">function solution(array, n) {
  let answer = array.sort((a, b) =&gt; a - b);
  let arr = [];
  answer.map((el) =&gt; arr.push(Math.abs(el - n)));
  return answer[arr.indexOf(Math.min(...arr))];
}
</code></pre>
<hr>
<h1 id="한-번만-등장한-문자">한 번만 등장한 문자</h1>
<br>

<h2 id="문제-3">문제</h2>
<p>문자열 s가 매개변수로 주어집니다. s에서 한 번만 등장하는 문자를 사전 순으로 정렬한 문자열을 return 하도록 solution 함수를 완성해보세요. 한 번만 등장하는 문자가 없을 경우 빈 문자열을 return 합니다.</p>
<br>

<h2 id="제한사항-3">제한사항</h2>
<ul>
<li>0 &lt; s의 길이 &lt; 1,000</li>
<li>s는 소문자로만 이루어져 있습니다.</li>
</ul>
<br>

<h2 id="입출력-예-3">입출력 예</h2>
<ul>
<li>&quot;hello&quot;에서 한 번씩 등장한 문자는 &quot;heo&quot;이고 이를 사전 순으로 정렬한 &quot;eho&quot;를 return 합니다.</li>
</ul>
<br>

<h2 id="풀이-3">풀이</h2>
<p>answer 객체에 key값은 s의 알파벳, value는 등장 횟수를 할당해주었다.
그 후 value가 1인 key값을 result에 할당하여 리턴해주었다.</p>
<pre><code class="language-js">function solution(s) {
  let answer = {};
  let result = &quot;&quot;;
  for (let i of s) {
    answer[i] === undefined ? (answer[i] = 1) : answer[i]++;
  }
  for (let i in answer) {
    if (answer[i] === 1) result += i;
  }
  return [...result].sort().join(&quot;&quot;);
}</code></pre>
<hr>
<h1 id="삼각형의-완성조건-2">삼각형의 완성조건 (2)</h1>
<br>

<h2 id="문제-4">문제</h2>
<p>선분 세 개로 삼각형을 만들기 위해서는 다음과 같은 조건을 만족해야 합니다.</p>
<ul>
<li>가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 합니다.</li>
</ul>
<p>삼각형의 두 변의 길이가 담긴 배열 sides이 매개변수로 주어집니다. 나머지 한 변이 될 수 있는 정수의 개수를 return하도록 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항-4">제한사항</h2>
<ul>
<li>sides의 원소는 자연수입니다.</li>
<li>sides의 길이는 2입니다.</li>
<li>1 ≤ sides의 원소 ≤ 1,000</li>
</ul>
<br>

<h2 id="입출력-예-4">입출력 예</h2>
<ul>
<li>가장 긴 변이 6인 경우<ul>
<li>될 수 있는 나머지 한 변은 4, 5, 6 로 3개입니다.</li>
</ul>
</li>
<li>나머지 한 변이 가장 긴 변인 경우<ul>
<li>될 수 있는 한 변은 7, 8 로 2개입니다.</li>
</ul>
</li>
<li>따라서 3 + 2 = 5를 return합니다.</li>
</ul>
<br>

<h2 id="풀이-4">풀이</h2>
<pre><code class="language-js">function solution(sides) {
  let maxNum = Math.max(...sides);
  let minNum = Math.min(...sides);
  let i = maxNum - minNum;
  let answer = [];
  while (maxNum + minNum - 1 &gt; i) {
    i++;
    answer.push(i);
  }
  return answer.length;
}
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[daily 알고리즘 : 프로그래머스 0 level 11일차]]></title>
            <link>https://velog.io/@sarah_/daily-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-0-level-11%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@sarah_/daily-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-0-level-11%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Thu, 10 Nov 2022 08:27:18 GMT</pubDate>
            <description><![CDATA[<h1 id="중복된-문자-제거">중복된 문자 제거</h1>
<br>

<h2 id="문제">문제</h2>
<p>문자열 my_string이 매개변수로 주어집니다. my_string에서 중복된 문자를 제거하고 하나의 문자만 남긴 문자열을 return하도록 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항">제한사항</h2>
<ul>
<li>1 ≤ my_string ≤ 110</li>
<li>my_string은 대문자, 소문자, 공백으로 구성되어 있습니다.</li>
<li>대문자와 소문자를 구분합니다.</li>
<li>공백(&quot; &quot;)도 하나의 문자로 구분합니다.</li>
<li>중복된 문자 중 가장 앞에 있는 문자를 남깁니다.</li>
</ul>
<br>

<h2 id="입출력-예">입출력 예</h2>
<ul>
<li>&quot;people&quot;에서 중복된 문자 &quot;p&quot;와 &quot;e&quot;을 제거한 &quot;peol&quot;을 return합니다.</li>
</ul>
<h2 id="풀이">풀이</h2>
<p>new Set() 메서드를 사용하여 중복을 제거하였다.</p>
<ul>
<li>Set()은 value들로 이루어진 집합이다.
Array와는 다르게 Set은 중복된 value를 포함 할 수 없다.
따라서 Set에 이미 존재하는 값을 추가하려고 하면 아무일도 일어나지 않는다.</li>
</ul>
<pre><code class="language-javascript">function solution(my_string) {
  return [...new Set(my_string)].join(&quot;&quot;);
}</code></pre>
<hr>
<h1 id="컨트롤-제트">컨트롤 제트</h1>
<br>

<h2 id="문제-1">문제</h2>
<p>숫자들이 공백으로 구분된 문자열이 주어집니다. 문자열에 있는 숫자를 차례대로 더하려고 합니다. 이 때 “Z”가 나오면 바로 전에 더했던 숫자를 뺀다는 뜻입니다. 숫자와 “Z”로 이루어진 문자열 s가 주어질 때, 머쓱이가 구한 값을 return 하도록 solution 함수를 완성해보세요.</p>
<br>

<h2 id="제한사항-1">제한사항</h2>
<ul>
<li>0 &lt; s의 길이 &lt; 1,000</li>
<li>-1,000 &lt; s의 원소 중 숫자 &lt; 1,000</li>
<li>s는 숫자, &quot;Z&quot;, 공백으로 이루어져 있습니다.</li>
<li>s에 있는 숫자와 &quot;Z&quot;는 서로 공백으로 구분됩니다.</li>
<li>연속된 공백은 주어지지 않습니다.</li>
<li>0을 제외하고는 0으로 시작하는 숫자는 없습니다.</li>
<li>s의 시작과 끝에는 공백이 없습니다.</li>
<li>모든 숫자를 지우는 경우는 주어지지 않습니다.</li>
<li>지울 숫자가 없는 상태에서 &quot;Z&quot;는 무시합니다.</li>
</ul>
<br>

<h2 id="입출력-예-1">입출력 예</h2>
<ul>
<li>&quot;10 Z 20 Z 1&quot;에서 10 다음 Z, 20 다음 Z로 10, 20이 지워지고 1만 더하여 1을 return 합니다.</li>
</ul>
<br>

<h2 id="풀이-1">풀이</h2>
<p>s 배열값이 Z이면 splice 메서드를 사용하여 바로 앞 인덱스부터 2개를 제거하였다.
s 배열이 더이상 Z를 포함하지 않을때까지 반복문을 돌렸다.
마지막으로 배열의 남은 숫자들을 더해준 값을 리턴하였다.</p>
<pre><code class="language-javascript">function solution(s) {
  s = s.split(&quot; &quot;);
  while (s.includes(&quot;Z&quot;)) {
    s.splice(s.indexOf(&quot;Z&quot;) - 1, 2);
  }
  return s.reduce((a, b) =&gt; a + Number(b), 0);
}</code></pre>
<br>

<hr>
<h1 id="369게임">369게임</h1>
<br>

<h2 id="문제-2">문제</h2>
<p>머쓱이는 친구들과 369게임을 하고 있습니다. 369게임은 1부터 숫자를 하나씩 대며 3, 6, 9가 들어가는 숫자는 숫자 대신 3, 6, 9의 개수만큼 박수를 치는 게임입니다. 머쓱이가 말해야하는 숫자 order가 매개변수로 주어질 때, 머쓱이가 쳐야할 박수 횟수를 return 하도록 solution 함수를 완성해보세요.</p>
<br>

<h2 id="제한사항-2">제한사항</h2>
<ul>
<li>1 ≤ order ≤ 1,000,000</li>
</ul>
<br>

<h2 id="입출력-예-2">입출력 예</h2>
<ul>
<li>29423은 3이 1개, 9가 1개 있으므로 2를 출력합니다.</li>
</ul>
<br>

<h2 id="풀이-2">풀이</h2>
<pre><code class="language-js">function solution(order) {
  return [...order.toString()].filter(
    (el) =&gt; el === &quot;3&quot; || el === &quot;6&quot; || el === &quot;9&quot;
  ).length;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[daily 알고리즘 : 프로그래머스 0 level 10일차]]></title>
            <link>https://velog.io/@sarah_/daily-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-0-level-10%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@sarah_/daily-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-0-level-10%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Wed, 09 Nov 2022 09:45:35 GMT</pubDate>
            <description><![CDATA[<h1 id="모음-제거">모음 제거</h1>
<br>

<h2 id="문제">문제</h2>
<p>영어에선 a, e, i, o, u 다섯 가지 알파벳을 모음으로 분류합니다. 문자열 my_string이 매개변수로 주어질 때 모음을 제거한 문자열을 return하도록 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항">제한사항</h2>
<ul>
<li>my_string은 소문자와 공백으로 이루어져 있습니다.</li>
<li>1 ≤ my_string의 길이 ≤ 1,000</li>
</ul>
<br>

<h2 id="입출력-예">입출력 예</h2>
<ul>
<li>&quot;nice to meet you&quot;에서 모음 i, o, e, u를 모두 제거한 &quot;nc t mt y&quot;를 return합니다.</li>
</ul>
<h2 id="풀이">풀이</h2>
<pre><code class="language-javascript">function solution(my_string) {
  let word = [&quot;a&quot;, &quot;e&quot;, &quot;i&quot;, &quot;o&quot;, &quot;u&quot;];
  let answer = &quot;&quot;;
  my_string.split(&quot;&quot;).map((el) =&gt; {
    if (!word.includes(el)) answer += el;
  });
  return answer;
}
</code></pre>
<hr>
<h1 id="소인수분해">소인수분해</h1>
<br>

<h2 id="문제-1">문제</h2>
<p>소인수분해란 어떤 수를 소수들의 곱으로 표현하는 것입니다. 예를 들어 12를 소인수 분해하면 2 * 2 * 3 으로 나타낼 수 있습니다. 따라서 12의 소인수는 2와 3입니다. 자연수 n이 매개변수로 주어질 때 n의 소인수를 오름차순으로 담은 배열을 return하도록 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항-1">제한사항</h2>
<ul>
<li>2 ≤ n ≤ 10,000</li>
</ul>
<br>

<h2 id="입출력-예-1">입출력 예</h2>
<ul>
<li>420을 소인수분해하면 2 * 2 * 3 * 5 * 7 입니다. 따라서 [2, 3, 5, 7]을 return합니다.</li>
</ul>
<br>

<h2 id="풀이-1">풀이</h2>
<pre><code class="language-javascript">function solution(n) {
  let answer = [];
  let i = 2;
  while (i &lt;= n) {
    if (n % i === 0) {
      n = n / i;
      answer.push(i);
    } else {
      i++;
    }
  }
  return [...new Set(answer)];
}
</code></pre>
<br>

<hr>
<h1 id="배열-원소의-길이">배열 원소의 길이</h1>
<br>

<h2 id="문제-2">문제</h2>
<p>문자열 배열 strlist가 매개변수로 주어집니다. strlist 각 원소의 길이를 담은 배열을 retrun하도록 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항-2">제한사항</h2>
<ul>
<li>1 ≤ strlist 원소의 길이 ≤ 100</li>
<li>strlist는 알파벳 소문자, 대문자, 특수문자로 구성되어 있습니다.</li>
</ul>
<br>

<h2 id="입출력-예-2">입출력 예</h2>
<ul>
<li>[&quot;I&quot;, &quot;Love&quot;, &quot;Programmers.&quot;]의 각 원소의 길이인 [1, 4, 12]을 return합니다.</li>
</ul>
<br>

<h2 id="풀이-2">풀이</h2>
<pre><code class="language-js">function solution(strlist) {
  let answer = [];
  for (let i of strlist) {
    answer.push(i.length);
  }
  return answer;
}
</code></pre>
<hr>
<h1 id="7의-개수">7의 개수</h1>
<br>

<h2 id="문제-3">문제</h2>
<p>머쓱이는 행운의 숫자 7을 가장 좋아합니다. 정수 배열 array가 매개변수로 주어질 때, 7이 총 몇 개 있는지 return 하도록 solution 함수를 완성해보세요.</p>
<br>

<h2 id="제한사항-3">제한사항</h2>
<ul>
<li>1 ≤ array의 길이 ≤ 100</li>
<li>0 ≤ array의 원소 ≤ 100,000</li>
</ul>
<br>

<h2 id="입출력-예-3">입출력 예</h2>
<ul>
<li>[7, 77, 17]에는 7이 4개 있으므로 4를 return 합니다.</li>
</ul>
<br>

<h2 id="풀이-3">풀이</h2>
<pre><code class="language-javascript">function solution(array) {
  return array
    .join(&quot;&quot;)
    .split(&quot;&quot;)
    .filter((el) =&gt; el === &quot;7&quot;).length;
}
</code></pre>
<hr>
<h1 id="로그인-성공">로그인 성공?</h1>
<br>

<h2 id="문제-4">문제</h2>
<p>머쓱이는 프로그래머스에 로그인하려고 합니다. 머쓱이가 입력한 아이디와 패스워드가 담긴 배열 id_pw와 회원들의 정보가 담긴 2차원 배열 db가 주어질 때, 다음과 같이 로그인 성공, 실패에 따른 메시지를 return하도록 solution 함수를 완성해주세요.</p>
<ul>
<li>아이디와 비밀번호가 모두 일치하는 회원정보가 있으면 &quot;login&quot;을 return합니다.</li>
<li>로그인이 실패했을 때 아이디가 일치하는 회원이 없다면 “fail”를, 아이디는 일치하지만 비밀번호가 일치하는 회원이 없다면 “wrong pw”를 return 합니다.</li>
</ul>
<br>

<h2 id="제한사항-4">제한사항</h2>
<ul>
<li>회원들의 아이디는 문자열입니다.</li>
<li>회원들의 아이디는 알파벳 소문자와 숫자로만 이루어져 있습니다.</li>
<li>회원들의 패스워드는 숫자로 구성된 문자열입니다.</li>
<li>회원들의 비밀번호는 같을 수 있지만 아이디는 같을 수 없습니다.</li>
<li>id_pw의 길이는 2입니다.</li>
<li>id_pw와 db의 원소는 [아이디, 패스워드] 형태입니다.</li>
<li>1 ≤ 아이디의 길이 ≤ 15</li>
<li>1 ≤ 비밀번호의 길이 ≤ 6</li>
<li>1 ≤ db의 길이 ≤ 10</li>
<li>db의 원소의 길이는 2입니다.</li>
</ul>
<br>

<h2 id="입출력-예-4">입출력 예</h2>
<ul>
<li>db에 아이디는 같지만 패스워드가 다른 계정이 있으므로 &quot;wrong pw&quot;를 return합니다.</li>
</ul>
<br>

<h2 id="풀이-4">풀이</h2>
<pre><code class="language-javascript">function solution(id_pw, db) {
  let answer = &quot;fail&quot;;
  [...db].map((el) =&gt; {
    id_pw[0] === el[0] &amp;&amp; id_pw[1] === el[1] &amp;&amp; (answer = &quot;login&quot;);
    id_pw[0] === el[0] &amp;&amp; id_pw[1] !== el[1] &amp;&amp; (answer = &quot;wrong pw&quot;);
  });
  return answer;
}
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[daily 알고리즘 : 프로그래머스 0 level 9일차]]></title>
            <link>https://velog.io/@sarah_/daily-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-0-level-9%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@sarah_/daily-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-0-level-9%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Tue, 08 Nov 2022 13:28:36 GMT</pubDate>
            <description><![CDATA[<p>하루에 4문제씩만 풀어야지 했는데 벌써 프로그래머스 0레벨 62문제를 풀었다..! 👍</p>
<hr>
<h1 id="최댓값-만들기-1">최댓값 만들기 (1)</h1>
<br>

<h2 id="문제">문제</h2>
<p>정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return하도록 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항">제한사항</h2>
<ul>
<li>0 ≤ numbers의 원소 ≤ 10,000</li>
<li>2 ≤ numbers의 길이 ≤ 100</li>
</ul>
<br>

<h2 id="입출력-예">입출력 예</h2>
<ul>
<li>두 수의 곱중 최댓값은 4 * 5 = 20 입니다.</li>
</ul>
<h2 id="풀이">풀이</h2>
<p>내림차순으로 sort 후 배열 앞 두 수를 곱해주었다.</p>
<pre><code class="language-javascript">function solution(numbers) {
  numbers.sort((a, b) =&gt; b - a);
  return numbers[0] * numbers[1];
}</code></pre>
<hr>
<h1 id="주사위의-개수">주사위의 개수</h1>
<br>

<h2 id="문제-1">문제</h2>
<p>머쓱이는 직육면체 모양의 상자를 하나 가지고 있는데 이 상자에 정육면체 모양의 주사위를 최대한 많이 채우고 싶습니다. 상자의 가로, 세로, 높이가 저장되어있는 배열 box와 주사위 모서리의 길이 정수 n이 매개변수로 주어졌을 때, 상자에 들어갈 수 있는 주사위의 최대 개수를 return 하도록 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항-1">제한사항</h2>
<ul>
<li>box의 길이는 3입니다.</li>
<li>box[0] = 상자의 가로 길이</li>
<li>box[1] = 상자의 세로 길이</li>
<li>box[2] = 상자의 높이 길이</li>
<li>1 ≤ box의 원소 ≤ 100</li>
<li>1 ≤ n ≤ 50</li>
<li>n ≤ box의 원소</li>
<li><strong>주사위는 상자와 평행하게 넣습니다.</strong></li>
</ul>
<br>

<h2 id="입출력-예-1">입출력 예</h2>
<ul>
<li>상자의 크기가 가로 10, 세로 8, 높이 6이므로 모서리의 길이가 3인 주사위는 12개 들어갈 수 있습니다.</li>
</ul>
<br>

<h2 id="풀이-1">풀이</h2>
<p>주사위는 상자와 평행하게 넣어야하므로 상자의 가로, 세로, 높이를 주사위의 모서리 길이로 나눈 후 곱해주었다.</p>
<pre><code class="language-javascript">function solution(box, n) {
  return box.map((el) =&gt; ~~(el / n)).reduce((a, b) =&gt; a * b);
}</code></pre>
<br>

<hr>
<h1 id="팩토리얼">팩토리얼</h1>
<br>

<h2 id="문제-2">문제</h2>
<p>i팩토리얼 (i!)은 1부터 i까지 정수의 곱을 의미합니다. 예를들어 5! = 5 * 4 * 3 * 2 * 1 = 120 입니다. 정수 n이 주어질 때 다음 조건을 만족하는 가장 큰 정수 i를 return 하도록 solution 함수를 완성해주세요.</p>
<ul>
<li>i! ≤ n</li>
</ul>
<br>

<h2 id="제한사항-2">제한사항</h2>
<ul>
<li>0 &lt; n ≤ 3,628,800</li>
</ul>
<br>

<h2 id="입출력-예-2">입출력 예</h2>
<ul>
<li>3! = 6, 4! = 24입니다. n이 7이므로, 7 이하의 최대 팩토리얼인 3을 return 합니다.</li>
</ul>
<h2 id="풀이-2">풀이</h2>
<p>팩토리얼 문제가 나오면 무조건 재귀함수를 써야지! 하는 생각이 코드를 더 복잡하게 만들었다.
다른 사람 풀이를 보면 while문 하나로 문제를 해결하는 경우가 있어서 코드를 참조해왔다.</p>
<ul>
<li>나의 풀이</li>
</ul>
<pre><code class="language-javascript">function solution(n) {
  let i = 1;

  function fac(num) {
    if (num === 1) return 1;
    return num * fac(num - 1);
  }

  while (fac(i) &lt;= n) {
    i++;
    fac(i);
  }
  return i - 1;
}</code></pre>
<ul>
<li><p>다른 사람 풀이</p>
<pre><code class="language-js">function solution(n) {
let res = 1;
let i = 0;

while (res &lt;= n) {
  i++;
  res *= i;
}
return i - 1;
}</code></pre>
</li>
</ul>
<hr>
<h1 id="합성수-찾기">합성수 찾기</h1>
<br>

<h2 id="문제-3">문제</h2>
<p>약수의 개수가 세 개 이상인 수를 합성수라고 합니다. 자연수 n이 매개변수로 주어질 때 n이하의 합성수의 개수를 return하도록 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항-3">제한사항</h2>
<ul>
<li>1 ≤ n ≤ 100</li>
</ul>
<br>

<h2 id="입출력-예-3">입출력 예</h2>
<ul>
<li>15 이하 합성수는 4, 6, 8, 9, 10, 12, 14, 15 로 8개입니다. 따라서 8을 return합니다.</li>
</ul>
<h2 id="풀이-3">풀이</h2>
<p>n을 1부터 n까지의 수로 나누었을 때 나머지가 0인 값들을 answer 객체에 추가해주었다.
최종적으로 answer객체에 3이상의 값을 가진 Key값만 result 배열에 넣어주었고
result배열의 길이를 return 해주었다.</p>
<pre><code class="language-javascript">function solution(n) {
  let answer = {};
  let result = [];
  for (let i = 4; i &lt;= n; i++) {
    for (let k = 1; k &lt;= n; k++) {
      if (i % k === 0) {
        !answer[i] ? (answer[i] = 1) : answer[i]++;
      }
    }
  }
  for (let i in answer) {
    if (answer[i] &gt;= 3) {
      result.push(i);
    }
  }
  return result.length;
}</code></pre>
<hr>
<h1 id="배열의-유사도">배열의 유사도</h1>
<br>

<h2 id="문제-4">문제</h2>
<p>두 배열이 얼마나 유사한지 확인해보려고 합니다. 문자열 배열 s1과 s2가 주어질 때 같은 원소의 개수를 return하도록 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항-4">제한사항</h2>
<ul>
<li>1 ≤ s1, s2의 길이 ≤ 100</li>
<li>1 ≤ s1, s2의 원소의 길이 ≤ 10</li>
<li>s1과 s2의 원소는 알파벳 소문자로만 이루어져 있습니다</li>
<li>s1과 s2는 각각 중복된 원소를 갖지 않습니다.</li>
</ul>
<br>

<h2 id="입출력-예-4">입출력 예</h2>
<p><img src="https://velog.velcdn.com/images/sarah_/post/90cf2f6c-13e6-42ba-b373-bbf543542042/image.png" alt=""></p>
<ul>
<li>입출력 예 #1 -&gt; &quot;b&quot;와 &quot;c&quot;가 같으므로 2를 return합니다.</li>
<li>입출력 예 #2 -&gt; 같은 원소가 없으므로 0을 return합니다.</li>
</ul>
<h2 id="풀이-4">풀이</h2>
<p>map을 이중으로 돌려 같은 값이면 answer을 +1 해주었다.</p>
<pre><code class="language-javascript">function solution(s1, s2) {
  let answer = 0;
  s1.map((el) =&gt;
    s2.map((item) =&gt; {
      item === el &amp;&amp; answer++;
    })
  );
  return answer;
}</code></pre>
<hr>
<h1 id="삼각형의-완성조건-1">삼각형의 완성조건 (1)</h1>
<br>

<h2 id="문제-5">문제</h2>
<p>선분 세 개로 삼각형을 만들기 위해서는 다음과 같은 조건을 만족해야 합니다.</p>
<p>가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 합니다.
삼각형의 세 변의 길이가 담긴 배열 sides이 매개변수로 주어집니다. 세 변으로 삼각형을 만들 수 있다면 1, 만들 수 없다면 2를 return하도록 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항-5">제한사항</h2>
<ul>
<li>sides의 원소는 자연수입니다.</li>
<li>sides의 길이는 3입니다.</li>
<li>1 ≤ sides의 원소 ≤ 1,000</li>
</ul>
<br>

<h2 id="입출력-예-5">입출력 예</h2>
<ul>
<li>[1,2,3] 가장 큰 변인 3이 나머지 두 변의 합 3과 같으므로 삼각형을 완성할 수 없습니다. 따라서 2를 return합니다.</li>
</ul>
<h2 id="풀이-5">풀이</h2>
<p>max값을 골라낸 후 나머지 값들을 더한 값과 비교하여 리턴해주었다.</p>
<pre><code class="language-javascript">function solution(sides) {
  let answer = Math.max(...sides);
  sides[sides.indexOf(answer)] = 0;
  let others = sides.reduce((a, b) =&gt; a + b);
  return answer &lt; others ? 1 : 2;
}</code></pre>
<hr>
<h1 id="영어가-싫어요">영어가 싫어요</h1>
<br>

<h2 id="문제-6">문제</h2>
<p>영어가 싫은 머쓱이는 영어로 표기되어있는 숫자를 수로 바꾸려고 합니다. 문자열 numbers가 매개변수로 주어질 때, numbers를 정수로 바꿔 return 하도록 solution 함수를 완성해 주세요.</p>
<br>

<h2 id="제한사항-6">제한사항</h2>
<ul>
<li>numbers는 소문자로만 구성되어 있습니다.</li>
<li>numbers는 &quot;zero&quot;, &quot;one&quot;, &quot;two&quot;, &quot;three&quot;, &quot;four&quot;, &quot;five&quot;, &quot;six&quot;, &quot;seven&quot;, &quot;eight&quot;, &quot;nine&quot; 들이 공백 없이 조합되어 있습니다.</li>
<li>1 ≤ numbers의 길이 ≤ 50</li>
<li>&quot;zero&quot;는 numbers의 맨 앞에 올 수 없습니다.</li>
</ul>
<br>

<h2 id="입출력-예-6">입출력 예</h2>
<ul>
<li>&quot;onetwothreefourfivesixseveneightnine&quot;를 숫자로 바꾼 123456789를 return합니다.</li>
</ul>
<h2 id="풀이-6">풀이</h2>
<p>answer이라는 변수에 numbers의 단어를 한글자씩 채워 answer값이 alphabet 배열의 값에 포함되어 있으면 
res에 해당하는 alphabet 인덱스 값을 추가해주어 리턴하였다.</p>
<pre><code class="language-javascript">function solution(numbers) {
  let answer = &quot;&quot;;
  let res = &quot;&quot;;
  let alphabet = [
    &quot;zero&quot;,
    &quot;one&quot;,
    &quot;two&quot;,
    &quot;three&quot;,
    &quot;four&quot;,
    &quot;five&quot;,
    &quot;six&quot;,
    &quot;seven&quot;,
    &quot;eight&quot;,
    &quot;nine&quot;,
  ];

  for (let i of numbers) {
    answer += i;
    if (alphabet.includes(answer)) {
      res += alphabet.indexOf(answer);
      answer = &quot;&quot;;
    }
  }
  return Number(res);
}
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DeepDiveJS] 13장 스코프]]></title>
            <link>https://velog.io/@sarah_/DeepDiveJS-13%EC%9E%A5-%EC%8A%A4%EC%BD%94%ED%94%84</link>
            <guid>https://velog.io/@sarah_/DeepDiveJS-13%EC%9E%A5-%EC%8A%A4%EC%BD%94%ED%94%84</guid>
            <pubDate>Mon, 07 Nov 2022 14:07:33 GMT</pubDate>
            <description><![CDATA[<h2 id="스코프">스코프</h2>
<h3 id="스코프란">스코프란?</h3>
<p><b>식별자가 유효한 범위</b></p>
<p>모든 식별자는 자신이 선언된 위치에 의해 다른 코드가 식별자 자신을 참조할 수 있는 유효 범위가 결정된다.</p>
<p>스코프는 자바스크립트 엔진이 식별자를 검색할 때 사용하는 규칙이라고도 할 수 있다.</p>
<p>💬 코드가 어디에서 실행되며 주변에 어떤 코드가 있는지를 <code>렉시컬 환경</code>이라고 부른다. 
즉, 코드의 문맥은 렉시컬 환경으로 이루어져있다. 이를 구현한 것이 <code>실행 컨텍스트</code> 이다.</p>
<pre><code class="language-js">let x = &quot;global&quot;;

function foo() {
  let x = &quot;local&quot;;
  console.log(x); // &#39;local&#39;
}

foo();

console.log(x); // &#39;global&#39;</code></pre>
<blockquote>
<p>만약 스코프라는 개념이 없다면 같은 이름을 갖는 변수는 충돌을 일으킬 수 있다.
스코프 내에서 식별자는 유일해야 하지만 다른 스코프에서는 같은 이름의 식별자를 사용할 수 있다.</p>
</blockquote>
<blockquote>
<p>var 키워드로 선언된 변수는 같은 스코프 내에서 중복 선언이 허용 된다. 변수값이 재할당되어 부작용을 발생시킬 수 있다.</p>
</blockquote>
<blockquote>
<p>let, const 키워드로 선언된 변수는 같은 스코프 내에서 중복 선언을 허용하지 않는다.</p>
</blockquote>
<br>

<h3 id="스코프의-종류">스코프의 종류</h3>
<h4 id="전역">전역</h4>
<p>코드의 가장 바깥 영역에서 변수를 선언하면 전역 스코프를 갖는 전역 변수가 된다.
어디서든지 참조가 가능하다. (함수 내부에서도 참조 가능하다)</p>
<br>

<h4 id="지역">지역</h4>
<p>함수 몸체 내부에서 변수를 선언하면 지역 스코프를 갖는 지역 변수가 된다.
지역 변수는 자신의 지역 스코프와 하위 지역 스코프에서 유효하다.</p>
<h3 id="스코프-체인">스코프 체인</h3>
<p>스코프가 계층적으로 연결된 것</p>
<ul>
<li>함수의 중첩 : 함수 몸체 내부에서 함수가 정의된 것</li>
<li>중첩 함수 : 함수 몸체 내부에서 정의한 함수</li>
<li>외부 함수 : 중첩 함수를 포함하는 함수</li>
</ul>
<p>함수는 중첩될 수 있으며 함수의 지역 스코프도 중첩될 수 있다.
 -&gt; 스코프가 함수의 중첩에 의해 계층적 구조를 갖는다는 것을 의미.
 -&gt; 외부 함수의 지역 스코프를 중첩 함수의 상위 스코프라 한다.</p>
<p>🐤 변수를 참조할 때 자바스크립트 엔진은 스코프 체인을 통해 변수를 참조하는 코드의 스코프에서 시작하여 상위 스코프 방향으로 이동하며 선언된 변수를 검색한다.</p>
<h4 id="스코프-체인에-의한-변수-검색">스코프 체인에 의한 변수 검색</h4>
<ul>
<li>상위 스코프에서 유효한 변수는 하위 스코프에서 자유롭게 참조할 수 있지만 하위 스코프에서 유효한 변수를 상위 스코프에서 참조할 수 없다.</li>
</ul>
<br>


<h3 id="함수-레벨-스코프">함수 레벨 스코프</h3>
<ul>
<li>블록 레벨 스코프 : 코드 블록(if, for, while, try/catch...)이 지역스코프를 만든다</li>
<li>함수 레벨 스코프 : var 키워드로 선언된 변수는 오로지 함수의 코드 블록(함수 몸체)만을 지역 스코프로 인정한다.</li>
</ul>
<pre><code class="language-js">var i = 10;

// for 문에서 선언한 i는 전역 변수다. 이미 선언된 전역 변수 i가 있으므로 중복 선언된다.
for (var i = 0; i &lt; 5; i++) {
  console.log(i); // 0 1 2 3 4
}

// 의도치 않게 변수의 값이 변경되었다.
console.log(i); // 5</code></pre>
<br>

<h3 id="렉시컬-스코프">렉시컬 스코프</h3>
<pre><code class="language-js">var x = 1;

function foo() {
  var x = 10;
  bar();
}

function bar() {
  console.log(x);
}

foo(); // 1
bar(); // 1</code></pre>
<ul>
<li>동적 스코프 : 함수를 어디서 호출했는지에 따라 함수의 상위 스코프를 결정.</li>
<li>렉시컬 스코프(정적 스코프) : 함수를 어디서 정의했는지에 따라 함수의 상위 스코프를 결정.</li>
</ul>
<p>🐤 자바스크립트는 렉시컬 스코프를 따른다. 함수가 호출된 위치는 상위 스코프 결정에 어떠한 영향을 주지 않는다. 함수의 상위 스코프는 언제나 자신이 정의된 스코프이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[daily 알고리즘 : 프로그래머스 0 level 8일차]]></title>
            <link>https://velog.io/@sarah_/daily-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-0-level-8%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@sarah_/daily-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-0-level-8%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Mon, 07 Nov 2022 10:47:27 GMT</pubDate>
            <description><![CDATA[<h1 id="배열-회전시키기">배열 회전시키기</h1>
<br>

<h2 id="문제">문제</h2>
<p>정수가 담긴 배열 numbers와 문자열 direction가 매개변수로 주어집니다. 배열 numbers의 원소를 direction방향으로 한 칸씩 회전시킨 배열을 return하도록 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항">제한사항</h2>
<ul>
<li>3 ≤ numbers의 길이 ≤ 20</li>
<li>direction은 &quot;left&quot; 와 &quot;right&quot; 둘 중 하나입니다.</li>
</ul>
<br>

<h2 id="입출력-예">입출력 예</h2>
<ul>
<li>numbers 가 [1, 2, 3]이고 direction이 &quot;right&quot; 이므로 오른쪽으로 한 칸씩 회전시킨 [3, 1, 2]를 return합니다.</li>
</ul>
<h2 id="풀이">풀이</h2>
<p>direction 이 right 일 때와 left 일때로 분기하여 answer이라는 빈배열에 값을 넣어주었다.</p>
<p>다른 사람 풀이를 보았는데 <code>unshift</code>, <code>shift</code>, <code>pop</code>을 이용하여 반복문을 사용하지 않은 간단한 풀이 방법이 있어서 같이 올려본다.</p>
<ul>
<li><p>나의 풀이</p>
<pre><code class="language-javascript">function solution(numbers, direction) {
let answer = [];
if (direction === &quot;right&quot;) {
  answer.push(numbers[numbers.length - 1]);
  for (let i = 0; i &lt; numbers.length - 1; i++) {
    answer.push(numbers[i]);
  }
} else {
  for (let i = 1; i &lt; numbers.length; i++) {
    answer.push(numbers[i]);
  }
  answer.push(numbers[0]);
}
return answer;
}</code></pre>
</li>
<li><p>다른사람 풀이</p>
<pre><code class="language-js">function solution(numbers, direction) {
var answer = [];

if (&quot;right&quot; == direction) {
  numbers.unshift(numbers.pop());
} else {
  numbers.push(numbers.shift());
}

answer = numbers;

return answer;
}</code></pre>
</li>
</ul>
<hr>
<h1 id="공-던지기">공 던지기</h1>
<br>

<h2 id="문제-1">문제</h2>
<p>머쓱이는 친구들과 동그랗게 서서 공 던지기 게임을 하고 있습니다. 공은 1번부터 던지며 오른쪽으로 한 명을 건너뛰고 그다음 사람에게만 던질 수 있습니다. 친구들의 번호가 들어있는 정수 배열 numbers와 정수 K가 주어질 때, k번째로 공을 던지는 사람의 번호는 무엇인지 return 하도록 solution 함수를 완성해보세요.</p>
<br>

<h2 id="제한사항-1">제한사항</h2>
<ul>
<li>2 &lt; numbers의 길이 &lt; 100</li>
<li>0 &lt; k &lt; 1,000</li>
<li>numbers의 첫 번째와 마지막 번호는 실제로 바로 옆에 있습니다.</li>
<li>numbers는 1부터 시작하며 번호는 순서대로 올라갑니다.</li>
</ul>
<br>

<h2 id="입출력-예-1">입출력 예</h2>
<p>numbers = [1,2,3,4], k = 2 일 때</p>
<ul>
<li>1번은 첫 번째로 3번에게 공을 던집니다.</li>
<li>3번은 두 번째로 1번에게 공을 던집니다.</li>
</ul>
<br>

<h2 id="풀이-1">풀이</h2>
<p>k가 증가 할 때마다 index를 2씩 증가시킨다.
index가 number의 길이보다 길어지면 number의 길이만큼 빼서 index가 number배열을 초과하지 않게 한다.</p>
<pre><code class="language-javascript">function solution(numbers, k) {
  let index = 0;

  for (let i = 0; i &lt; k; i++) {
    index += 2;
    if (index &gt; numbers.length) {
      index -= numbers.length;
    }
  }
  return numbers[index - 2];
}</code></pre>
<br>

<hr>
<h1 id="직사각형-넓이-구하기">직사각형 넓이 구하기</h1>
<br>

<h2 id="문제-2">문제</h2>
<p>2차원 좌표 평면에 변이 축과 평행한 직사각형이 있습니다. 직사각형 네 꼭짓점의 좌표 [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]가 담겨있는 배열 dots가 매개변수로 주어질 때, 직사각형의 넓이를 return 하도록 solution 함수를 완성해보세요.</p>
<br>

<h2 id="제한사항-2">제한사항</h2>
<ul>
<li>dots의 길이 = 4</li>
<li>dots의 원소의 길이 = 2</li>
<li>-256 &lt; dots[i]의 원소 &lt; 256</li>
<li>잘못된 입력은 주어지지 않습니다.</li>
</ul>
<br>

<h2 id="입출력-예-2">입출력 예</h2>
<ul>
<li>좌표 [[1, 1], [2, 1], [2, 2], [1, 2]] 를 꼭짓점으로 갖는 직사각형의 가로, 세로 길이는 각각 1, 1이므로 직사각형의 넓이는 1 x 1 = 1입니다.</li>
</ul>
<h2 id="풀이-2">풀이</h2>
<p>x 좌표 중 가장 큰 값에서 가장 작은 x값을 뺀 값을 width로,
y 좌표 중 가장 큰 값에서 가장 작은 y값을 뺀 값을 height로 할당 후 두 값을 곱해주었다.</p>
<pre><code class="language-javascript">function solution(dots) {
  const width = dots.map((n) =&gt; n[0]);
  const height = dots.map((n) =&gt; n[1]);

  return (
    (Math.max(...width) - Math.min(...width)) *
    (Math.max(...height) - Math.min(...height))
  );
}</code></pre>
<hr>
<h1 id="모스부호1">모스부호(1)</h1>
<br>

<h2 id="문제-3">문제</h2>
<p>머쓱이는 친구에게 모스부호를 이용한 편지를 받았습니다. 그냥은 읽을 수 없어 이를 해독하는 프로그램을 만들려고 합니다. 문자열 letter가 매개변수로 주어질 때, letter를 영어 소문자로 바꾼 문자열을 return 하도록 solution 함수를 완성해보세요.</p>
<br>

<h2 id="제한사항-3">제한사항</h2>
<ul>
<li>1 ≤ letter의 길이 ≤ 1,000</li>
<li>return값은 소문자입니다.</li>
<li>letter의 모스부호는 공백으로 나누어져 있습니다.</li>
<li>letter에 공백은 연속으로 두 개 이상 존재하지 않습니다.</li>
<li>해독할 수 없는 편지는 주어지지 않습니다.</li>
<li>편지의 시작과 끝에는 공백이 없습니다.</li>
</ul>
<br>

<h2 id="입출력-예-3">입출력 예</h2>
<ul>
<li>.... = h</li>
<li>. = e</li>
<li>.-.. = l</li>
<li>.-.. = l</li>
<li>--- = o
따라서 &quot;hello&quot;를 return 합니다.</li>
</ul>
<h2 id="풀이-3">풀이</h2>
<pre><code class="language-javascript">function solution(letter) {
  let morse = {
    &quot;.-&quot;: &quot;a&quot;,
    &quot;-...&quot;: &quot;b&quot;,
    &quot;-.-.&quot;: &quot;c&quot;,
    &quot;-..&quot;: &quot;d&quot;,
    &quot;.&quot;: &quot;e&quot;,
    &quot;..-.&quot;: &quot;f&quot;,
    &quot;--.&quot;: &quot;g&quot;,
    &quot;....&quot;: &quot;h&quot;,
    &quot;..&quot;: &quot;i&quot;,
    &quot;.---&quot;: &quot;j&quot;,
    &quot;-.-&quot;: &quot;k&quot;,
    &quot;.-..&quot;: &quot;l&quot;,
    &quot;--&quot;: &quot;m&quot;,
    &quot;-.&quot;: &quot;n&quot;,
    &quot;---&quot;: &quot;o&quot;,
    &quot;.--.&quot;: &quot;p&quot;,
    &quot;--.-&quot;: &quot;q&quot;,
    &quot;.-.&quot;: &quot;r&quot;,
    &quot;...&quot;: &quot;s&quot;,
    &quot;-&quot;: &quot;t&quot;,
    &quot;..-&quot;: &quot;u&quot;,
    &quot;...-&quot;: &quot;v&quot;,
    &quot;.--&quot;: &quot;w&quot;,
    &quot;-..-&quot;: &quot;x&quot;,
    &quot;-.--&quot;: &quot;y&quot;,
    &quot;--..&quot;: &quot;z&quot;,
  };
  let letterArr = letter.split(&quot; &quot;);
  let answer = &quot;&quot;;
  letterArr.map((el) =&gt; (answer += morse[el]));
  return answer;
}
</code></pre>
<hr>
<h1 id="문자열-정렬하기-1">문자열 정렬하기 (1)</h1>
<br>

<h2 id="문제-4">문제</h2>
<p>문자열 my_string이 매개변수로 주어질 때, my_string 안에 있는 숫자만 골라 오름차순 정렬한 리스트를 return 하도록 solution 함수를 작성해보세요.</p>
<br>

<h2 id="제한사항-4">제한사항</h2>
<ul>
<li>1 ≤ my_string의 길이 ≤ 100</li>
<li>my_string에는 숫자가 한 개 이상 포함되어 있습니다.</li>
<li>my_string은 영어 소문자 또는 0부터 9까지의 숫자로 이루* 어져 있습니다.</li>
</ul>
<br>

<h2 id="입출력-예-4">입출력 예</h2>
<ul>
<li>&quot;hi12392&quot;에 있는 숫자 1, 2, 3, 9, 2를 오름차순 정렬한 [1, 2, 2, 3, 9]를 return 합니다.</li>
</ul>
<h2 id="풀이-4">풀이</h2>
<pre><code class="language-javascript">function solution(my_string) {
  return [...my_string]
    .filter((el) =&gt; !isNaN(el))
    .map((el) =&gt; Number(el))
    .sort();
}</code></pre>
<hr>
<h1 id="숨어있는-숫자의-덧셈-1">숨어있는 숫자의 덧셈 (1)</h1>
<br>

<h2 id="문제-5">문제</h2>
<p>문자열 my_string이 매개변수로 주어집니다. my_string안의 모든 자연수들의 합을 return하도록 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항-5">제한사항</h2>
<ul>
<li>1 ≤ my_string의 길이 ≤ 1,000</li>
<li>my_string은 소문자, 대문자 그리고 한자리 자연수로만 구성되어있습니다.</li>
</ul>
<br>

<h2 id="입출력-예-5">입출력 예</h2>
<ul>
<li>&quot;aAb1B2cC34oOp&quot;안의 한자리 자연수는 1, 2, 3, 4 입니다. 따라서 1 + 2 + 3 + 4 = 10 을 return합니다.</li>
</ul>
<h2 id="풀이-5">풀이</h2>
<pre><code class="language-javascript">function solution(my_string) {
  return [...my_string]
    .filter((el) =&gt; !isNaN(el))
    .reduce((a, b) =&gt; Number(a) + Number(b));
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[daily 알고리즘 : 프로그래머스 0 level 7일차]]></title>
            <link>https://velog.io/@sarah_/daily-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-0-level-7%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@sarah_/daily-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-0-level-7%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Thu, 03 Nov 2022 12:08:15 GMT</pubDate>
            <description><![CDATA[<h1 id="치킨-쿠폰">치킨 쿠폰</h1>
<br>

<h2 id="문제">문제</h2>
<p>프로그래머스 치킨은 치킨을 시켜먹으면 한 마리당 쿠폰을 한 장 발급합니다. 쿠폰을 열 장 모으면 치킨을 한 마리 서비스로 받을 수 있고, 서비스 치킨에도 쿠폰이 발급됩니다. 시켜먹은 치킨의 수 chicken이 매개변수로 주어질 때 받을 수 있는 최대 서비스 치킨의 수를 return하도록 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항">제한사항</h2>
<ul>
<li>chicken은 정수입니다.</li>
<li>0 ≤ chicken ≤ 1,000,000</li>
</ul>
<br>

<h2 id="입출력-예">입출력 예</h2>
<ul>
<li>100마리를 주문하면 쿠폰이 100장 발급되므로 서비스 치킨 10마리를 주문할 수 있습니다.</li>
<li>10마리를 주문하면 쿠폰이 10장 발급되므로 서비스 치킨 1마리를 주문할 수 있습니다.</li>
<li>따라서 10 + 1 = 11 을 return합니다.</li>
</ul>
<h2 id="풀이">풀이</h2>
<p>처음 짠 로직이 한 케이스만 통과가 되지 않아서
한참 고민하다가 다른 사람 풀이를 참고해서 다시 구현해보았다.</p>
<p>10마리 주문마다 치킨 수를 +1 해주었다.</p>
<pre><code class="language-javascript">function solution(chicken) {
  let answer = 0;
  while (chicken &gt;= 10) {
    let orderChicken = ~~(chicken / 10);
    let couponChicken = ~~(chicken % 10);
    chicken = orderChicken + couponChicken;
    answer += orderChicken;
  }
  return answer;
}</code></pre>
<hr>
<h1 id="개미-군단">개미 군단</h1>
<br>

<h2 id="문제-1">문제</h2>
<p>개미 군단이 사냥을 나가려고 합니다. 개미군단은 사냥감의 체력에 딱 맞는 병력을 데리고 나가려고 합니다. 장군개미는 5의 공격력을, 병정개미는 3의 공격력을 일개미는 1의 공격력을 가지고 있습니다. 예를 들어 체력 23의 여치를 사냥하려고 할 때, 일개미 23마리를 데리고 가도 되지만, 장군개미 네 마리와 병정개미 한 마리를 데리고 간다면 더 적은 병력으로 사냥할 수 있습니다. 사냥감의 체력 hp가 매개변수로 주어질 때, 사냥감의 체력에 딱 맞게 최소한의 병력을 구성하려면 몇 마리의 개미가 필요한지를 return하도록 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항-1">제한사항</h2>
<ul>
<li>hp는 자연수입니다.</li>
<li>0 ≤ hp ≤ 1000</li>
</ul>
<br>

<h2 id="입출력-예-1">입출력 예</h2>
<ul>
<li>hp가 24이므로, 장군개미 네마리 병정개미 한마리 일개미 한마리로 사냥할 수 있습니다. 따라서 6을 return합니다.</li>
</ul>
<br>

<h2 id="풀이-1">풀이</h2>
<p>ant 배열에 개미 공격력을 나열한 후, hp를 배열 인덱스 별로 나누어 answer에 push 하였다.
answer 배열값을 모두 더한 값을 리턴해 주었다.</p>
<p>예를 들어 hp가 102 이었다면, answer 은 [20, 0, 2] 가 된다.</p>
<pre><code class="language-javascript">function solution(hp) {
  let ant = [5, 3, 1];
  let answer = [];

  for (let i of ant) {
    answer.push(~~(hp / i));
    hp %= i;
  }
  return answer.reduce((a, b) =&gt; a + b);
}</code></pre>
<br>

<hr>
<h1 id="캐릭터의-좌표">캐릭터의 좌표</h1>
<br>

<h2 id="문제-2">문제</h2>
<p>머쓱이는 RPG게임을 하고 있습니다. 게임에는 up, down, left, right 방향키가 있으며 각 키를 누르면 위, 아래, 왼쪽, 오른쪽으로 한 칸씩 이동합니다. 예를 들어 [0,0]에서 up을 누른다면 캐릭터의 좌표는 [0, 1], down을 누른다면 [0, -1], left를 누른다면 [-1, 0], right를 누른다면 [1, 0]입니다. 머쓱이가 입력한 방향키의 배열 keyinput와 맵의 크기 board이 매개변수로 주어집니다. 캐릭터는 항상 [0,0]에서 시작할 때 키 입력이 모두 끝난 뒤에 캐릭터의 좌표 [x, y]를 return하도록 solution 함수를 완성해주세요.</p>
<ul>
<li>[0, 0]은 board의 정 중앙에 위치합니다. 예를 들어 board의 가로 크기가 9라면 캐릭터는 왼쪽으로 최대 [-4, 0]까지 오른쪽으로 최대 [4, 0]까지 이동할 수 있습니다.</li>
</ul>
<br>

<h2 id="제한사항-2">제한사항</h2>
<ul>
<li>board은 [가로 크기, 세로 크기] 형태로 주어집니다.</li>
<li>board의 가로 크기와 세로 크기는 홀수입니다.</li>
<li>board의 크기를 벗어난 방향키 입력은 무시합니다.</li>
<li>0 ≤ keyinput의 길이 ≤ 50</li>
<li>1 ≤ board[0] ≤ 99</li>
<li>1 ≤ board[1] ≤ 99</li>
<li>keyinput은 항상 up, down, left, right만 주어집니다.</li>
</ul>
<br>

<h2 id="입출력-예-2">입출력 예</h2>
<ul>
<li>[0, 0]에서 아래로 다섯 칸 이동한 좌표는 [0, -5]이지만 맵의 세로 크기가 9이므로 아래로는 네 칸을 넘어서 이동할 수 없습니다. 따라서 [0, -4]를 return합니다.</li>
</ul>
<h2 id="풀이-2">풀이</h2>
<p>board 크기의 범위를 벗어나지 않는 조건에서 좌표를 이동시켜주었다.</p>
<pre><code class="language-javascript">function solution(keyinput, board) {
  const answer = [0, 0];
  let boardWidth = board[0] / 2;
  let boardHeight = board[1] / 2;

  for (let i of keyinput) {
    switch (i) {
      case &quot;left&quot;:
        if (-answer[0] &lt; boardWidth - 1) answer[0]--;
        break;
      case &quot;right&quot;:
        if (answer[0] &lt; boardWidth - 1) answer[0]++;
        break;
      case &quot;up&quot;:
        if (answer[1] &lt; boardHeight - 1) answer[1]++;
        break;
      case &quot;down&quot;:
        if (-answer[1] &lt; boardHeight - 1) answer[1]--;
        break;
    }
  }

  return answer;
}</code></pre>
<hr>
<h1 id="가위-바위-보">가위 바위 보</h1>
<br>

<h2 id="문제-3">문제</h2>
<p>가위는 2 바위는 0 보는 5로 표현합니다. 가위 바위 보를 내는 순서대로 나타낸 문자열 rsp가 매개변수로 주어질 때, rsp에 저장된 가위 바위 보를 모두 이기는 경우를 순서대로 나타낸 문자열을 return하도록 solution 함수를 완성해보세요.</p>
<br>

<h2 id="제한사항-3">제한사항</h2>
<ul>
<li>0 &lt; rsp의 길이 ≤ 100</li>
<li>rsp와 길이가 같은 문자열을 return 합니다.</li>
<li>rsp는 숫자 0, 2, 5로 이루어져 있습니다.</li>
</ul>
<br>

<h2 id="입출력-예-3">입출력 예</h2>
<ul>
<li>&quot;205&quot;는 순서대로 가위, 바위, 보이고 이를 모두 이기려면 바위, 보, 가위를 순서대로 내야하므로 “052”를 return합니다.</li>
</ul>
<h2 id="풀이-3">풀이</h2>
<p>/* 
이길 수 있는 조건들을 객체 형태로 저장하였다.
그 후 rsp 인덱스값을 win객체의 키에 대입하여 값을 얻고, 정답을 리턴해주었다.
*/</p>
<pre><code class="language-javascript">function solution(rsp) {
  let answer = &quot;&quot;;
  let win = { 2: &quot;0&quot;, 0: &quot;5&quot;, 5: &quot;2&quot; };
  for (let i of rsp) {
    answer += win[i];
  }
  return answer;
}</code></pre>
<hr>
<h1 id="구슬을-나누는-경우의-수">구슬을 나누는 경우의 수</h1>
<br>

<h2 id="문제-4">문제</h2>
<p>머쓱이는 구슬을 친구들에게 나누어주려고 합니다. 구슬은 모두 다르게 생겼습니다. 머쓱이가 갖고 있는 구슬의 개수 balls와 친구들에게 나누어 줄 구슬 개수 share이 매개변수로 주어질 때, balls개의 구슬 중 share개의 구슬을 고르는 가능한 모든 경우의 수를 return 하는 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항-4">제한사항</h2>
<ul>
<li>2 ≤ numbers의 길이 ≤ 30</li>
<li>0 ≤ numbers의 원소 ≤ 1,000</li>
<li>0 ≤num1 &lt; num2 &lt; numbers의 길이</li>
</ul>
<br>

<h2 id="입출력-예-4">입출력 예</h2>
<ul>
<li>1 ≤ balls ≤ 30</li>
<li>1 ≤ share ≤ 30</li>
<li>구슬을 고르는 순서는 고려하지 않습니다.</li>
<li>share ≤ balls</li>
<li>서로 다른 구슬 5개 중 3개를 고르는 경우의 수는 10입니다.</li>
</ul>
<h2 id="풀이-4">풀이</h2>
<p>factorial 연산을 재귀함수로 구현해주었다.</p>
<pre><code class="language-javascript">function fac(num) {
  if (num === 0) return 1;
  return num * fac(num - 1);
}

function solution(balls, share) {
  return Math.round(fac(balls) / (fac(balls - share) * fac(share)));
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DeepDiveJS] 12장 함수]]></title>
            <link>https://velog.io/@sarah_/DeepDiveJS-12%EC%9E%A5-%ED%95%A8%EC%88%98-%EC%9E%91%EC%84%B1-%EC%A4%91</link>
            <guid>https://velog.io/@sarah_/DeepDiveJS-12%EC%9E%A5-%ED%95%A8%EC%88%98-%EC%9E%91%EC%84%B1-%EC%A4%91</guid>
            <pubDate>Sun, 30 Oct 2022 13:34:00 GMT</pubDate>
            <description><![CDATA[<h2 id="함수란">함수란?</h2>
<p>일련의 과정을 문(statement)으로 구현하고 코드 블록으로 감싸서 하나의 실행 단위로 정의한 것.</p>
<p><img src="https://velog.velcdn.com/images/sarah_/post/dc924695-9dbd-4e79-8198-162d212d9378/image.png" alt=""></p>
<h2 id="함수를-사용하는-이유">함수를 사용하는 이유</h2>
<ul>
<li>코드의 재사용</li>
<li>유지보수의 편의성</li>
<li>코드의 신뢰성</li>
<li>코드의 가독성 향상</li>
</ul>
<h2 id="함수-정의-방식">함수 정의 방식</h2>
<ul>
<li><p>함수 선언문</p>
</li>
<li><p>화살표 함수</p>
</li>
<li><p>함수 표현식</p>
<pre><code class="language-js">let add = function(x,y) {
return x+y;
};</code></pre>
</li>
<li><p>생성자 함수</p>
<pre><code class="language-js">let add = new Function(&#39;x&#39;, &#39;y&#39;, &#39;return x+y&#39;);</code></pre>
</li>
</ul>
<h3 id="함수-생성-시점과-함수-호이스팅">함수 생성 시점과 함수 호이스팅</h3>
<ul>
<li>함수 선언문으로 정의한 함수는 함수 선언문 이전에 호출할 수 있다.</li>
<li>함수 표현식으로 정의한 함수는 함수 표현식 이전에 호출할 수 없다.</li>
</ul>
<p>📌 함수 호이스팅 : 함수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징.</p>
<br>

<h4 id="🔗-함수-표현식은-변수에-할당되는-구조이다">🔗 함수 표현식은 변수에 할당되는 구조이다.</h4>
<p><code>var</code> 키워드를 사용하여 함수를 할당하면 함수 선언문과 다르게 변수 호이스팅이 발생한다.</p>
<br>
<br>

<h3 id="화살표-함수">화살표 함수</h3>
<p><code>=&gt;</code> 를 사용하여 간략한 방법으로 함수를 선언 할 수 있다.</p>
<hr>
<h2 id="함수-호출">함수 호출</h2>
<h3 id="매개변수와-인수">매개변수와 인수</h3>
<blockquote>
<p>ES6 에서 도입된 매개변수 기본값을 사용하면 함수 내에서 수행하던 인수 체크 및 초기화를 간소할 수 있다.</p>
</blockquote>
<pre><code class="language-js">function add(a = 0, b = 0, c = 0) {
  return a + b + c;
}

console.log(add(1, 2, 3)); // 6
console.log(add(1, 2)); // 3
console.log(add(1)); // 1
console.log(add()); // 0</code></pre>
<hr>
<h2 id="참조에-의한-전달과-외부-상태의-변경">참조에 의한 전달과 외부 상태의 변경</h2>
<p>🔓 매개변수로 원시 값이 아니라 참조 값을 전달 받거나
함수가 참조 값을 영향을 끼치는 경우 객체의 원본을 훼손할 수 있다.</p>
<hr>
<h2 id="다양한-함수의-형태">다양한 함수의 형태</h2>
<h3 id="1-즉시-실행-함수">1. 즉시 실행 함수</h3>
<p>단 한 번만 호출되며 다시 호출할 수 없다.
반드시 그룹 연산자 (...) 로 감싸야 한다.</p>
<pre><code class="language-js">(fuction () {
     let a = 3;
     let b = 5;
     return a * b;
 }());</code></pre>
<h3 id="2-재귀-함수">2. 재귀 함수</h3>
<p>자기 자신을 호출하는 함수. 반복 처리를 위해 사용.</p>
<p>예를 들면, 팩토리얼 함수!</p>
<pre><code class="language-js">function factorial(n) {
  if(n &lt;= 1) return 1;

  return n * factorial(n-1);
}</code></pre>
<h3 id="3-중첩-함수">3. 중첩 함수</h3>
<p>함수 내부에 정의된 함수</p>
<h3 id="4-콜백-함수">4. 콜백 함수</h3>
<p>함수의 매개변수를 통해 다른 함수의 내부로 전달되는 함수</p>
<h3 id="5-순수-함수와-비순수-함수">5. 순수 함수와 비순수 함수</h3>
<ul>
<li>순수 함수 : 외부 상태에 의존하지도, 변경하지도 않는 부수효과가 없는 함수 ( &lt;-&gt; <code>비순수 함수</code> )</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[React Hook]]></title>
            <link>https://velog.io/@sarah_/React-Hook</link>
            <guid>https://velog.io/@sarah_/React-Hook</guid>
            <pubDate>Sun, 30 Oct 2022 12:31:41 GMT</pubDate>
            <description><![CDATA[<p>useMemo와 useCallback를 살펴보기 전에, <code>memoization</code>에 대해 먼저 알아보자</p>
<h1 id="memoization">Memoization</h1>
<p>기존에 수행한 연산의 결과값을 어딘가에 저장해두고 동일한 입력이 들어오면 재활용하는 프로그래밍 기법. 
📍 적절히 사용하면 중복 연산을 피할 수 있어서 애플리케이션의 성능을 최적화 할 수 있다!</p>
<pre><code class="language-js">function Sarah(props) {
  // ....... 로직

  return;
}</code></pre>
<p>위와 같은 컴포넌트 함수는 React에서 랜더링이 일어날 때마다 호출이 된다.</p>
<p>만약, 함수가 내부적으로 복잡한 연산을 수행한다면 랜더링 될 때마다 지연이 발생할 수 있다. 이러한 문제를 해결하기 위해 <code>memoization</code>을 적용 시켜 줄 수 있다.</p>
<h1 id="usememo">useMemo</h1>
<p><strong>특정 값(value)를 재사용하고자 할 때 사용한다.</strong></p>
<p>아래 예시를 보면, props로 넘어온 <code>value</code>값을 <code>Calculator</code>라는 함수에 인자로 넘겨서 <code>result</code> 값을 구한 후, <code>&lt;div&gt;</code>엘리먼트로 출력을 하고 있다.</p>
<p>만약 여기서 <code>Calculator</code>가 내부적으로 복잡한 연산을 하는 함수라고 가정해보자.
해당 컴포넌트는 렌더링을 할 때마다 이 함수를 계속 호출할 것이고, 그 때마다 시간이 몇 초 이상 소요가 될 것이다. 결국 이 지연은 렌더링에도 영향을 미치게 될 것이며, 사용자는 앱의 로딩 속도가 느리다는 생각을 하게 될 것이다.</p>
<pre><code class="language-js">function Calculator({value}){

    const result = calculate(value);

    return &lt;&gt;
      &lt;div&gt;
        {result}
      &lt;/div&gt;
  &lt;/&gt;;
}</code></pre>
<p>하지만 아래와 같이 useMemo를 사용함으로써, <code>value</code>의 값을 저장 해뒀다가 필요할 때 사용함으로써 <code>Calculator</code> 함수호출을 줄일 수 있다. 특히 <code>value</code> 값이 렌더링 할 때마다 계속 바뀌지 않는 경우라면 더욱 좋다. </p>
<pre><code class="language-jsx">import { useMemo } from &quot;react&quot;;

function Calculator({value}){

    const result = useMemo(() =&gt; calculate(value), [value]);

    return &lt;&gt;
      &lt;div&gt;
        {result}
      &lt;/div&gt;
  &lt;/&gt;;
}</code></pre>
<p>이런식으로 <code>useMemo</code>를 호출하여 <code>Calculator</code>를 감싸주면, 이전에 구축된 렌더링과 새로 구축되는 렌더링을 비교해 <code>value</code>값이 동일할 경우에는 이전 렌더링의 <code>value</code>값을 그대로 재활용 할 수 있게 된다.</p>
<hr>
<h1 id="usecallback">useCallback</h1>
<p>특정 결과값을 재사용하는 useMemo와 달리 useCallback은 <strong>함수의 재사용을 위해 사용한다.</strong></p>
<p>아래 코드를 보면, <code>Calculator</code> 컴포넌트 내에 <code>add</code> 라는 함수가 선언되어 있다. 이 <code>add</code> 함수는 props로 넘어온 <code>x</code>와 <code>y</code>의 값을 더해 <code>&lt;div&gt;</code> 태그에 값을 출력하고 있다.</p>
<pre><code class="language-jsx">function Calculator({x, y}){

    const add = () =&gt; x + y;

    return &lt;&gt;
      &lt;div&gt;
        {add()}
      &lt;/div&gt;
  &lt;/&gt;;
}</code></pre>
<p><code>useMemo</code>와 마찬가지로 해당 컴포넌트가 리렌더링 되더라도 그 함수가 의존하고 있는 값인 <code>x</code>와 <code>y</code>가 바뀌지 않을 때, <code>useCallback</code> Hook을 사용할 수 있다. 즉. <code>x</code>와 <code>y</code>값이 동일하다면 다음 렌더링 때 이 함수를 다시 사용하는 것이다.</p>
<pre><code class="language-jsx">import React, { useCallback } from &quot;react&quot;;

function Calculator({x, y}){

    const add = useCallback(() =&gt; x + y, [x, y]);

    return &lt;&gt;
      &lt;div&gt;
        {add()}
      &lt;/div&gt;
  &lt;/&gt;;
}</code></pre>
<h2 id="✏️-usecallback과-참조-동등성">✏️ useCallback과 참조 동등성</h2>
<p><code>useCallback</code>은 참조 동등성에 의존한다. React는 JavaScript 언어로 만들어진 오픈소스 라이브러리이기 때문에 기본적으로 JavaScript의 문법을 따라간다. JavaScript에서 함수는 객체이다. 객체는 메모리에 저장할 때 값을 저장하는 게 아니라 값의 주소를 저장하기 때문에, 반환하는 값이 같을 지라도 일치연산자로 비교했을 때 <code>false</code>가 출력된다.</p>
<pre><code class="language-jsx">function doubleFactory(){
    return (a) =&gt; 2 * a;
}

const double1 = doubleFactory();
const double2 = doubleFactory();

double1(8); // 16
double2(8); // 16

double1 === double2;  // false
double1 === double1;  // true</code></pre>
<p><code>double1</code>과 <code>double2</code>는 같은 함수를 할당 했음에도 메모리 주소 값이 다르기 때문에 같다고 보지 않는다. 두개의 함수는 동일한 코드를 공유하더라도 메모리 주소가 다르기 때문에, 메모리 주소에 의한 참조 비교 시 다른 함수로 본다.</p>
<p>이는 React 또한 같다. React는 리렌더링 시 함수를 새로 만들어서 호출을 한다. 새로 만들어 호출된 함수는 기존의 함수와 같은 함수가 아니다. 그러나 <code>useCallback</code>을 이용해 함수 자체를 저장해서 다시 사용하면 함수의 메모리 주소 값을 저장했다가 다시 사용한다는 것과 같다고 볼 수 있다. 따라서 React 컴포넌트 함수 내에서 다른 함수의 인자로 넘기거나 자식 컴포넌트의 prop으로 넘길 때 예상치 못한 성능 문제를 막을 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[daily 알고리즘 : 프로그래머스 0 level 6일차]]></title>
            <link>https://velog.io/@sarah_/daily-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-0-level-6%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@sarah_/daily-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-0-level-6%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Sun, 30 Oct 2022 12:03:56 GMT</pubDate>
            <description><![CDATA[<h1 id="저주의-숫자-3">저주의 숫자 3</h1>
<br>

<h2 id="문제">문제</h2>
<p>3x 마을 사람들은 3을 저주의 숫자라고 생각하기 때문에 3의 배수와 숫자 3을 사용하지 않습니다. 3x 마을 사람들의 숫자는 다음과 같습니다.</p>
<p><img src="https://velog.velcdn.com/images/sarah_/post/1622db4f-9f73-4de7-b432-85613cfb608a/image.png" alt=""></p>
<p>정수 n이 매개변수로 주어질 때, n을 3x 마을에서 사용하는 숫자로 바꿔 return하도록 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항">제한사항</h2>
<ul>
<li>1 ≤ n ≤ 100</li>
</ul>
<br>

<h2 id="입출력-예">입출력 예</h2>
<ul>
<li>15를 3x 마을의 숫자로 변환하면 25입니다.</li>
<li>40을 3x 마을의 숫자로 변환하면 76입니다.</li>
</ul>
<h2 id="풀이">풀이</h2>
<p>초기값 1을 가지고 있는 answer 배열을 생성 후 길이가 n과 같아질 때 까지
3의 배수가 아니면서 3을 포함하지 않는 숫자를 push 해주었다.</p>
<p>그 후, 마지막 배열값을 리턴해주었다.</p>
<pre><code class="language-javascript">function solution(n) {
  let answer = [1];
  let i = 1;
  while (answer.length &lt; n) {
    i++;
    if (i % 3 !== 0 &amp;&amp; !(i + &quot;&quot;).includes(3)) {
      answer.push(i);
    }
  }
  return answer.pop();
}</code></pre>
<hr>
<h1 id="순서쌍의-개수">순서쌍의 개수</h1>
<br>

<h2 id="문제-1">문제</h2>
<p>순서쌍이란 두 개의 숫자를 순서를 정하여 짝지어 나타낸 쌍으로 (a, b)로 표기합니다. 자연수 n이 매개변수로 주어질 때 두 숫자의 곱이 n인 자연수 순서쌍의 개수를 return하도록 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항-1">제한사항</h2>
<ul>
<li>1 ≤ n ≤ 1,000,000</li>
</ul>
<br>

<h2 id="입출력-예-1">입출력 예</h2>
<ul>
<li>n이 20 이므로 곱이 20인 순서쌍은 (1, 20), (2, 10), (4, 5), (5, 4), (10, 2), (20, 1) 이므로 6을 return합니다.</li>
</ul>
<br>

<h2 id="풀이-1">풀이</h2>
<p>n을 1부터 n까지의 수로 나누면서 나머지가 0이 되는 수가 있을 때마다 answer의 카운트를 1만큼 늘려준다.
이 작업을 n만큼 반복문 돌린다.</p>
<pre><code class="language-javascript">function solution(n) {
  let answer = 0;
  let i = 1;
  while (i &lt;= n) {
    if (n % i === 0) {
      answer++;
    }
    i++;
  }
  return answer;
}</code></pre>
<br>

<hr>
<h1 id="진료순서-정하기">진료순서 정하기</h1>
<br>

<h2 id="문제-2">문제</h2>
<p>외과의사 머쓱이는 응급실에 온 환자의 응급도를 기준으로 진료 순서를 정하려고 합니다. 정수 배열 emergency가 매개변수로 주어질 때 응급도가 높은 순서대로 진료 순서를 정한 배열을 return하도록 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항-2">제한사항</h2>
<ul>
<li>중복된 원소는 없습니다.</li>
<li>1 ≤ emergency의 길이 ≤ 10</li>
<li>1 ≤ emergency의 원소 ≤ 100</li>
</ul>
<br>

<h2 id="입출력-예-2">입출력 예</h2>
<ul>
<li>emergency가 [3, 76, 24]이므로 응급도의 크기 순서대로 번호를 매긴 [3, 1, 2]를 return합니다.</li>
</ul>
<h2 id="풀이-2">풀이</h2>
<p>emergency 배열을 내림차순으로 sort한 후 emergency 배열을 index+1 값으로 대체한다.</p>
<pre><code class="language-javascript">function solution(emergency) {
  let answer = [...emergency].sort((a, b) =&gt; b - a);
  return emergency.map((el) =&gt; answer.indexOf(el) + 1);
}</code></pre>
<hr>
<h1 id="외계행성의-나이">외계행성의 나이</h1>
<br>

<h2 id="문제-3">문제</h2>
<p>우주여행을 하던 머쓱이는 엔진 고장으로 PROGRAMMERS-962 행성에 불시착하게 됐습니다. 입국심사에서 나이를 말해야 하는데, PROGRAMMERS-962 행성에서는 나이를 알파벳으로 말하고 있습니다. a는 0, b는 1, c는 2, ..., j는 9입니다. 예를 들어 23살은 cd, 51살은 fb로 표현합니다. 나이 age가 매개변수로 주어질 때 PROGRAMMER-962식 나이를 return하도록 solution 함수를 완성해주세요.</p>
<br>

<h2 id="제한사항-3">제한사항</h2>
<ul>
<li>age는 자연수입니다.</li>
<li>age ≤ 1,000</li>
<li>PROGRAMMERS-962 행성은 알파벳 소문자만 사용합니다.</li>
</ul>
<br>

<h2 id="입출력-예-3">입출력 예</h2>
<ul>
<li>age가 23이므로 &quot;cd&quot;를 return합니다.</li>
</ul>
<h2 id="풀이-3">풀이</h2>
<p>알파벳을 나열한 후 매개변수 age 값에 맞게 인덱스 값으로 대치해주었다.</p>
<pre><code class="language-javascript">function solution(age) {
  let answer = &quot;&quot;;
  let alphabet = &quot;abcdefghij&quot;;
  [...String(age)].map((el) =&gt; {
    answer += alphabet[el];
  });
  return answer;
}</code></pre>
<hr>
<h1 id="배열-자르기">배열 자르기</h1>
<br>

<h2 id="문제-4">문제</h2>
<p>정수 배열 numbers와 정수 num1, num2가 매개변수로 주어질 때, numbers의 num1번 째 인덱스부터 num2번째 인덱스까지 자른 정수 배열을 return 하도록 solution 함수를 완성해보세요.</p>
<br>

<h2 id="제한사항-4">제한사항</h2>
<ul>
<li>2 ≤ numbers의 길이 ≤ 30</li>
<li>0 ≤ numbers의 원소 ≤ 1,000</li>
<li>0 ≤num1 &lt; num2 &lt; numbers의 길이</li>
</ul>
<br>

<h2 id="입출력-예-4">입출력 예</h2>
<ul>
<li>[1, 3, 5]의 1번째 인덱스 3부터 2번째 인덱스 5까지 자른 [3, 5]를 return 합니다.</li>
</ul>
<h2 id="풀이-4">풀이</h2>
<p>slice 메서드를 사용하여 num1, num2 사이의 인덱스 값을 리턴해주었다.</p>
<pre><code class="language-javascript">function solution(numbers, num1, num2) {
  return numbers.slice(num1, num2 + 1);
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DeepDiveJS] 11장 원시 값과 객체의 비교]]></title>
            <link>https://velog.io/@sarah_/DeepDiveJS-11%EC%9E%A5</link>
            <guid>https://velog.io/@sarah_/DeepDiveJS-11%EC%9E%A5</guid>
            <pubDate>Sat, 29 Oct 2022 03:43:56 GMT</pubDate>
            <description><![CDATA[<p>🖊️ 원시 값과 객체의 비교</p>
<ul>
<li>원시 값을 변수에 할당하면 변수(확보된 메모리 공간)에는 실제 값이 저장된다.</li>
<li>객체를 변수에 할당하면 변수에는 참조 값이 저장된다.</li>
<li>원시 값을 갖는 변수를 다른 변수에 할당하면 원시 값이 복사되어 전달 된다.
-&gt; 값에 의한 전달</li>
<li>객체를 가리키는 변수를 다른 변수에 할당하면 원본의 참조 값이 복사되어 전달 된다
-&gt; 참조에 의한 전달</li>
</ul>
<hr>
<h2 id="원시-값--변경-불가능한-값">원시 값 : 변경 불가능한 값</h2>
<p><code>변수</code>는 하나의 값을 저장하기 위해 확보된 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인 이름.
<code>값</code>은 변수에 저장된 데이터로서 표현식이 평가되어 생선된 결과.</p>
<blockquote>
<p><strong>변경 불가능하다는 것은 변수가 아니라 값에 대한 진술이다.</strong></p>
</blockquote>
<p><code>상수</code>는 변수의 상대 개념으로 재할당이 금지된 변수이다. 물론 값을 저장하기 위한 메모리 공간이 필요하므로 <code>변수</code>라고 할 수 있다. 하지만, 상수는 재할당이 허용되지 않는다.</p>
<pre><code class="language-js">const me = {}; // const 키워드를 사용해 선언한 변수는 재할당이 금지.

// 하지만 const 키워드를 사용해 선언한 변수에 할당한 객체는 변경 가능.
me.a = &quot;sarah&quot;;
console.log(me); // {a : &#39;sarah&#39;}</code></pre>
<p>📚 원시 값을 할당한 변수에 새로운 원시 값을 재할당하면 메모리 공간에 저장되어 있는 재할당 이전의 원시 값을 변경하는 것이 아니라 <strong>새로운 메모리 공간을 확보하고 재할당한 원시 값을 저장한 후, 변수는 새롭게 재할당한 원시 값을 가리킨다.</strong></p>
<blockquote>
<p>불변성 : 변수 값을 변경하기 위해 원시 값을 재할당하면 새로운 메모리 공간을 확보하고 재할당한 값을 저장한 후, 변수가 참조하던 메모리 공간의 주소를 변경하는 특성.</p>
</blockquote>
<h3 id="문자열과-불변성">문자열과 불변성</h3>
<p><code>문자열</code>은 유사 배열 객체이면서 이터러블(반복 가능한, 반복문 적용 가능)이다</p>
<p>🧷 유사 배열 객체 : 마치 배열처럼 인덱스로 프로퍼티 값에 접근할 수 있고 length 프로퍼티를 갖는 객체. </p>
<pre><code class="language-js">let str = &#39;string&#39;;

// 문자열은 유사 배열이므로 인덱스를 사용해 각 문자에 접근은 가능하다.
// 하지만 문자열은 원시 값이므로 변경할 수 없다. 이 때 에러는 발생하지 않는다.
str[0] = &#39;S&#39;; // 변경 불가능!!!

console.log(str); // string</code></pre>
<p>한번 생성된 문자열은 읽기 전용 값이라고 생각하면 된다.</p>
<p>그러나 변수에 새로운 문자열을 재할당하는 것은 가능하다. 이는 기존 문자열을 변경하는 것이 아니라 새로운 문자열을 새롭게 할당하는 것이기 때문이다.</p>
<h3 id="값에-의한-전달">값에 의한 전달</h3>
<p>📕 사실은 값이 전달 되는 것이 아니라 <strong>메모리 주소</strong>가 전달 된다.
두 변수의 원시 값은 서로 다른 메모리 공간에 저장된 별개의 값이 되어 어느 한쪽에서 재할당을 통해 값을 변경하더라도 서로 간섭할 수 없다.</p>
<pre><code class="language-js">let score = 80;
let copy = score; // 값에 의한 전달

console.log(score, copy) // 80, 80

score = 100;

console.log(score, copy); // 100, 80</code></pre>
<pre><code class="language-js">let score = 80;
// copy 변수에는 score 변수의 값 80이 복사되어 할당 된다.
let copy = score;</code></pre>
<p>-&gt; score와 copy 변수는 숫자 값 80을 갖는다는 점에서 동일하다.
하지만 <strong>score와 copy 변수의 값 80은 다른 메모리 공간에 저장된 별개의 값이다.</strong></p>
<br>

<h3 id="객체">객체</h3>
<p>객체는 프로퍼티 개수가 정해져 있지 않고, 동적으로 추가되고 삭제할 수 있다.
-&gt; 확보해야 할 메모리 공간의 크기를 사전에 정해 둘 수 없다.</p>
<br>

<hr>
<h2 id="변경-가능한-값">변경 가능한 값</h2>
<p>📍객체는 변경 가능한 값이다. 따라서, 재할당 없이 프로퍼티를 동적으로 추가할 수도 있고 프로퍼티 값을 갱신할 수도 있으며 프로퍼티 자체를 삭제할 수도 있다.</p>
<blockquote>
<p>얕은 복사와 깊은 복사</p>
</blockquote>
<ul>
<li>얕은 복사 : 객체에 중첩되어 있는 객체의 경우 참조 값을 복사.
아주 최소한만 복사를 한다. 값을 복사한다 하더라도, 인스턴스가 메모리에 새로 생성되지 않는다. 값 자체를 복사하는 것이 아니라 주소값을 복사하여 같은 메모리를 가리키기 때문이다. 새로운 인스턴스를 생성하지 않기 때문에 깊은 복사보다 상대적으로 빠르다. reference type을 복사하는 경우 얕은 복사가 일어난다.</li>
</ul>
<pre><code class="language-js">let user2 = user1;
user2.name = &quot;sarah&quot;;

console.log(user.name === user2.name) // true</code></pre>
<ul>
<li>깊은 복사 : 객체에 중첩되어 있는 객체가지 모두 복사해서 완전한 복사본을 만든다. 복사된 두 객체는 완전히 독립적인 메모리를 차지한다. value type의 객체들은 깊은 복사를 하게 된다. 인스턴스가 완전 독립적이다.</li>
</ul>
<hr>
<h3 id="참조에-의한-전달">참조에 의한 전달</h3>
<p>= 얕은복사. 원본의 참조 값이 복사되어 전달 된다.</p>
<pre><code class="language-js">let person = {
  name: &#39;sarah&#39;
};

// 참조 값을 복사(얕은 복사)
let copy = person</code></pre>
<p>📌 원본 person과 사본 copy는 저장된 메모리 주소는 다르지만 동일한 참조 값을 갖는다.
<strong>두 개의 식별자가 하나의 객체를 공유</strong>한다는 것을 의미한다.
따라서 어느 한쪽에서 프로퍼티 값을 변경, 추가, 삭제하면 서로 영향을 주고받는다.</p>
<hr>
<p>🔎 <code>값에 의한 전달</code>과 <code>참조에 의한 전달</code>은 식별자가 기억하는 메모리 공간에 저장되어 있는 값을 복사한다. 다만 변수에 저장되어 있는 값이 원시 값이냐 참조 값이냐의 차이만 있다.</p>
<ul>
<li>자바스크립트에서는 &quot;값에 의한 전달&quot;만 존재한다.</li>
</ul>
<hr>
<pre><code class="language-js">let person1 = {
  name: &#39;sarah&#39;
};

let person2 = {
  name: &#39;sarah&#39;
};

console.log(person1 === person2); 
// false. 내용은 같지만 다른 메모리에 저장된 별개의 객체이다. 
console.log(person1.name === person2.name) 
// true. 프로퍼티 값을 참조하는 두 값은 값으로 평가될 수 있는 표현식이다. 
// 모두 원시 값인 &#39;sarah&#39;로 평가된다.</code></pre>
<hr>
]]></description>
        </item>
    </channel>
</rss>