[Daily Coding 10]문자열 밀기/Boolean과 사칙연산/함수 추출/조건문을 Or 연산자로 대체하기/for...of와 구조분해할당/최빈값의 개수/factorial/재귀함수 2번 호출/콜백 기본값 설정/재귀

hameee·2023년 2월 4일
0

Daily Coding

목록 보기
10/10

1.문자열 밀기(프로그래머스)

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

2.Boolean과 사칙연산

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

3.함수 추출

반복되는 연산은 함수로 만들어주면 좋음

// 함수 추출 전
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
}

4.조건문을 Or 연산자로 대체하기

조건식이 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
    }
}

5.for...of와 구조분해할당

// 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

6.최빈값이 1개인지 아닌지 구하기

1) 방식

방식1. filter 후 array.length === 1인지 확인
방식2. 빈도수로 sort 후 첫 번째 요소와 두 번째 요소의 빈도가 다른지 확인

2) 예시

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

7.factorial 재귀

base case를 n === 1로 하면 안됨(n에 0이나 음수가 들어올 경우)

const factorial = (n) => {
    if (n <= 1) return 1;
    return n * factorial(n - 1);
 };

8.재귀함수 2번 호출

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
};

2) powerSet('abc')일 경우 fn() 함수 작동

① fn(인덱스, subset) 함수는 fn() 함수 2개를 호출
fn(인덱스+1, subset)
fn(인덱스+1, subset + 배열에서 인덱스+1번째 요소)

② 함수의 첫번째 인자가 deduplicated.length와 같을 때, 그 때의 두 번째 인자를 배열에 push

9.콜백 기본값 설정

callback을 넘겨주지 않아도 오류가 나지 않음

function fn(callback = item => item) {
  return callback(1) 
}

fn() // 1 (기본값을 설정했기 때문에 callback을 넘겨주지 않아도 됨)
fn(function(n) {return n * 5)} // 5

10.재귀

1) 설정해야 하는 것

재귀 방향, 출력 타입에 맞는 리턴 값

2) 테스트 시

베이스 케이스 직전의 값으로 테스트

// 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)))
}

0개의 댓글