Q.
문자열 "hello"에서 각 문자를 오른쪽으로 한 칸씩 밀고 마지막 문자는 맨 앞으로 이동시키면 "ohell"이 됩니다. 이것을 문자열을 민다고 정의한다면 문자열 A와 B가 매개변수로 주어질 때, A를 밀어서 B가 될 수 있다면 밀어야 하는 최소 횟수를 return하고 밀어서 B가 될 수 없으면 -1을 return 하도록 solution 함수를 완성해보세요.
// 입출력 예시
solution("hello", "ohell") = 1
// A.
// B 2개를 붙여서 탐색
let solution=(A, B)=>(B + B).indexOf(A)
프로그래머스: https://school.programmers.co.kr/learn/courses/30/lessons/120921
true -> 1, false -> 0
true + 3 // 4
false + 3 // 3
true - 3 // -2
false - 3 // -3
true * 3 // 3
false * 3 // 0
true / 5 // 0.2
false / 5 // 0
반복되는 연산은 함수로 만들어주면 좋음
// 함수 추출 전
function solution(dots) {
let arr = [[0,1], [0,2], [0,3]]
for(let i = 0; i < arr.length; i++) {
let [a, b] = arr[i]
let group1 = dots.filter((el, idx) => idx === a || idx === b)
let group2 = dots.filter((el, idx) => idx !== a && idx !== b)
let group1Slope = (group1[0][1] - group1[1][1]) / (group1[0][0] - group1[1][0])
let group2Slope = (group2[0][1] - group2[1][1]) / (group2[0][0] - group2[1][0])
if(group1Slope === group2Slope) return 1
}
return 0
}
// 함수 추출 후
function solution(dots) {
let arr = [[0,1], [0,2], [0,3]]
let slope = (arr) => {
return (arr[0][1] - arr[1][1]) / (arr[0][0] - arr[1][0])
}
for(let i = 0; i < arr.length; i++) {
let [a, b] = arr[i]
let group1 = dots.filter((el, idx) => idx === a || idx === b)
let group2 = dots.filter((el, idx) => idx !== a && idx !== b)
if(slope(group1) === slope(group2)) return 1
}
return 0
}
조건식이 falsy 값일 경우 유용
// 전
function solution(array) {
let obj = {}
for(let el of array) {
if(!obj[el]) {
obj[el] = 0
}
obj[el]++
}
}
// 후
function solution(array) {
let obj = {}
for(let el of array) {
obj[el] = (obj[el] || 0) + 1
}
}
// solution(["meosseugi", "1234"], [["rardss", "123"], ["yyoom", "1234"], ["meosseugi", "1234"]])
function solution(id_pw, db) {
const [ userId, userPw ] = id_pw;
for (const [ dbId, dbPw ] of db) { // 첫 번째 실행 시: dbId = "rardss", dbPw = "123"
if (userId === dbId && userPw === dbPw) return "login";
else if (userId === dbId && userPw !== dbPw) return "wrong pw";
}
return "fail";
}
프로그래머스: https://school.programmers.co.kr/learn/courses/30/lessons/120883
방식1. filter 후 array.length === 1인지 확인
방식2. 빈도수로 sort 후 첫 번째 요소와 두 번째 요소의 빈도가 다른지 확인
Q.최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다.
// 입출력 예시
solution([1, 2, 3, 3, 3, 4]) // 3
// 방식 2 풀이
function solution(array) {
let m = new Map();
for (let n of array) m.set(n, (m.get(n) || 0)+1);
m = [...m].sort((a,b)=>b[1]-a[1]);
return m.length === 1 || m[0][1] > m[1][1] ? m[0][0] : -1;
}
프로그래머스: https://school.programmers.co.kr/learn/courses/30/lessons/120812
base case를 n === 1
로 하면 안됨(n에 0이나 음수가 들어올 경우)
const factorial = (n) => {
if (n <= 1) return 1;
return n * factorial(n - 1);
};
Q. 하나의 집합을 의미하는 문자열을 입력받아 각 문자를 가지고 만들 수 있는 모든 부분집합을 리턴해야 합니다.
// 입출력 예시
let output1 = powerSet('abc');
console.log(output1); // ['', 'a', 'ab', 'abc', 'ac', 'b', 'bc', 'c']
// A.
const powerSet = function (str) {
let sorted = str.split('').sort()
let deduplicated = Array.from(new Set(sorted))
let result = []
let fn = (idx, subset) => {
if(idx === deduplicated.length) {
result.push(subset)
return
}
// deduplicated[idx]가 포함X
fn(idx + 1, subset)
// deduplicated[idx]가 포함O
fn(idx + 1, subset + deduplicated[idx])
}
fn(0, '')
result.sort()
return result
};
① fn(인덱스
, subset) 함수는 fn() 함수 2개를 호출
fn(인덱스+1
, subset)
fn(인덱스+1
, subset + 배열에서 인덱스+1
번째 요소)
② 함수의 첫번째 인자가 deduplicated.length와 같을 때, 그 때의 두 번째 인자를 배열에 push
callback을 넘겨주지 않아도 오류가 나지 않음
function fn(callback = item => item) {
return callback(1)
}
fn() // 1 (기본값을 설정했기 때문에 callback을 넘겨주지 않아도 됨)
fn(function(n) {return n * 5)} // 5
재귀 방향, 출력 타입에 맞는 리턴 값
베이스 케이스 직전의 값으로 테스트
// Q.수(num)와 배열을 입력받아 차례대로 num개의 요소만 포함된 새로운 배열을 리턴해야 합니다.
// 입출력 예시
let output = take(2, [1, -2, 1, 3]);
console.log(output); // --> [1, -2]
// A.
function take(num, arr) {
if(num === 0 || arr.length === 0) {
return []
}
return [arr[0]].concat(take(num - 1, arr.slice(1)))
}