diff --git "a/day31/k\354\235\230\352\260\234\354\210\230.ts" "b/day31/k\354\235\230\352\260\234\354\210\230.ts" new file mode 100644 index 0000000..3ea6668 --- /dev/null +++ "b/day31/k\354\235\230\352\260\234\354\210\230.ts" @@ -0,0 +1,27 @@ +// https://school.programmers.co.kr/learn/courses/30/lessons/120887 + +// 최초 코드 +const k의개수 = (i: number, j: number, k: number): number => { + let cnt = 0; + while (i <= j) { + cnt += [...i.toString()].filter((v) => parseInt(v, 10) === k).length; + i++; + } + return cnt; +}; + +// 개선 코드 +const k의개수2 = (i: number, j: number, k: number): number => { + let str = ''; + while (i <= j) str += i++; + // k를 기준으로 문자열을 나누면 k+1개의 요소로 나눠진다. + return str.split(k.toString()).length - 1; +}; + +console.log(k의개수(1, 13, 1)); // 6 +console.log(k의개수(10, 50, 5)); // 5 +console.log(k의개수(3, 10, 2)); // 0 + +console.log(k의개수2(1, 13, 1)); // 6 +console.log(k의개수2(10, 50, 5)); // 5 +console.log(k의개수2(3, 10, 2)); // 0 diff --git "a/day31/\354\210\250\354\226\264\354\236\210\353\212\224\354\210\253\354\236\220\354\235\230\353\215\247\354\205\2102.ts" "b/day31/\354\210\250\354\226\264\354\236\210\353\212\224\354\210\253\354\236\220\354\235\230\353\215\247\354\205\2102.ts" new file mode 100644 index 0000000..1de60eb --- /dev/null +++ "b/day31/\354\210\250\354\226\264\354\236\210\353\212\224\354\210\253\354\236\220\354\235\230\353\215\247\354\205\2102.ts" @@ -0,0 +1,44 @@ +// https://school.programmers.co.kr/learn/courses/30/lessons/120864 + +import { sum } from 'lodash'; + +// ver 1. 틀린 코드 +// /\d/의 경우 한자리 자연수만 검사하게 된다. 문제 의도와 다르다. +const 숨어있는숫자의덧셈2a = (str: string): number => { + return sum([...str].filter((v) => /\d/.test(v)).map((v) => parseInt(v, 10))); +}; + +//! 최적의 코드인 것 같다. +// ver 2. split 사용 +const 숨어있는숫자의덧셈2b = (str: string): number => { + return sum( + str + .split(/[a-z]/i) + .filter((v) => v !== '') + .map((v) => parseInt(v, 10)), + ); +}; + +// ver 3. replace 사용 +const 숨어있는숫자의덧셈2c = (str: string) => { + let ans = 0; + str + .replace(/\D/g, ' ') + .split(' ') + .forEach((v) => { + if (v !== '') ans += parseInt(v, 10); + }); + return ans; +}; + +// ver 4. 다른 사람 코드 +// /\D+/g와 reduce 활용 + +console.log(숨어있는숫자의덧셈2a('aAb1B2cC34oOp')); // 37 +console.log(숨어있는숫자의덧셈2a('1a2b3c4d123Z')); // 133 + +console.log(숨어있는숫자의덧셈2b('aAb1B2cC34oOp')); // 37 +console.log(숨어있는숫자의덧셈2b('1a2b3c4d123Z')); // 133 + +console.log(숨어있는숫자의덧셈2c('aAb1B2cC34oOp')); // 37 +console.log(숨어있는숫자의덧셈2c('1a2b3c4d123Z')); // 133 diff --git "a/day31/\355\214\251\355\206\240\353\246\254\354\226\274.ts" "b/day31/\355\214\251\355\206\240\353\246\254\354\226\274.ts" new file mode 100644 index 0000000..6d0cea4 --- /dev/null +++ "b/day31/\355\214\251\355\206\240\353\246\254\354\226\274.ts" @@ -0,0 +1,32 @@ +// https://school.programmers.co.kr/learn/courses/30/lessons/120848 + +// ver 1. 최초 코드 +// 코드가 명시적임 +// 시간 효율은 ver 2보다 떨어진다. +const 팩토리얼 = (n: number): number => { + // 팩토리얼 함수 + const factorialFunc = (num: number): number => { + if (num === 1) return 1; + return num * factorialFunc(num - 1); + }; + // 코어 로직 + let cnt = 0; + while (factorialFunc(cnt + 1) <= n) cnt++; + return cnt; +}; + +// ver 2. 개선 코드 +// 코드 의미가 명시적이지는 않지만, 시간 효율은 좋다. +const 팩토리얼2 = (n: number): number => { + let fac = 1; + let i = 1; + while (fac <= n) fac *= ++i; + return i - 1; +}; + +console.log(팩토리얼(3628800)); // 10 +console.log(팩토리얼(7)); // 3 + +console.log(팩토리얼2(3628800)); // 10 +console.log(팩토리얼2(7)); // 3 +console.log(팩토리얼2(5)); // 2