"나는 무엇을 풀었는가" 시리즈는 이렇게 시작했습니다.
- 취업 준비 중 몇 번의 코딩테스트를 보며 깨달은 것이 있습니다. 바로 "기초가 중요하다"는 것입니다. 그리하여 프로그래머스 Level.0부터 차근차근 다시 풀어보려고 합니다.
- 단지 문제를 푸는 것보단, 왜 해당 함수를 썼는지 더 재사용이나 가독성을 높일 방법은 없는지, 그리고 해당 함수가 없다면 어떻게 풀 수 있을지와 같이 다양한 방법과 생각을 통해 사고력을 높이려고 노력합니다.
- 그럼 레츠 고 !
문제설명 : arr의 길이가 2의 거듭 제곱이 되도록 arr에 최소한의 개수로 0을 추가한 배열을 리턴하세요.
입/출력 :
console.log(solution([1, 2, 3, 4, 5, 6])); // [1, 2, 3, 4, 5, 6, 0, 0]
function solution(arr) {
// 1. 2의 pow 배열을 미리 지정해준다.
const powArr = [1,2,4,8,16,32,64,128,256,512,1024,2048];
// 2. pow 배열의 원소 중 arr.length보다 큰 값을 찾아 해당 값에 - arr.length한 값만큼 배열을 새로 만들어 0으로 채운다.
const arr2 = new Array(powArr.find(x => x >= arr.length) - arr.length).fill(0);
// 3. 기존 arr와 2번에서 만든 배열을 합쳐 리턴한다.
return [...arr, ...arr2];
}
문제설명 : 정수 배열 arr가 주어집니다. arr의 각 원소에 대해 값이 50보다 크거나 같은 짝수라면 2로 나누고, 50보다 작은 홀수라면 2를 곱하고 다시 1을 더합니다.
이러한 작업을 x번 반복한 결과인 배열을 arr(x)라고 표현했을 때, arr(x) = arr(x + 1)인 x가 항상 존재합니다. 이러한 x 중 가장 작은 값을 return 하는 solution 함수를 완성해 주세요.
입/출력 :
console.log(solution([1, 2, 3, 100, 99, 98])); // 5
// 조건에 따라 연산하는 함수
function calculation(arr) {
return arr.map((n) => {
if (n >= 50 && n % 2 === 0) {
return n / 2;
}
if (n < 50 && n % 2 === 1) {
return n * 2 + 1;
}
return n;
});
}
// 일치 여부를 확인하는 함수
function isAllSame(arr1, arr2) {
return arr1.every((v, i) => v === arr2[i]);
}
function solution(arr) {
let cnt = 0;
let prevArr = arr; // 앞전 x-1 연산값
let curArr = arr; // 현재 x번째 연산값
while (true) {
// 현재 값을 바꿔준다.
curArr = calculation(arr);
// 현재(x)번째 연산 값과 이전(x-1)번째 연산값이 같다면 while문을 빠져나간다.
if (isAllSame(prevArr, curArr)) {
break;
}
// 아니라면 x값을 1 증가시키고, prevArr값을 현재 값으로 갱신해준다.
cnt++;
prevArr = curArr;
}
return cnt;
}
문제설명 : 2차원 배열 queries의 각 원소는 query를 나타내며 [s, e, k]꼴이다. arr.slice(s, e+1)
을 했을 때, 각 요소 중 K보다 크면사 그 중 가장 작은 값을 새로운 배열에 담는다. query에 대해 2번 과정을 반복하며 만족하는 수가 없다면 -1을 배열에 담는다. 각 쿼리의 순서에 맞게 답을 저장한 배열을 반환하세요.
입/출력 :
console.log(
solution(
[0, 1, 2, 4, 3],
[
[0, 4, 2],
[0, 3, 2],
[0, 2, 2],
]
)
); // [3, 4, -1]
function f(arr, query) {
const [s, e, k] = query;
const filtered = arr
.slice(s, e + 1)
.filter((x) => x > k)
.sort((a, b) => a - b);
return filtered[0] !== undefined ? filtered[0] : -1;
}
function solution(arr, queries) {
return queries.map((query) => f(arr, query));
}
function f(arr, query) {
const [s, e, k] = query;
const filtered = arr.filter((v, i) => s <= i && i <= e && v > k);
return filtered.length ? Math.min(...filtered) : -1;
}
function solution(arr, queries) {
return queries.map((query) => f(arr, query));
}
문제설명 : 2차원 배열 queries가 각 [s, e] 형태로 주어질 때, my_string의 인덱스 s부터 인덱스 e까지를 뒤집어 처리한 문자열을 리턴하세요.
입/출력 :
console.log(solution("abab", [[2, 3]])); // "abba"
splice
를 통해 기존 위치의 문자열을 변환한 문자열로 대체한다.function solution(my_string, queries) {
const str = my_string.split('');
queries.forEach(([s, e]) => {
const reverseStr = [...str.slice(s, e + 1)].reverse();
str.splice(s, reverseStr.length, ...reverseStr);
});
return str.join('');
}
문제설명 : 다음 조건에 맞는 배열을 리턴하세요.
조건 :
입/출력 :
console.log(solution(["u", "u", "l", "r"])); // ["u", "u"]
function solution(str) {
for (let i = 0; i < str.length; i++) {
if (str[i] === "l") {
return str.slice(0, i);
}
if (str[i] === "r") {
return str.slice(i + 1);
}
}
// l, r 둘다 없으면 빈배열 리턴
return [];
}