4.2프로그래머스 Lv.0 #11~20
프로그래머스 Lv.0 11~20번
개요
기초 트레이닝 문제(Lv.0) 11 ~ 20번 문제 풀이 중 배울 점이 있는 풀이들에서 배운 개념들을 내 것으로 만들고자 정리해본다.
11. 문자열 섞기
문자열 섞기는 두 문자열의 개별 문자들을 번갈아가며 합친 하나의 문자열을 반환하라는 문제다. 난 for
문을 좋아하는 사람 아니랄까봐 이렇게 풀었다:
javascriptfunction 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('')
을 써서 풀 수 있다.
javascriptfunction solution(str1, str2) { return [...str1].map((x, idx)=> x + str2[idx]).join(""); }
여담으로, 이 문제는 큐를 만들어서 푼 사람도 있었다. 댓글에선 다들 감탄만...
14. 두 수의 연산값 비교하기
두 수의 연산값 비교하기는 개인적으로 굉장히 단순무식하게 풀었다. 그냥 문제에 적힌 설명 그대로 쭉 적었다.
javascriptfunction 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. 공배수
공배수 문제는 그냥 풀기에는 %
연산자만 알면 된다.
javascriptfunction solution(number, n, m) { return (number % n === 0 && number % m === 0) ? 1: 0 }
17-1. boolean 타입을 +를 활용해 숫자로 변환하기
하지만 1과 0만 반환한다는 점에서, 이렇게 풀 수도 있다.
javascriptfunction solution(number, n, m) { return +!(number % n || number % m); }
나는 긍정문으로 가서 A && B
로 갔다면, 이 분은 귀류로 !(A || B)
로 논리를 체크한다. 또, +
를 붙임으로 boolean 타입을 숫자로 변환한다. 사실 그래서 나도 이렇게 해도 된다.
javascriptfunction solution(number, n, m) { return +(number % n === 0 && number % m === 0) }
18. 홀짝에 따라 다른 값 반환하기
홀짝에 따라 다른 값 반환하기 역시 나는 꽤 지저분하게 풀었다. 만약 이 글 시리즈를 처음부터 읽고 계신 분이 있다면 짐작하셨겠지만, for
문으로 풀었다.
javascriptfunction 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
로 조건에 따라 다르게 값을 쌓아올리는 것이다.
javascriptfunction 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. 조건 문자열
조건 문자열은 단순무식하게 풀려면 정말 단순하게 풀 수 있는 문제다.
javascriptfunction 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의 조합 케이스들을 만들어놓고, 객체에 해당 조합으로 접근해 푸는 방법이 있다. 개인적으로 보고 읽기에 가장 좋았다.
javascriptconst 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으로 떨어지게 푼 방법이라고 생각한다.
javascriptfunction 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 }