<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>lucid_dream</title>
    <link>https://nohack.tistory.com/</link>
    <description>다양한 상상을 현실로 만드는 멀티 크리에이터를 꿈꾸고 있습니다 ❤️</description>
    <language>ko</language>
    <pubDate>Sat, 22 Aug 2026 12:43:32 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>NoHack</managingEditor>
    <image>
      <title>lucid_dream</title>
      <url>https://tistory1.daumcdn.net/tistory/4827839/attach/e320f3b9e2f54809877d6097e535473f</url>
      <link>https://nohack.tistory.com</link>
    </image>
    <item>
      <title>[Level 1] 신고 결과 받기 (2022 카카오 블라인드 채용)</title>
      <link>https://nohack.tistory.com/192</link>
      <description>&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;문제 설명&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.&lt;/li&gt;
&lt;li&gt;신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.&lt;/li&gt;
&lt;li&gt;한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.&lt;/li&gt;
&lt;li&gt;k번 이상 신고된 유저는 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.&lt;/li&gt;
&lt;li&gt;유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;이용자의 ID가 담긴 문자열 배열&amp;nbsp;id_list, 각 이용자가 신고한 이용자의 ID 정보가 담긴 문자열 배열&amp;nbsp;report, 정지 기준이 되는 신고 횟수&amp;nbsp;k가 매개변수로 주어질 때, 각 유저별로 처리 결과 메일을 받은 횟수를 배열에 담아 return 하도록 solution 함수를 완성해주세요.&lt;/p&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;제한 조건&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2 &amp;le;&amp;nbsp;id_list의 길이 &amp;le; 1,000&lt;/li&gt;
&lt;li&gt;1 &amp;le;&amp;nbsp;report의 길이 &amp;le; 200,000&lt;/li&gt;
&lt;li&gt;1 &amp;le;&amp;nbsp;k&amp;nbsp;&amp;le; 200,&amp;nbsp;k는 자연수입니다.&lt;/li&gt;
&lt;li&gt;return 하는 배열은&amp;nbsp;id_list에 담긴 id 순서대로 각 유저가 받은 결과 메일 수를 담으면 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1645687934427&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const solution = (id_list, report, k) =&amp;gt; {
  let reports = [...new Set(report)].map((v) =&amp;gt; v.split(' '));
  // 신고 당한 횟수 누적
  let counts = new Map();
  for (const report of reports) {
    counts.set(report[1], counts.get(report[1]) + 1 || 1);
  }

  // 신고 결과를 받을 유저 계산
  let notify = new Map();
  for (const report of reports) {
    // k번 이상 신고된 유저는 밴 처리
    if (counts.get(report[1]) &amp;gt;= k) {
      // 메일을 받아야 하는 유저의 메일 개수 누적
      notify.set(report[0], notify.get(report[0]) + 1 || 1);
    }
  }

  return id_list.map((v) =&amp;gt; notify.get(v) || 0);
};

const inputs = [
  // [id_list, report, k]
  [['muzi', 'frodo', 'apeach', 'neo'], ['muzi frodo', 'apeach frodo', 'frodo neo', 'muzi neo', 'apeach muzi'], 2],
  [['con', 'ryan'], ['ryan con', 'ryan con', 'ryan con', 'ryan con'], 3],
];
inputs.forEach((input) =&amp;gt; console.log(solution(...input)));&lt;/code&gt;&lt;/pre&gt;</description>
      <category>  문제풀이/프로그래머스</category>
      <category>es6</category>
      <category>JavaScript</category>
      <category>카카오</category>
      <category>프로그래머스</category>
      <author>NoHack</author>
      <guid isPermaLink="true">https://nohack.tistory.com/192</guid>
      <comments>https://nohack.tistory.com/192#entry192comment</comments>
      <pubDate>Mon, 28 Feb 2022 05:55:22 +0900</pubDate>
    </item>
    <item>
      <title>[Level 1] 신규 아이디 추천 (2021 카카오 블라인드 채용)</title>
      <link>https://nohack.tistory.com/191</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 설명&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;카카오에 입사한 신입 개발자&amp;nbsp;네오는 &quot;카카오계정개발팀&quot;에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. &quot;네오&quot;에게 주어진 첫 업무는 새로 가입하는 유저들이 카카오 아이디 규칙에 맞지 않는 아이디를 입력했을 때, 입력된 아이디와 유사하면서 규칙에 맞는 아이디를 추천해주는 프로그램을 개발하는 것입니다.&lt;br /&gt;다음은 카카오 아이디의 규칙입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아이디의 길이는 3자 이상 15자 이하여야 합니다.&lt;/li&gt;
&lt;li&gt;아이디는 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.) 문자만 사용할 수 있습니다.&lt;/li&gt;
&lt;li&gt;단, 마침표(.)는 처음과 끝에 사용할 수 없으며 또한 연속으로 사용할 수 없습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&quot;네오&quot;는 다음과 같이 7단계의 순차적인 처리 과정을 통해 신규 유저가 입력한 아이디가 카카오 아이디 규칙에 맞는 지 검사하고 규칙에 맞지 않은 경우 규칙에 맞는 새로운 아이디를 추천해 주려고 합니다. 신규 유저가 입력한 아이디를 나타내는 new_id가 매개변수로 주어질 때, &quot;네오&quot;가 설계한 7단계의 처리 과정을 거친 후의 추천 아이디를 return 하도록 solution 함수를 완성해 주세요.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;네오가 설계한 7단계의 처리 과정은 프로그래머스 문제 설명에서 확인 부탁드립니다. 본문에 담으면 글 모양이 이상해지네요  &lt;/blockquote&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;제한 조건&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;new_id는 길이 1 이상 1,000 이하인 문자열입니다.&lt;br /&gt;new_id는 알파벳 대문자, 알파벳 소문자, 숫자, 특수문자로 구성되어 있습니다.&lt;br /&gt;new_id에 나타날 수 있는 특수문자는&amp;nbsp;-_.~!@#$%^&amp;amp;*()=+[{]}:?,&amp;lt;&amp;gt;/&amp;nbsp;로 한정됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1645687934427&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const solution = (new_id) =&amp;gt; {
  // [1] 모든 대문자를 소문자로 치환
  new_id = new_id.toLowerCase();
  // [2] 알파벳, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자 제거
  new_id = new_id.replace(/[^0-9a-z._-]/g, '');
  // [3] 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표로 치환
  new_id = new_id.replace(/[.]{2,}/g, '.');
  // [4] 마침표(.)가 처음이나 끝에 위치한다면 제거
  new_id = new_id.replace(/(^[.])|([.]$)/g, '');
  // [5] 빈 문자열이라면, 문자 'a'를 대입
  if (new_id.length === 0) new_id = 'a';
  // [6-1] 길이가 16자 이상이라면, 첫 15개의 문자를 제외하고 제거
  // [6-2] 제거 후 마침표(.)가 마지막이라면 제거
  if (new_id.length &amp;gt; 15) {
    new_id = new_id.slice(0, 15);
    new_id = new_id.replace(/(^[.])|([.]$)/g, '');
  }
  // [7] 아이디의 길이가 2 이하라면, 마지막 문자를 길이가 3이 될 때까지 반복해서 붙임
  if (new_id.length &amp;lt;= 2) {
    new_id = new_id.padEnd(3, new_id[new_id.length - 1]);
  }
  return new_id;
};

const inputs = ['...!@BaT#*..y.abcdefghijklm', 'z-+.^.', '=.=', '123_.def', 'abcdefghijklmn.p'];
inputs.forEach((input) =&amp;gt; console.log(solution(input)));&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;이 문제는 문자열을 자유롭게 다룰 수 있는 평가하는 문제 같습니다. 문제에서 요구하는 조건을 정규 표현식의 매칭 패턴으로 설정하여 암호를 가공하면 되는데, 정규 표현식을 모르는 상태에서는 반복문을 계속해서 사용해야 하기 때문에 코드가 다소 길어질 수 있습니다. 기본적인 정규 표현식은 알아 두면 너무나 편하기 때문에 한 번 정도는 익혀보시는 걸 추천드립니다.&lt;/p&gt;</description>
      <category>  문제풀이/프로그래머스</category>
      <category>es6</category>
      <category>JavaScript</category>
      <category>카카오</category>
      <category>프로그래머스</category>
      <author>NoHack</author>
      <guid isPermaLink="true">https://nohack.tistory.com/191</guid>
      <comments>https://nohack.tistory.com/191#entry191comment</comments>
      <pubDate>Mon, 28 Feb 2022 04:32:15 +0900</pubDate>
    </item>
    <item>
      <title>[Level 1] 숫자 문자열과 영단어 (2021 카카오 채용연계형 인턴십)</title>
      <link>https://nohack.tistory.com/190</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img1.png&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nSrIF/btruwJaqbn1/NDbDif6tNkfDJt1UnIyKl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nSrIF/btruwJaqbn1/NDbDif6tNkfDJt1UnIyKl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nSrIF/btruwJaqbn1/NDbDif6tNkfDJt1UnIyKl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnSrIF%2FbtruwJaqbn1%2FNDbDif6tNkfDJt1UnIyKl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1000&quot; height=&quot;310&quot; data-filename=&quot;img1.png&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;310&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 설명&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다. 다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1478 &amp;rarr; &quot;one4seveneight&quot;&lt;/li&gt;
&lt;li&gt;234567 &amp;rarr; &quot;23four5six7&quot;&lt;/li&gt;
&lt;li&gt;10203 &amp;rarr; &quot;1zerotwozero3&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열&amp;nbsp;s가 매개변수로 주어집니다.&amp;nbsp;s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.&lt;/p&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;제한 조건&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 &amp;le;&amp;nbsp;s의 길이 &amp;le; 50&lt;/li&gt;
&lt;li&gt;s가 &quot;zero&quot; 또는 &quot;0&quot;으로 시작하는 경우는 주어지지 않습니다.&lt;/li&gt;
&lt;li&gt;return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만&amp;nbsp;s로 주어집니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1645687934427&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const solution = (s) =&amp;gt; {
  // 숫자 테이블
  let numbers = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'];
  let answer = s;

  for (let i = 0; i &amp;lt; numbers.length; i++) {
    // numbers[i]로 문자열을 분할한 후, 다시 그 자리를 i로 채우면서 결합
    answer = answer.split(numbers[i]);
    answer = answer.join(i);
  }

  return parseInt(answer);
};

const inputs = ['one4seveneight', '23four5six7', '2three45sixseven', '123'];
inputs.forEach((input) =&amp;gt; console.log(solution(input)));&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;정규 표현식과 String.prototype.replace 메소드를 이용해도 해결 가능합니다.&lt;/blockquote&gt;</description>
      <category>  문제풀이/프로그래머스</category>
      <category>es6</category>
      <category>JavaScript</category>
      <category>카카오</category>
      <category>프로그래머스</category>
      <author>NoHack</author>
      <guid isPermaLink="true">https://nohack.tistory.com/190</guid>
      <comments>https://nohack.tistory.com/190#entry190comment</comments>
      <pubDate>Mon, 28 Feb 2022 04:03:12 +0900</pubDate>
    </item>
    <item>
      <title>[Level 1] 키패드 누르기 (2020 카카오 인턴십)</title>
      <link>https://nohack.tistory.com/189</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 설명&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;kakao_phone1.png&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dl2NJa/btruuirFdNE/5ThvkS3ka7o4mHnVbNStr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dl2NJa/btruuirFdNE/5ThvkS3ka7o4mHnVbNStr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dl2NJa/btruuirFdNE/5ThvkS3ka7o4mHnVbNStr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdl2NJa%2FbtruuirFdNE%2F5ThvkS3ka7o4mHnVbNStr0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;480&quot; data-filename=&quot;kakao_phone1.png&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다. 맨 처음 왼손 엄지손가락은&amp;nbsp;*&amp;nbsp;키패드에 오른손 엄지손가락은&amp;nbsp;#&amp;nbsp;키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.&lt;/li&gt;
&lt;li&gt;왼쪽 열의 3개의 숫자&amp;nbsp;1,&amp;nbsp;4,&amp;nbsp;7을 입력할 때는 왼손 엄지손가락을 사용합니다.&lt;/li&gt;
&lt;li&gt;오른쪽 열의 3개의 숫자&amp;nbsp;3,&amp;nbsp;6,&amp;nbsp;9를 입력할 때는 오른손 엄지손가락을 사용합니다.&lt;/li&gt;
&lt;li&gt;가운데 열의 4개의 숫자&amp;nbsp;2,&amp;nbsp;5,&amp;nbsp;8,&amp;nbsp;0을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.&lt;/li&gt;
&lt;li&gt;만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;제한 조건&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;numbers 배열의 크기는 1 이상 1,000 이하입니다.&lt;/li&gt;
&lt;li&gt;numbers 배열 원소의 값은 0 이상 9 이하인 정수입니다.&lt;/li&gt;
&lt;li&gt;hand는&amp;nbsp;&quot;left&quot;&amp;nbsp;또는&amp;nbsp;&quot;right&quot;&amp;nbsp;입니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;left&quot;는 왼손잡이,&amp;nbsp;&quot;right&quot;는 오른손잡이를 의미합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;왼손 엄지손가락을 사용한 경우는&amp;nbsp;L, 오른손 엄지손가락을 사용한 경우는&amp;nbsp;R을 순서대로 이어붙여 문자열 형태로 return 해주세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1645687934427&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 더 가까운 엄지 손가락을 찾는 함수
const calcDist = (position, number, hand, leftHand, rightHand) =&amp;gt; {
  // 2차원 평면에서 두 점 사이의 거리를 구하는 공식 사용
  const leftDist = Math.abs(position[number][0] - position[leftHand][0]) + Math.abs(position[number][1] - position[leftHand][1]);
  const rightDist = Math.abs(position[number][0] - position[rightHand][0]) + Math.abs(position[number][1] - position[rightHand][1])
  // 양쪽 엄지 손가락의 거리 비교 후 가까운 손 반환
  if (leftDist &amp;gt; rightDist) return 'R';
  else if (leftDist &amp;lt; rightDist) return 'L';
  else return hand === 'right' ? 'R' : 'L';
};

const solution = (numbers, hand) =&amp;gt; {
  // 번호별 좌표값
  const position = {
    1: [0, 0], 2: [0, 1], 3: [0, 2],
    4: [1, 0], 5: [1, 1], 6: [1, 2],
    7: [2, 0], 8: [2, 1], 9: [2, 2],
    '*': [3, 0], 0: [3, 1], '#': [3, 2],
  };
  // 결과를 담을 배열
  const answer = [];
  // 왼쪽 열과 오른쪽 열
  const leftSide = [1, 4, 7];
  const rightSide = [3, 6, 9];
  // 시작 지점
  let leftHand = '*';
  let rightHand = '#';

  // 반복문 순회
  numbers.forEach((number) =&amp;gt; {
    if (leftSide.includes(number)) {
      // 1 4 7은 무조건 왼손
      leftHand = number;
      answer.push('L');
    } else if (rightSide.includes(number)) {
      // 3 6 9는 무조건 오른손
      rightHand = number;
      answer.push('R');
    } else {
      // 가운데 번호는 현재 더 가까운 손가락이 눌러야 함
      const h = calcDist(position, number, hand, leftHand, rightHand);
      if (h === 'L') {
        leftHand = number;
        answer.push('L');
      } else {
        rightHand = number;
        answer.push('R');
      }
    }
  });

  // 배열을 하나의 문자열로 합침
  return answer.join('');
};

const inputs = [
  [[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5], 'right'],
  [[7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2], 'left'],
  [[1, 2, 3, 4, 5, 6, 7, 8, 9, 0], 'right'],
];
inputs.forEach((input) =&amp;gt; console.log(solution(...input)));&lt;/code&gt;&lt;/pre&gt;</description>
      <category>  문제풀이/프로그래머스</category>
      <category>es6</category>
      <category>JavaScript</category>
      <category>카카오</category>
      <category>프로그래머스</category>
      <author>NoHack</author>
      <guid isPermaLink="true">https://nohack.tistory.com/189</guid>
      <comments>https://nohack.tistory.com/189#entry189comment</comments>
      <pubDate>Mon, 28 Feb 2022 03:47:38 +0900</pubDate>
    </item>
    <item>
      <title>[Level 1] 크레인 인형뽑기 게임 (2019 카카오 겨울 인턴십)</title>
      <link>https://nohack.tistory.com/188</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 설명&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;게임개발자인 &quot;죠르디&quot;는 크레인 인형뽑기 기계를 모바일 게임으로 만들려고 합니다. &quot;죠르디&quot;는 게임의 재미를 높이기 위해 화면 구성과 규칙을 다음과 같이 게임 로직에 반영하려고 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;crane_game_101.png&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cah8z2/btruui6ielH/stnSNp1W0rDkZAGM8XQ5t0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cah8z2/btruui6ielH/stnSNp1W0rDkZAGM8XQ5t0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cah8z2/btruui6ielH/stnSNp1W0rDkZAGM8XQ5t0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcah8z2%2Fbtruui6ielH%2FstnSNp1W0rDkZAGM8XQ5t0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;500&quot; data-filename=&quot;crane_game_101.png&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;게임 화면은&amp;nbsp;&lt;b&gt;&quot;1 x 1&quot;&lt;/b&gt;&amp;nbsp;크기의 칸들로 이루어진&amp;nbsp;&lt;b&gt;&quot;N x N&quot;&lt;/b&gt;&amp;nbsp;크기의 정사각 격자이며 위쪽에는 크레인이 있고 오른쪽에는 바구니가 있습니다. (위 그림은 &quot;5 x 5&quot; 크기의 예시입니다). 각 격자 칸에는 다양한 인형이 들어 있으며 인형이 없는 칸은 빈칸입니다. 모든 인형은 &quot;1 x 1&quot; 크기의 격자 한 칸을 차지하며&amp;nbsp;&lt;b&gt;격자의 가장 아래 칸부터 차곡차곡 쌓여 있습니다.&lt;/b&gt;&amp;nbsp;게임 사용자는 크레인을 좌우로 움직여서 멈춘 위치에서 가장 위에 있는 인형을 집어 올릴 수 있습니다. 집어 올린 인형은 바구니에 쌓이게 되는 데, 이때 바구니의 가장 아래 칸부터 인형이 순서대로 쌓이게 됩니다. 다음 그림은 [1번, 5번, 3번] 위치에서 순서대로 인형을 집어 올려 바구니에 담은 모습입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;crane_game_102.png&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bU30kR/btruvuyDtKY/JhDeCvuWkmoKkJDqei49u1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bU30kR/btruvuyDtKY/JhDeCvuWkmoKkJDqei49u1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bU30kR/btruvuyDtKY/JhDeCvuWkmoKkJDqei49u1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbU30kR%2FbtruvuyDtKY%2FJhDeCvuWkmoKkJDqei49u1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;500&quot; data-filename=&quot;crane_game_102.png&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;만약 같은 모양의 인형 두 개가 바구니에 연속해서 쌓이게 되면 두 인형은 터뜨려지면서 바구니에서 사라지게 됩니다. 위 상태에서 이어서 [5번] 위치에서 인형을 집어 바구니에 쌓으면 같은 모양 인형&amp;nbsp;&lt;b&gt;두 개&lt;/b&gt;가 없어집니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;crane_game_103.gif&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5oXKK/btruuirCRAm/GZVCmLVzrL2yjuCwbk65N0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5oXKK/btruuirCRAm/GZVCmLVzrL2yjuCwbk65N0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5oXKK/btruuirCRAm/GZVCmLVzrL2yjuCwbk65N0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/5oXKK/btruuirCRAm/GZVCmLVzrL2yjuCwbk65N0/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;500&quot; data-filename=&quot;crane_game_103.gif&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;크레인 작동 시 인형이 집어지지 않는 경우는 없으나 만약 인형이 없는 곳에서 크레인을 작동시키는 경우에는 아무런 일도 일어나지 않습니다. 또한 바구니는 모든 인형이 들어갈 수 있을 만큼 충분히 크다고 가정합니다. 게임 화면의 격자의 상태가 담긴 2차원 배열 board와 인형을 집기 위해 크레인을 작동시킨 위치가 담긴 배열 moves가 매개변수로 주어질 때, 크레인을 모두 작동시킨 후 터트려져 사라진 인형의 개수를 return 하도록 solution 함수를 완성해주세요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;제한 조건&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;board 배열은 2차원 배열로 크기는 &quot;5 x 5&quot; 이상 &quot;30 x 30&quot; 이하입니다.&lt;/li&gt;
&lt;li&gt;board의 각 칸에는 0 이상 100 이하인 정수가 담겨있습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;0은 빈 칸을 나타냅니다.&lt;/li&gt;
&lt;li&gt;1 ~ 100의 각 숫자는 각기 다른 인형의 모양을 의미하며 같은 숫자는 같은 모양의 인형을 나타냅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;moves 배열의 크기는 1 이상 1,000 이하입니다.&lt;/li&gt;
&lt;li&gt;moves 배열 각 원소들의 값은 1 이상이며 board 배열의 가로 크기 이하인 자연수입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1645687934427&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const solution = (board, moves) =&amp;gt; {
  const stack = [];
  const size = board.length;
  let result = 0;

  moves.forEach((move) =&amp;gt; {
    // 해당 줄이 비어있다면, 바로 다음 줄로 이동
    if (board[size - 1][move - 1] === 0) return;

    for (let col = 0; col &amp;lt; size; col++) {
      const doll = board[col][move - 1];
      // 인형이 있는 행까지 순회해서 작업
      if (doll !== 0) {
        // 스택 최상단에 같은 종류의 인형이 있다면 제거
        if (stack.length &amp;gt; 0 &amp;amp;&amp;amp; stack[stack.length - 1] === doll) {
          result += 2;
          stack.pop();
        } else {
          stack.push(doll);
        }
        // 스택으로 인형을 옮겼으면 기계에서 제거
        board[col][move - 1] = 0;
        break;
      }
    }
  });

  return result;
};

const inputs = [
  [
    // board
    [
      [0, 0, 0, 0, 0],
      [0, 0, 1, 0, 3],
      [0, 2, 5, 0, 1],
      [4, 2, 4, 4, 2],
      [3, 5, 1, 3, 1],
    ],
    // moves
    [1, 5, 3, 5, 1, 2, 1, 4],
    ,
  ],
];
inputs.forEach((input) =&amp;gt; console.log(solution(...input)));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  문제풀이/프로그래머스</category>
      <category>es6</category>
      <category>JavaScript</category>
      <category>카카오</category>
      <category>프로그래머스</category>
      <author>NoHack</author>
      <guid isPermaLink="true">https://nohack.tistory.com/188</guid>
      <comments>https://nohack.tistory.com/188#entry188comment</comments>
      <pubDate>Mon, 28 Feb 2022 02:19:58 +0900</pubDate>
    </item>
    <item>
      <title>[Level 1] 실패율 (2019 카카오 블라인드 채용)</title>
      <link>https://nohack.tistory.com/187</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 설명&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스테이지 차이가 너무 큰 것이 문제였다. 이 문제를 어떻게 할까 고민 한 그녀는 동적으로 게임 시간을 늘려서 난이도를 조절하기로 했다. 역시 슈퍼 개발자라 대부분의 로직은 쉽게 구현했지만, 실패율을 구하는 부분에서 위기에 빠지고 말았다. 오렐리를 위해 실패율을 구하는 코드를 완성하라.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실패율은 다음과 같이 정의한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;전체 스테이지의 개수 N, 게임을 이용하는 사용자가 현재 멈춰있는 스테이지의 번호가 담긴 배열 stages가 매개변수로 주어질 때, 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 return 하도록 solution 함수를 완성하라.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;제한 조건&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스테이지의 개수 N은&amp;nbsp;1&amp;nbsp;이상&amp;nbsp;500&amp;nbsp;이하의 자연수이다.&lt;/li&gt;
&lt;li&gt;stages의 길이는&amp;nbsp;1&amp;nbsp;이상&amp;nbsp;200,000&amp;nbsp;이하이다.&lt;/li&gt;
&lt;li&gt;stages에는&amp;nbsp;1&amp;nbsp;이상&amp;nbsp;N + 1&amp;nbsp;이하의 자연수가 담겨있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 자연수는 사용자가 현재 도전 중인 스테이지의 번호를 나타낸다.&lt;/li&gt;
&lt;li&gt;단,&amp;nbsp;N + 1&amp;nbsp;은 마지막 스테이지(N 번째 스테이지) 까지 클리어 한 사용자를 나타낸다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;만약 실패율이 같은 스테이지가 있다면 작은 번호의 스테이지가 먼저 오도록 하면 된다.&lt;/li&gt;
&lt;li&gt;스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은&amp;nbsp;0&amp;nbsp;으로 정의한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1645687934427&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const solution = (N, stages) =&amp;gt; {
  let answer = [];

  for (let n = 1; n &amp;lt;= N; n++) {
    // 각 스테이지를 순회하면서 실패율 계산
    const rate = stages.filter((stage) =&amp;gt; n === stage).length / stages.length;
    stages = stages.filter((stage) =&amp;gt; n !== stage);
    answer.push([n, rate]);
  }
  // 실패율을 기반으로 내림차순 후 스테이지 번호만 반환
  answer.sort((a, b) =&amp;gt; b[1] - a[1]);
  return answer.map((v) =&amp;gt; v[0]);
};

const inputs = [
  [5, [2, 1, 2, 6, 2, 4, 3, 3]],
  [4, [4, 4, 4, 4, 4]],
];
inputs.forEach((input) =&amp;gt; console.log(solution(...input)));&lt;/code&gt;&lt;/pre&gt;</description>
      <category>  문제풀이/프로그래머스</category>
      <category>es6</category>
      <category>JavaScript</category>
      <category>카카오</category>
      <category>프로그래머스</category>
      <author>NoHack</author>
      <guid isPermaLink="true">https://nohack.tistory.com/187</guid>
      <comments>https://nohack.tistory.com/187#entry187comment</comments>
      <pubDate>Sun, 27 Feb 2022 21:34:06 +0900</pubDate>
    </item>
    <item>
      <title>[Level 1] 비밀지도 (2018 카카오 블라인드 채용)</title>
      <link>https://nohack.tistory.com/167</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 설명&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다행히 지도 암호를 해독할 방법을 적어놓은 메모도 함께 발견했다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지도는 한 변의 길이가&amp;nbsp;n인 정사각형 배열 형태로, 각 칸은 &quot;공백&quot;(&quot; &quot;) 또는 &quot;벽&quot;(&quot;#&quot;) 두 종류로 이루어져 있다.&lt;/li&gt;
&lt;li&gt;전체 지도는 두 장의 지도를 겹쳐서 얻을 수 있다. 각각 &quot;지도 1&quot;과 &quot;지도 2&quot;라고 하자. 지도 1 또는 지도 2 중 어느 하나라도 벽인 부분은 전체 지도에서도 벽이다. 지도 1과 지도 2에서 모두 공백인 부분은 전체 지도에서도 공백이다.&lt;/li&gt;
&lt;li&gt;&quot;지도 1&quot;과 &quot;지도 2&quot;는 각각 정수 배열로 암호화되어 있다.&lt;/li&gt;
&lt;li&gt;암호화된 배열은 지도의 각 가로줄에서 벽 부분을&amp;nbsp;1, 공백 부분을&amp;nbsp;0으로 부호화했을 때 얻어지는 이진수에 해당하는 값의 배열이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네오가 프로도의 비상금을 손에 넣을 수 있도록, 비밀지도의 암호를 해독하는 작업을 도와줄 프로그램을 작성하라.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;비밀지도.jpg&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFM5CK/btruxjW4ufe/1QcEUS8DeTUkvuBiRWmmg0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFM5CK/btruxjW4ufe/1QcEUS8DeTUkvuBiRWmmg0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFM5CK/btruxjW4ufe/1QcEUS8DeTUkvuBiRWmmg0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFM5CK%2FbtruxjW4ufe%2F1QcEUS8DeTUkvuBiRWmmg0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;898&quot; height=&quot;500&quot; data-filename=&quot;비밀지도.jpg&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1645687934427&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const solution = (n, arr1, arr2) =&amp;gt; {
  // OR 연산
  const temp = arr1.map((v, i) =&amp;gt; (v | arr2[i]).toString(2).padStart(n, '0').split(''));
  return temp.map((col) =&amp;gt; col.map((v) =&amp;gt; (v === '1' ? '#' : ' ')).join(''));
};

const inputs = [
  [5, [9, 20, 28, 18, 11], [30, 1, 21, 17, 28]],
  [6, [46, 33, 33, 22, 31, 50], [27, 56, 19, 14, 14, 10]],
];
inputs.forEach((input) =&amp;gt; console.log(solution(...input)));&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;이 문제는 주어진 두 암호 &lt;span style=&quot;color: #ef5369;&quot;&gt;arr1&lt;/span&gt;과 &lt;span style=&quot;color: #ef5369;&quot;&gt;arr2&lt;/span&gt;의 요소 각각을 OR 연산하면 해결할 수 있습니다. 연산이 끝난 후에는 결과를 &lt;span style=&quot;color: #ef5369;&quot;&gt;toString(2)&lt;/span&gt; 메소드를 사용해 2진수로 변환했으며, &lt;span style=&quot;color: #ef5369;&quot;&gt;padStart&lt;/span&gt; 메소드로 &lt;span style=&quot;color: #ef5369;&quot;&gt;n&lt;/span&gt;자리의 문자열이 되도록 만들었습니다. 필요한 데이터를 사용하기 좋게 가공했다면, 마지막으로 1은 #으로 0은 공백으로 변환하면서 끝내면 됩니다.&lt;/p&gt;</description>
      <category>  문제풀이/프로그래머스</category>
      <category>es6</category>
      <category>JavaScript</category>
      <category>카카오</category>
      <category>프로그래머스</category>
      <author>NoHack</author>
      <guid isPermaLink="true">https://nohack.tistory.com/167</guid>
      <comments>https://nohack.tistory.com/167#entry167comment</comments>
      <pubDate>Sun, 27 Feb 2022 21:17:15 +0900</pubDate>
    </item>
    <item>
      <title>[Level 1] 다트 게임 (2018 카카오 블라인드 채용)</title>
      <link>https://nohack.tistory.com/166</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;게임별.jpg&quot; data-origin-width=&quot;1488&quot; data-origin-height=&quot;765&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGGSpq/btrurxuxepG/yipRrCA4xKIXn2iodC4Kr1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGGSpq/btrurxuxepG/yipRrCA4xKIXn2iodC4Kr1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGGSpq/btrurxuxepG/yipRrCA4xKIXn2iodC4Kr1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGGSpq%2FbtrurxuxepG%2FyipRrCA4xKIXn2iodC4Kr1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1488&quot; height=&quot;765&quot; data-filename=&quot;게임별.jpg&quot; data-origin-width=&quot;1488&quot; data-origin-height=&quot;765&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 설명&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;카카오톡 게임별의 하반기 신규 서비스로 다트 게임을 출시하기로 했다. 다트 게임은 다트판에 다트를 세 차례 던져 그 점수의 합계로 실력을 겨루는 게임으로, 모두가 간단히 즐길 수 있다. 갓 입사한 무지는 코딩 실력을 인정받아 게임의 핵심 부분인 점수 계산 로직을 맡게 되었다. 다트 게임의 점수 계산 로직은 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-02-27 05.28.31.png&quot; data-origin-width=&quot;2134&quot; data-origin-height=&quot;578&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkqGnZ/btrukfIsMcG/TmqYfw9TYKdLtmASKHKYRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkqGnZ/btrukfIsMcG/TmqYfw9TYKdLtmASKHKYRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkqGnZ/btrukfIsMcG/TmqYfw9TYKdLtmASKHKYRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkqGnZ%2FbtrukfIsMcG%2FTmqYfw9TYKdLtmASKHKYRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2134&quot; height=&quot;578&quot; data-filename=&quot;스크린샷 2022-02-27 05.28.31.png&quot; data-origin-width=&quot;2134&quot; data-origin-height=&quot;578&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;0~10의 정수와 문자 S, D, T, *, #로 구성된 문자열이 입력될 시 총점수를 반환하는 함수를 작성하라.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 풀이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설명에서 제공하는 계산 로직을 차례대로 구현하면 해결할 수 있는 문제입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1645687934427&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const solution = (dartResult) =&amp;gt; {
  // 다트 점수를 배열로 가공
  dartResult = dartResult.match(/\d+|./g).map((v) =&amp;gt; (Number.isNaN(Number(v)) ? v : parseInt(v)));
  let score = [0, 0, 0];
  let index = -1;

  for (let i = 0; i &amp;lt; dartResult.length; i++) {
    let now = dartResult[i];
    // 현재 참조 중인 요소가 점수인 경우
    if (typeof now === 'number') {
      score[++index] = now;
      continue;
    }
    // 현재 참조 중인 요소가 보너스, 옵션인 경우
    if (now === 'D') {
      score[index] **= 2;
    } else if (now === 'T') {
      score[index] **= 3;
    } else if (now === '*') {
      // 인덱스 범위가 -1이 되지 않도록 체크
      if (index - 1 &amp;gt;= 0) score[index - 1] *= 2;
      score[index] *= 2;
    } else if (now === '#') {
      score[index] *= -1;
    }
  }

  return score.reduce((a, b) =&amp;gt; a + b);
};

const inputs = ['1S2D*3T', '1D2S#10S', '1D2S0T', '1S*2T*3S', '1D#2S*3S', '1T2D3D#', '1D2S3T*'];
inputs.forEach((input) =&amp;gt; console.log(solution(input)));&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;저는 매개변수로 받은 &lt;span style=&quot;color: #ef5369;&quot;&gt;dartResult&lt;/span&gt;를 간편하게 사용할 수 있도록 점수, 보너스, 그리고 옵션 단위로 잘라 배열로 만들었습니다. 매개변수로 들어온 값이 &lt;span style=&quot;color: #ef5369;&quot;&gt;'1S2D*3T'&lt;/span&gt;일 때, 이를 배열로 가공하면 &lt;span style=&quot;color: #ef5369;&quot;&gt;['1', 'S', '2', 'D', '*', '3', 'T']&lt;/span&gt;가 됩니다. 자를 때는 정규 표현식을 사용했으며, 매칭 패턴 &lt;span style=&quot;color: #ef5369;&quot;&gt;/\d+|./g&lt;/span&gt;는 숫자 또는 임의의 문자를 의미합니다. 배열로 만든 후에는 각 요소를 순회하면서 숫자 부분만 형변환을 해줬습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;이후에는 반복문을 통해 계산 로직을 구현해 나가면 됩니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;정규 표현식이 익숙하지 않으시면, &lt;a href=&quot;https://regexr.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;regexr.com&lt;/a&gt;에서 한 번 직접 테스트 해 보세요.&lt;/blockquote&gt;</description>
      <category>  문제풀이/프로그래머스</category>
      <category>es6</category>
      <category>JavaScript</category>
      <category>카카오</category>
      <category>프로그래머스</category>
      <author>NoHack</author>
      <guid isPermaLink="true">https://nohack.tistory.com/166</guid>
      <comments>https://nohack.tistory.com/166#entry166comment</comments>
      <pubDate>Sun, 27 Feb 2022 21:15:33 +0900</pubDate>
    </item>
    <item>
      <title>[Level 1] 로또의 최고 순위와 최저 순위 (2021 데브매칭 백엔드)</title>
      <link>https://nohack.tistory.com/186</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 설명&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;로또 6/45(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 로또를 구매한 민우는 당첨 번호 발표일을 학수고대하고 있었습니다. 하지만, 민우의 동생이 로또에 낙서를 하여, 일부 번호를 알아볼 수 없게 되었습니다. 당첨 번호 발표 후, 민우는 자신이 구매했던 로또로 당첨이 가능했던 최고 순위와 최저 순위를 알아보고 싶어 졌습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;민우가 구매한 로또 번호를 담은 배열 lottos, 당첨 번호를 담은 배열 win_nums가 매개변수로 주어집니다. 이때, 당첨 가능한 최고 순위와 최저 순위를 차례대로 배열에 담아서 return 하도록 solution 함수를 완성해주세요.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;문제 설명이 너무 길어 일부만 첨부했으니, 문제 전문은 프로그래머스에서 확인해 주세요.&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;제한 조건&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;lottos는 길이 6인 정수 배열입니다.&lt;/li&gt;
&lt;li&gt;lottos의 모든 원소는 0 이상 45 이하인 정수입니다.&lt;/li&gt;
&lt;li&gt;0은 알아볼 수 없는 숫자를 의미합니다.&lt;/li&gt;
&lt;li&gt;0을 제외한 다른 숫자들은 lottos에 2개 이상 담겨있지 않습니다.&lt;/li&gt;
&lt;li&gt;lottos의 원소들은 정렬되어 있지 않을 수도 있습니다.&lt;/li&gt;
&lt;li&gt;win_nums은 길이 6인 정수 배열입니다.&lt;/li&gt;
&lt;li&gt;win_nums의 모든 원소는 1 이상 45 이하인 정수입니다.&lt;/li&gt;
&lt;li&gt;win_nums에는 같은 숫자가 2개 이상 담겨있지 않습니다.&lt;/li&gt;
&lt;li&gt;win_nums의 원소들은 정렬되어 있지 않을 수도 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1645687934427&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const solution = (lottos, win_nums) =&amp;gt; {
  const rank = [6, 6, 5, 4, 3, 2, 1];

  zero = lottos.filter((lotto) =&amp;gt; lotto === 0).length;
  low = lottos.filter((lotto) =&amp;gt; win_nums.includes(lotto)).length;

  // 0을 모두 당첨 숫자로 바꾸면 최고점이므로 low + zero = high
  return [rank[low + zero], rank[low]];
};

const inputs = [
  [[44, 1, 0, 0, 31, 25], [31, 10, 45, 1, 6, 19]],
  [[0, 0, 0, 0, 0, 0], [38, 19, 20, 40, 15, 25]],
  [[45, 4, 35, 20, 3, 9], [20, 9, 3, 45, 4, 35]]
]
inputs.forEach((input) =&amp;gt; console.log(solution(...input)));&lt;/code&gt;&lt;/pre&gt;</description>
      <category>  문제풀이/프로그래머스</category>
      <category>es6</category>
      <category>JavaScript</category>
      <category>프로그래머스</category>
      <author>NoHack</author>
      <guid isPermaLink="true">https://nohack.tistory.com/186</guid>
      <comments>https://nohack.tistory.com/186#entry186comment</comments>
      <pubDate>Sun, 27 Feb 2022 21:13:09 +0900</pubDate>
    </item>
    <item>
      <title>[Level 1] 없는 숫자 더하기</title>
      <link>https://nohack.tistory.com/185</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 설명&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;0부터 9까지의 숫자 중 일부가 들어있는 정수 배열&amp;nbsp;numbers가 매개변수로 주어집니다.&amp;nbsp;numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;제한 조건&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 &amp;le;&amp;nbsp;numbers의 길이 &amp;le; 9&lt;/li&gt;
&lt;li&gt;0 &amp;le;&amp;nbsp;numbers의 모든 원소 &amp;le; 9&lt;/li&gt;
&lt;li&gt;numbers의 모든 원소는 서로 다릅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1645687934427&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const solution = (numbers) =&amp;gt; {
  // 0부터 9까지의 숫자이므로, 총합인 45에서 빼면 됨
  return 45 - numbers.reduce((a, b) =&amp;gt; a + b);
};

const inputs = [
  [1, 2, 3, 4, 6, 7, 8, 0],
  [5, 8, 4, 0, 6, 7, 9],
];
inputs.forEach((input) =&amp;gt; console.log(solution(input)));&lt;/code&gt;&lt;/pre&gt;</description>
      <category>  문제풀이/프로그래머스</category>
      <category>es6</category>
      <category>JavaScript</category>
      <category>월간 코드 챌린지</category>
      <category>프로그래머스</category>
      <author>NoHack</author>
      <guid isPermaLink="true">https://nohack.tistory.com/185</guid>
      <comments>https://nohack.tistory.com/185#entry185comment</comments>
      <pubDate>Sun, 27 Feb 2022 19:44:04 +0900</pubDate>
    </item>
  </channel>
</rss>