"나는 무엇을 풀었는가" 시리즈는 이렇게 시작했습니다.
- 취업 준비 중 몇 번의 코딩테스트를 보며 깨달은 것이 있습니다. 바로 "기초가 중요하다"는 것입니다. 그리하여 프로그래머스 Level.0부터 차근차근 다시 풀어보려고 합니다.
- 단지 문제를 푸는 것보단, 왜 해당 함수를 썼는지 더 재사용이나 가독성을 높일 방법은 없는지, 그리고 해당 함수가 없다면 어떻게 풀 수 있을지와 같이 다양한 방법과 생각을 통해 사고력을 높이려고 노력합니다.
- 그럼 레츠 고 !
문제설명 : 양의 정수 a와 b가 주어졌을 때, a ⊕ b와 b ⊕ a 중 더 큰 값을 리턴하세요.
입/출력 :
console.log(solution(9, 91)); // 991
function solution(a, b) {
const aByb = Number(String(a) + b);
const bBya = Number(String(b) + a);
return aByb > bBya ? aByb : bBya;
}
function f(...args) {
return Number(args.map(String).reduce((a, b) => a + b));
}
function solution(a, b) {
const aByb = f(a, b);
const bBya = f(b, a);
return aByb > bBya ? aByb : bBya;
}
문제설명 : 정수 a와 b가 주어졌을 때, a ⊕ b와 2 a b 중 더 큰 값을 리턴하세요.
입/출력 :
console.log(solution(2, 91)); // 364
function solution(a, b) {
const stickNum = Number(String(a) + b);
const twoByNum = 2 * a * b;
return stickNum > twoByNum ? stickNum : twoByNum;
}
function f(...args) {
return Number(args.map(String).reduce((a, b) => a + b));
}
function solution(a, b) {
const stickNum = f(a, b);
const twoByNum = 2 * a * b;
return stickNum > twoByNum ? stickNum : twoByNum;
}
문제설명 : arr의 길이가 홀수라면 arr의 모든 짝수 인덱스 위치에 n을 더한 배열을, arr의 길이가 짝수라면 arr의 모든 홀수 인덱스 위치에 n을 더한 배열을 리턴하세요.
입/출력 :
console.log(solution([49, 12, 100, 276, 33], 27)); // [76, 12, 127, 276, 60]
function solution(arr, n) {
// 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);
}
}
문제설명 : 각 직원이 적은 메뉴가 문자열 배열 order로 주어질 때, 카페에서 결제하게 될 금액을 리턴하세요.
가격표 :
입/출력 :
console.log(solution(["cafelatte", "americanoice", "hotcafelatte", "anything"])); // 19000
function calculate(order) {
return order.includes("cafelatte") ? 5000 : 4500;
}
function solution(order) {
let price = order.map((el) => calculate(el));
return price.reduce((acc, cur) => (acc + cur), 0);
}
function solution(order) {
let result = 0;
for (let i = 0; i < order.length; i++) {
result += order[i].includes("cafelatte") ? 5000 : 4500;
}
return result;
}
문제설명 : 홀수 번째 원소들의 합과 짝수 번째 원소들의 합 중 큰 값을 리턴하세요.
입/출력 :
console.log(solution([4, 2, 6, 1, 7, 6])); // 17
// 홀수번째 원소들의 합(짝수 인덱스)
let oddSum = num_list.filter((el, idx) => idx % 2 === 0).reduce((acc, cur) => acc + cur, 0);
// 짝수번째 원소들의 합(홀수 인덱스)
let evenSum = num_list.filter((el, idx) => idx % 2 === 1).reduce((acc, cur) => acc + cur, 0);
return oddSum > evenSum ? oddSum : evenSum;
}
function sum(arr){
return arr.reduce((acc, cur) => acc + cur, 0);
}
function solution(num_list) {
const oddSum = sum(num_list.filter((_, idx) => idx % 2 === 0));
const evenSum = sum(num_list.filter((_, idx) => idx % 2 === 1));
return oddSum < evenSum ? evenSum : oddSum;
}
문제설명 : my_string에서 indices의 원소에 해당하는 인덱스의 글자를 지우고 이어 붙인 문자열을 리턴하세요.
입/출력 :
console.log(solution("apporoograpemmemprs", [1, 16, 6, 15, 0, 10, 11, 3])); // "programmers"
function solution(my_string, indices) {
return [...my_string].filter((_, i) => !indices.includes(i)).join('');
}
function solution(my_string, indices) {
let result = [];
for (let i = 0; i < my_string.length; i++) {
if (!indices.includes(i)) {
result.push(my_string[i]);
}
}
return result.join("");
}
문제설명 : 배열 arr의 첫 번째 구간에 해당하는 배열과 두 번째 구간에 해당하는 배열을 앞뒤로 붙여 새로운 배열을 만들어 리턴하세요.
입/출력 :
console.log(solution([1, 2, 3, 4, 5],[[1, 3], [0, 4]])); // [2, 3, 4, 1, 2, 3, 4, 5]
function solution(arr, intervals) {
return intervals
.map(([a, b]) => arr.slice(a, b + 1))
.reduce((a, b) => a.concat(b));
}
function solution(arr, intervals) {
return intervals
.map(([a, b]) => arr.slice(a, b + 1))
.flat(); // 2차원 배열을 풀어 -> 1차원 배열로 만들어준다.
}
function solution(arr, intervals) {
const [[a1, b1], [a2, b2]] = intervals;
return [...arr.slice(a1, b1 + 1), ...arr.slice(a2, b2 + 1)];
}
문제설명 : 배열 intStrs의 각 원소마다 s번 인덱스에서 시작하는 길이 l짜리 부분 문자열을 잘라내 정수로 변환합니다. 이때 변환한 정수값이 k보다 큰 값들을 담은 배열을 리턴하세요.
입/출력 :
console.log(solution(["0123456789","9876543210","9999999999999"], 50000, 5, 5)); // [56789, 99999]
function solution(intStrs, k, s, l) {
// 1. 각 원소마다 s번째 인덱스부터 s + 1까지 문자열을 잘라 정수로 변환한다.
let mapping = intStrs.map((num) => parseInt(num.slice(s, s+l)));
//2. 각 원소를 돌면서 원소가 k보다 큰 값을 담은 배열을 담아 리턴한다.
return mapping.filter((el) => el > k);
}
function solution(intStrs, k, s, l) {
return intStrs
.map((num) => parseInt(num.slice(s, s+l), 10))
.filter((el) => el > k);
}
`parseInt`를 사용할 때 두번째 인자로 몇 진법으로 변환할 건지 정해주는 것이 좋다.
문제설명 : n × n 크기의 이차원 배열 arr를 리턴하세요.
입/출력 :
console.log(solution(3)); // [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
function solution(n) {
const arr = [];
for (let i = 0; i < n; i++) {
const temp = Array(n).fill(0);
temp[i] = 1;
arr.push(temp);
}
return arr;
}
Array.from
: Array.from(배열로 변환하고자 하는 유사 배열 객체, 배열의 모든 요소에 호출할 맵핑 함수)
function solution(n) {
let arr = Array.from(Array(n), () => Array(n).fill(0));
for (let i = 0; i < n; i++) {
arr[i][i] = 1;
}
return arr;
}
문제설명 : n × n 크기의 이차원 배열 arr이 매개변수로 주어질 때, arr이 다음을 만족하면 1을 아니라면 0을 리턴하세요.
조건 : arr[i][j] = arr[j][i]
입/출력 :
console.log(solution([
[5, 192, 33],
[192, 72, 95],
[33, 95, 999]
])); // 1
function solution(arr) {
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < i; j++) {
if (arr[i][j] !== arr[j][i]) {
return 0;
}
}
}
return 1;
}
function solution(arr) {
let flag = true;
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < i; j++) {
// console.log(arr[i][j], arr[j][i], arr[i][j] === arr[j][i]);
if (arr[i][j] !== arr[j][i]) {
flag = false;
}
}
}
return flag ? 1 : 0;
}