"나는 무엇을 풀었는가" 시리즈는 이렇게 시작했습니다.
- 취업 준비 중 몇 번의 코딩테스트를 보며 깨달은 것이 있습니다. 바로 "기초가 중요하다"는 것입니다. 그리하여 프로그래머스 Level.0부터 차근차근 다시 풀어보려고 합니다.
- 단지 문제를 푸는 것보단, 왜 해당 함수를 썼는지 더 재사용이나 가독성을 높일 방법은 없는지, 그리고 해당 함수가 없다면 어떻게 풀 수 있을지와 같이 다양한 방법과 생각을 통해 사고력을 높이려고 노력합니다.
- 그럼 레츠 고 !
문제설명 : 등차수열의 1항부터 n항까지 included가 true인 항들만 더한 값을 return 하는 solution 함수를 작성해 주세요.
입/출력 :
console.log(solution(3, 4, [true, false, false, true, true])); // 37
function solution(a, d, included) {
let sequence = [];
let answer = 0;
// 등차 수열 만들기
for (let i = a; i < a + i * d; i += d) {
sequence.push(i);
if (sequence.length === included.length) break;
}
// included가 true인 항들 더하기
included.forEach((x, i) => (x ? (answer += sequence[i]) : 0));
return answer;
}
function solution(a, d, included) {
let answer = 0;
// 0 ~ included.length-1 까지 반복하면서
for (let i = 0; i < included.length; i++) {
// included[i]가 true라면 a + i * d 값을 answer에 더한다.
if (included[i]) {
answer += a + i * d;
}
}
return answer;
}
문제설명 : 문자열 code를 앞에서부터 읽으면서 code[i]가 '1'이라면 mode를 바꿔준다. 이 작업을 반복하며 결과로 문자열 ret을 만들어 리턴하세요.
조건 :
입/출력 :
console.log(solution("abc1abc1abc")); // "acbac"
// 짝수 또는 홀수 판별
function isEvenOrOdd(i, n) {
return i % 2 === n;
}
function isEven(n) {
return n % 2 === 0;
}
function isOdd(n) {
return n % 2 === 1;
}
function solution(code) {
const fs = [isEven, isOdd];
let mode = 0;
let ret = "";
for (let i = 0; i < code.length; i++) {
if (code[i] !== "1") {
if (fs[mode](i)) {
ret += code[i];
}
}
if (code[i] === "1") {
mode = mode === 0 ? 1 : 0;
}
}
return ret.length > 0 ? ret : "EMPTY";
}
flag
를 통해 checkMode 함수에 대해 isEvenOrOdd의 결과에 대한 의존성을 제거한다.// 짝수 또는 홀수 판별
function isEvenOrOdd(i, n) {
return i % 2 === n;
}
// mode를 확인해 code 반환
function checkMode(c, flag) {
return flag ? c : '';
}
function solution(code) {
let mode = 0;
let ret = "";
for (let i = 0; i < code.length; i++) {
if (code[i] !== "1") {
ret += checkMode(code[i], isEvenOrOdd(i, mode));
}
if (code[i] === "1") {
mode = mode === 0 ? 1 : 0;
}
}
return ret.length > 0 ? ret : "EMPTY";
}
문제설명 : 다음 조건을 충족하는 배열을 리턴하세요.
조건 :
입/출력 :
console.log(solution([0, 1, 2, 3, 4, 5], [4, 1, 2]));
// [1, 2, 3]
function spliceArr (result, a, b) {
return result.splice(a, b);
}
function solution(arr, query) {
let result = [...arr];
for (let i = 0 ; i < query.length; i++) {
i % 2 === 0 ?
spliceArr(result, query[i]+1, arr.length)
: spliceArr(result, 0, query[i]);
}
return result;
}
function subArr(arr, s, e) {
const result = [];
if (e > arr.length) {
e = arr.length;
}
for (let i = s; i < e; i++) {
result.push(arr[i]);
}
return result;
}
function solution(arr, query) {
let result = [...arr];
for (let i = 0; i < query.length; i++) {
result = i % 2 === 0
? subArr(result, 0, query[i] + 1) // 뒷부분
: subArr(result, query[i], arr.length); // 앞부분
console.log(result);
}
return result;
}
입/출력 :
console.log(solution(2, 2, 2, 2)); // 2222
console.log(solution(4, 1, 4, 4)); // 1681
console.log(solution(6, 3, 3, 6)); // 27
console.log(solution(2, 5, 2, 6)); // 30
console.log(solution(6, 4, 2, 5)); // 2
function doDice(arr) {
const diceKeys = Object.keys(arr);
const diceValues = Object.values(arr);
const threeNumSame = diceValues.map((v, i) => v !== 2 ? diceKeys[i] : "").filter(v => v !== "");
switch (diceKeys.length) {
case 1: return 1111 * diceKeys;
case 2: return twoDice(diceKeys, diceValues);
case 3: return Number(threeNumSame[0]) * Number(threeNumSame[1]);
case 4: return Math.min(...diceKeys);
}
}
function twoDice(diceKeys, diceValues) {
const a = Number(diceKeys[0]);
const b = Number(diceKeys[1]);
if (diceValues[0] === diceValues[1]) {
return (a + b) * Math.abs(a - b);
} else {
return (diceValues[0] > diceValues[1]) ? Math.pow(10 * a + b, 2) : Math.pow(10 * b + a, 2);
}
}
function solution(a, b, c, d) {
const arr = [a, b, c, d].reduce(
(ac, v) => ({...ac, [v]: (ac[v] || 0) + 1}),
{}
);
return doDice(arr);
}
문제설명 : 정수를 담고 있는 배열 arr의 평균값을 return하는 함수, solution을 완성해보세요.
입/출력 :
console.log(solution( [1, 2, 3, 4])); // 2.5
function solution(arr) {
return arr.reduce((acc, cur) => (acc+cur), 0) / arr.length;
}