"나는 무엇을 풀었는가" 시리즈는 이렇게 시작했습니다.
- 취업 준비 중 몇 번의 코딩테스트를 보며 깨달은 것이 있다. 바로 기초가 중요하다. 그리하여 프로그래머스 Level.0부터 차근차근 다시 풀어보려고 한다.
- 단지 문제를 푸는 것보단, 왜 해당 함수를 썼는지 더 재사용이나 가독성을 높일 방법은 없는지, 그리고 해당 함수가 없다면 어떻게 풀 수 있을지와 같이 다양한 방법과 생각을 통해 사고력을 높이려고 한다.
- 그럼 레츠 고 !
문제설명 : 하나 이상의 공백으로 구분된 문자열의 각 단어를 담은 배열을 리턴하세요.
입/출력 :
console.log(solution(" i love you")); // ["i", "love", "you"]
function solution(my_string) {
let str = my_string.split(" ")
let arr = [];
for (let i = 0; i < str.length; i++) {
if (str[i] !== "" ) {
arr.push(str[i])
}
}
return arr;
}
function solution(my_string) {
let result = my_string.match(/[^\s]+/g);
return result;
}
문제설명 : 모든 원소들의 곱이 모든 원소들의 합의 제곱보다 작으면 1을 크면 0을 리턴하세요.
입/출력 :
console.log(solution([3, 4, 5, 2, 1])); // 1
console.log(solution([5, 7, 8, 3])); // 0
function solution(num_list) {
let sum = 0; //합
let total = 1; //곱
for (let i = 0; i < num_list.length; i++) {
sum += num_list[i];
total *= num_list[i];
}
sum = sum * sum;
return total < sum ? 1 : 0;
}
function f(arr, result, fn) {
for (let i = 0; i < arr.length; i++) {
result = fn(result, arr[i]);
}
return result;
}
function sum(arr) {
return f(arr, 0, (a, b) => a + b);
}
function multi(arr) {
return f(arr, 1, (a, b) => a * b);
}
function solution(num_list) {
let a = sum(num_list); //합
let b = multi(num_list); //곱
a = a * a;
return b < a ? 1 : 0;
}
문제설명 : number가 n의 배수이면서 m의 배수이면 1을 아니라면 0을 리턴하세요.
입/출력 :
console.log(solution(60, 2 ,3)); // 1
function solution(number, n, m) {
return (number % n === 0 && number % m === 0) ? 1 : 0;
}
문제설명 : my_string의 앞의 n글자로 이루어진 문자열을 리턴하세요.
입/출력 :
console.log(solution("ProgrammerS123", 11)) // "ProgrammerS"
function solution(my_string, n) {
return my_string.slice(0, n);
}
문제설명 : arr의 길이가 홀수라면 arr의 모든 짝수 인덱스 위치에 n을 더한 배열을, arr의 길이가 짝수라면 arr의 모든 홀수 인덱스 위치에 n을 더한 배열을 리턴하세요.
입/출력 :
console.log(solution([49, 12, 100, 276, 33], 27)); // [76, 12, 127, 276, 60]
function solution(arr, n) {
if (arr.length % 2 === 0) {
return arr.map((el, idx) => (idx % 2 === 1) ? el + n : el);
} else {
return arr.map((el, idx) => (idx % 2 === 0) ? el + n : el);
}
}
function solution(arr) {
for (let i = 0; i < arr.length; i ++) {
if (arr.length % 2 === 1) {
// 길이가 홀수라면 arr의 모든 짝수 인덱스 위치에 n을 더한 배열을
for (let i = 1; i < arr.length; i += 2) {
arr.replace(arr[i], arr[i] + n);
}
}
else {
// 짝수라면, arr의 모든 홀수 인덱스의 n을 더한 배열을 리턴하라
for (let i = 0; i < arr.length; i += 2) {
arr.replace(arr[i], arr[i] + n);
}
}
}
return arr;
}
문제설명 : 문자열 s의 각 요소를 k만큼 shift된 문자열을 리턴하세요. 이때 알파벳 끝을 넘는다면 알파벳의 맨 앞으로 넘겨집니다.
입/출력 :
console.log(caesarCipher('middle - Outz', 2)); // okffng - Qwvb
% 26를 하는 이유
- z + k를 하게 되면 알파벳.length를 넘어가게 된다.
- -> 이때 (% 26)를 하게 되면, 26 -> 27이 되는게 아니라, 다시 1로 넘어간다.
- 따라서 26이 넘지 않은 인덱스는 영향 받지 않지만 --> 16 % 26 = 16;
- 26이 넘어가는 인덱스는 해당 값에 - 26 처리 된다 --> 29 % 26 = 3;
function caesarCipher(s, k) {
const lowAlpha = "abcdefghijklmnopqrstuvwxyz";
const upperAlpha = lowAlpha.toUpperCase();
const trans = s.split("").map(letter => {
if (lowAlpha.includes(letter)) {
return lowAlpha[(lowAlpha.indexOf(letter) + k) % 26];
} else if (upperAlpha.includes(letter)) {
return upperAlpha[(upperAlpha.indexOf(letter) + k) % 26];
} else {
return letter; // 알파벳이 아닌 특수 기호라면,
}
});
return trans.join("");
}
문제설명 : 배열의 원소 중 고유한 요소를 찾아 리턴하세요.
입/출력 :
console.log(lonelyinteger([1,2,3,4,5,2,1])); // 4
function lonelyinteger(a) {
const double = a.filter((item, idx) => a.indexOf(item) !== idx);
const result = a.filter((item) => !double.includes(item));
return String(result);
}
문제설명 : n개의 값을 가진 배열 arr에서 k만큼 값을 선택했을 때, Max(arr) - Min(arr) 값이 가장 작은 경우의 값을 리턴하세요.
입/출력 :
console.log(maxMin(2, [1, 4, 7, 2])); // 1
function maxMin(k, arr) {
const sortedArr = arr.sort((a, b) => a - b);
const result = [];
for (let i = 0; i <= sortedArr.length - k; i++) {
const point = sortedArr[i + k - 1] - sortedArr[i];
result.push(point);
}
return Math.min(...result);
}
문제가 많아, 上 / 下 편으로 나눕니다.
👉 7월 첫주 下편에서 계속...