"나는 무엇을 풀었는가" 시리즈는 이렇게 시작했습니다.
- 취업 준비 중 몇 번의 코딩테스트를 보며 깨달은 것이 있습니다. 바로 "기초가 중요하다"는 것입니다. 그리하여 프로그래머스 Level.0부터 차근차근 다시 풀어보려고 합니다.
- 단지 문제를 푸는 것보단, 왜 해당 함수를 썼는지 더 재사용이나 가독성을 높일 방법은 없는지, 그리고 해당 함수가 없다면 어떻게 풀 수 있을지와 같이 다양한 방법과 생각을 통해 사고력을 높이려고 노력합니다.
- 그럼 레츠 고 !
문제설명 : num_list의 모든 원소를 1로 만들기 위해서 필요한 나누기 연산의 횟수를 리턴하세요.
조건 :
1. 짝수라면 n/2, 횟수++
2. 홀수라면 (n - 1)/2, 횟수++
3. 위 과정을 1이 될때까지 반복하여 각 원소를 1로 만들기 위해 필요한 총 횟수를 리턴하세요.
입/출력 :
console.log(solution([12, 4, 15, 1, 14])); // 11
function calculator(n) {
let result = 0;
while (n !== 1) {
n = n % 2 === 0 ? n / 2 : (n - 1) / 2;
result += 1;
}
return result;
}
function solution(num_list) {
return num_list.map(calculator).reduce((a, b) => a + b, 0);
}
function calculator(n) {
if (n === 1) {
return 0;
}
return 1 + calculator(n % 2 === 0 ? n / 2 : (n - 1) / 2);
}
function solution(num_list) {
return num_list.map(calculator).reduce((a, b) => a + b, 0);
}
문제설명 : 배열 안의 2가 모두 포함된 가장 작은 연속된 부분 배열을 리턴하세요. 단, arr에 2가 없는 경우 [-1]을 리턴하세요.
입/출력 :
console.log(solution([1, 2, 1, 4, 5, 2, 9])); // [2, 1, 4, 5, 2]
function solution(arr) {
let a = arr.indexOf(2);
let b = arr.lastIndexOf(2) + 1;
return a !== -1 ? arr.slice(a, b) : [-1];
}
문제설명 : num_list에서 가장 작은 5개의 수를 오름차순으로 담은 리스트를 리턴하세요.
입/출력 :
console.log(solution([12, 4, 15, 46, 38, 1, 14])); // [1, 4, 12, 14, 15]
function solution(num_list) {
return num_list.sort((a, b) => a - b).slice(0, 5);
}
문제설명 : num_list에서 가장 작은 5개의 수를 제외한 수들을 오름차순으로 담은 리스트를 리턴하세요.
입/출력 :
console.log(solution([12, 4, 15, 46, 38, 1, 14])); // [1, 4, 12, 14, 15]
function solution(num_list) {
return num_list.sort((a, b) => a - b).slice(0, 5);
}
문제설명 : my_string에서 'A'의 개수, my_string에서 'B'의 개수,..., my_string에서 'Z'의 개수, my_string에서 'a'의 개수, my_string에서 'b'의 개수,..., my_string에서 'z'의 개수를 순서대로 담은 길이 52의 정수 배열을 리턴하세요.
입/출력 :
console.log(solution("Programmers"));
// [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0]
function solution(my_string) {
let arr = Array(52).fill(0);
[...my_string].map((alp) => {
const code = alp.charCodeAt(alp); // 아스키코드 확인
// 대문자라면
if (alp === alp.toUpperCase()) {
return arr[code - 65] += 1;
} else {
return arr[code - 71] += 1;
}
})
return arr;
}
function counterCommon(s, alphabetCase) {
const result = new Array(26).fill(0);
for (let i = 0; i < s.length; i++) {
const alp = s[i];
const index = alphabetCase.indexOf(alp);
if (index > -1) {
result[index] += 1;
}
}
return result;
}
function counterUpper(my_string) {
return counterCommon(my_string, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ');
}
function counterLower(my_string) {
return counterCommon(my_string, 'abcdefghijklmnopqrstuvwxyz');
}
function solution(s) {
return counterUpper(s).concat(counterLower(s));
}
문제설명 : my_strings의 원소의 parts에 해당하는 부분 문자열을 순서대로 이어 붙인 문자열을 리턴하세요.
→ my_strings[i].slice(parts[i][0], parts[i][1] + 1)한 문자열을 순서대로 이어 붙인 문자열을 리턴하세요.
입/출력 :
console.log(solution(["progressive", "hamburger", "hammer", "ahocorasick"], [[0, 4], [1, 2], [3, 5], [7, 7]])); // "programmers"
function solution(my_strings, parts) {
return my_strings.map((el, i) => el.slice(parts[i][0], parts[i][1] + 1)).join('');
}
function solution(my_strings, parts) {
let result = "";
for (let i = 0; i < my_strings.length; i++) {
result += my_strings[i].slice(parts[i][0], parts[i][1] + 1);
}
return result;
}
문제설명 : target이 문자열 my_string의 부분 문자열이라면 1을, 아니라면 0을 리턴하세요.
입/출력 :
console.log(solution("banana", "ana")); // 1
function solution(my_string, target) {
return my_string.includes(target) ? 1 : 0;
}
문제설명 : arr의 각 원소에 대해 값이 50보다 크거나 같은 짝수라면 2로 나누고, 50보다 작은 홀수라면 2를 곱합니다. 그 결과인 정수 배열을 리턴하세요.
입/출력 :
console.log(solution([1, 2, 3, 100, 99, 98])); // [2, 2, 6, 50, 99, 49]
function solution(arr) {
return arr.map((el) => {
if (el >= 50 && el % 2 === 0) return el / 2;
else if (el < 50 && el % 2 === 1) return el * 2;
else return el;
})
}