sungyup's.

Web_Miscellaneous / Algorithm(JS) / 4.2 프로그래머스 Lv.0 #11~20

4.2프로그래머스 Lv.0 #11~20

프로그래머스 Lv.0 11~20번

개요

기초 트레이닝 문제(Lv.0) 11 ~ 20번 문제 풀이 중 배울 점이 있는 풀이들에서 배운 개념들을 내 것으로 만들고자 정리해본다.

11. 문자열 섞기

문자열 섞기는 두 문자열의 개별 문자들을 번갈아가며 합친 하나의 문자열을 반환하라는 문제다. 난 for문을 좋아하는 사람 아니랄까봐 이렇게 풀었다:

javascript
function solution(str1, str2) { let answer = ''; for(let i = 0; i<str1.length;i++){ answer += str1[i]; answer += str2[i]; } return answer; }

11-1. [...str].map과 join('')

지난 포스팅 3번 문제 풀이에서 배운, [...str].map()join('')을 써서 풀 수 있다.

javascript
function solution(str1, str2) { return [...str1].map((x, idx)=> x + str2[idx]).join(""); }

여담으로, 이 문제는 를 만들어서 푼 사람도 있었다. 댓글에선 다들 감탄만...

14. 두 수의 연산값 비교하기

두 수의 연산값 비교하기는 개인적으로 굉장히 단순무식하게 풀었다. 그냥 문제에 적힌 설명 그대로 쭉 적었다.

javascript
function solution(a, b) { const ab = Number(`${a}${b}`); const twoTimesAandB = 2 * Number(a) * Number(b); return Math.max(ab, twoTimesAandB); }

14-1. parseInt 활용하기

사실 답의 다른 부분은 그렇게 좋다고 생각하지 않았고, (바뀔일 없는 변수 선언에 let을 썼다거나 return에 굳이 삼항 연산자를 써서 헷갈리게 햇다거나 해서) parseInt를 썼다는 점이 눈에 띄었다.

parseInt()Number()처럼 문자열을 숫자로 바꿔주지만, 약간 차이가 있다.

구분parseInt()Number()
기능문자열을 정수로 변환문자열을 실수로 변환
소수 지원안됨(Int가 정수라는 뜻이니)
문자숫자로 시작하면 숫자까진 해석 가능전체가 숫자 아니면 NaN
진수 지정2번째 매개변수로 진수를 지정할 수 있음10진수만

17. 공배수

공배수 문제는 그냥 풀기에는 % 연산자만 알면 된다.

javascript
function solution(number, n, m) { return (number % n === 0 && number % m === 0) ? 1: 0 }

17-1. boolean 타입을 +를 활용해 숫자로 변환하기

하지만 1과 0만 반환한다는 점에서, 이렇게 풀 수도 있다.

javascript
function solution(number, n, m) { return +!(number % n || number % m); }

나는 긍정문으로 가서 A && B로 갔다면, 이 분은 귀류로 !(A || B)로 논리를 체크한다. 또, +를 붙임으로 boolean 타입을 숫자로 변환한다. 사실 그래서 나도 이렇게 해도 된다.

javascript
function solution(number, n, m) { return +(number % n === 0 && number % m === 0) }

18. 홀짝에 따라 다른 값 반환하기

홀짝에 따라 다른 값 반환하기 역시 나는 꽤 지저분하게 풀었다. 만약 이 글 시리즈를 처음부터 읽고 계신 분이 있다면 짐작하셨겠지만, for문으로 풀었다.

javascript
function solution(n) { let answer = 0; const isOdd = n % 2 !== 0; if(isOdd){ for(let i = 1; i <= n; i += 2){ answer += i; } } else { for(let i = 2; i<= n; i += 2){ answer += Math.pow(i, 2) } } return answer; }

18-1. Array의 reduce 메소드로 풀기

약간 읽기 어렵지만 더 우아한 풀이가 있다. 해당 수(n)까지 1부터 올라오는 Array를 만든 후 Array.reduce로 조건에 따라 다르게 값을 쌓아올리는 것이다.

javascript
function solution(n) { const array = Array(n).fill().map((x,idx)=> idx+1); return n % 2 === 0 ? array.reduce((a,b) => b % 2 === 0 ? a + Math.pow(b, 2) : a, 0) : array.reduce((a,b) => b % 2 === 0 ? a : a + b, 0); }

19. 조건 문자열

조건 문자열은 단순무식하게 풀려면 정말 단순하게 풀 수 있는 문제다.

javascript
function solution(ineq, eq, n, m) { let answer = 0; if(ineq === ">"){ if(eq === "="){ answer = n>=m } else { answer = n > m } } else { if(eq === "="){ answer = n<=m } else { answer = n < m } } return answer ? 1:0; }

19-1. 객체 활용하기

총 4가지 경우의 수가 있는 ineq와 eq의 조합 케이스들을 만들어놓고, 객체에 해당 조합으로 접근해 푸는 방법이 있다. 개인적으로 보고 읽기에 가장 좋았다.

javascript
const operations = { '>=': (n, m) => n >= m, '<=': (n, m) => n <= m, '>!': (n, m) => n > m, '<!': (n, m) => n < m, }; function solution(ineq, eq, n, m) { const op = operations[ineq + eq]; return Number(op(n, m)); }

19-2. 논리왕

아래와 같은 답을 적는 사람들은 논리력이 아주 뛰어날 것이다(..)

진지하게 리버스엔지니어링을 시도해보자면, 참인 경우의 수를 최대한 겹치지 않게 적고 그 외는 0으로 떨어지게 푼 방법이라고 생각한다.

javascript
function solution(ineq, eq, n, m) { if (eq === '=' && n === m) return 1 if (ineq === '<' && n < m) return 1 if (ineq === '>' && n > m) return 1 return 0 }