[알고리즘 풀이_Lv0] A로 B 만들기, 팩토리얼, k의 개수, 가까운 수
*제주코딩베이스캠프의 JavaScript 알고리즘 100일 챌린지를 참고로 정리하고 있습니다.*
A로 B 만들기_20번째
문제
https://school.programmers.co.kr/learn/courses/30/lessons/120886
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문자열 before와 after가 매개변수로 주어질 때,
before의 순서를 바꾸어 after를 만들 수 있으면 1을,
만들 수 없으면 0을 return 하도록 solution 함수를 완성해보세요.
소스 코드
function solution(before, after) {
return before.split('').sort().join('') === after.split('').sort().join('') ? 1 : 0 ;
}
1. before
- 문자열을 배열로 만들어준다.
- 배열을 정렬한다.
- 정렬한 배열을 다시 문자열로 바꾼다.
2. after도 before와 똑같이 진행한다.
3. 정렬한 문자열 before, after이 같으면 1 아니면 0을 반환한다.
팩토리얼_21번째
문제
https://school.programmers.co.kr/learn/courses/30/lessons/120848
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
i팩토리얼 (i!)은 1부터 i까지 정수의 곱을 의미합니다. 예를들어 5! = 5 * 4 * 3 * 2 * 1 = 120 입니다.
정수 n이 주어질 때 다음 조건을 만족하는 가장 큰 정수 i를 return 하도록 solution 함수를 완성해주세요.
해결방안
function solution(n) {
let i = 1;
let factorial = 1;
while(factorial <= n){
i+= 1
factorial *= i
}
return i;
}
위와 같이 쓰면 +1한값이 나온다.
이유. f === n일 경우에 한번 더 while문이 실행되기 때문이다.
n = 120;
i f f<=120
1 1 f<=120
2 2 f<=120
3 6 f<=120
4 24 f<=120
5 120 f<=120
그래서 아래와 같이 return i-1을 해주어야 된다.
function solution(n) {
let i = 1;
let factorial = 1;
while(factorial <= n){
i+= 1
factorial *= i
}
return i-1;
}
소스 코드
function solution(n) {
let i = 1;
let factorial = 1;
while(factorial <= n){
i+= 1
factorial *= i
}
return i-1;
}
k의 개수_22번째
문제
https://school.programmers.co.kr/learn/courses/30/lessons/120887
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1부터 13까지의 수에서, 1은 1, 10, 11, 12, 13 이렇게 총 6번 등장합니다. (
1, 10에서 1개, 11에서 2개, 12에서 1개, 13에서 1개 총 6번)
정수 i, j, k가 매개변수로 주어질 때, i부터 j까지 k가 몇 번 등장하는지 return 하도록 solution 함수를 완성해주세요.
구글 입사문제와 유사하다.
https://codingdojang.com/scode/393
코딩도장
프로그래밍 문제풀이를 통해서 코딩 실력을 수련
codingdojang.com
1부터 10,000까지 8이라는 숫자가 총 몇번 나오는가?
8이 포함되어 있는 숫자의 갯수를 카운팅 하는 것이 아니라 8이라는 숫자를 모두 카운팅 해야 한다.(※ 예를들어 8808은 3, 8888은 4로 카운팅 해야 함)
해결방안
// 방법1
function solution(i, j, k) {
let s = '';
for(i; i<=j; i++){
s+=i
}
return s; // 12345678910111213
return s.split(k); // ["","23456789","0","","","2","3"]
return s.split(k).length; // 7
return s.split(k).length - 1; // 6
}
Array, fill
Array(j) // [empty x 13]
Array(j-i) // [empty x 12]
Array(j-i+1) // [empty x 13] -> Array개수에 맞춰서 생성됨
// 1부터 시작해서 13에서 끝내야 됨 [1, ..., 13]
Array(j-i+1).fill(i) // [1, ..., 1]
Array(j-i+1).fill(i).map((v, idx)=>v+idx) // [1, ..., 13]
Array(j-i+1).fill(i).map((v, idx)=>v+idx).join(''); // "12345678910111213"
Array(j-i+1).fill(i).map((v, idx)=>v+idx).join('').split(k).length - 1; // 6
소스 코드
// 방법1
function solution(i, j, k) {
let s = '';
for(i; i<=j; i++){
s+=i
}
return s.split(k).length - 1;
}
// 방법 2
function solution(i, j, k) {
return Array(j-i+1).fill(i).map((v, i)=>v+i).join('').split(k).length - 1;
}
가까운 수_23번째
문제
https://school.programmers.co.kr/learn/courses/30/lessons/120890
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
정수 배열 array와 정수 n이 매개변수로 주어질 때,
array에 들어있는 정수 중 n과 가장 가까운 수를 return 하도록 solution 함수를 완성해주세요.
해결방안
전역 속성 Infinity은 무한대를 나타내는 숫자 값입니다.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Infinity
Infinity - JavaScript | MDN
The global property Infinity is a numeric value representing infinity.
developer.mozilla.org
function solution(array, n) {
let min = Infinity; // 무한대의 수
let result = 0;
for(let i of array) {
// 두수의 차(n-i)가 min보다 작으면
if(Math.abs(n-i) < min){ // Math.abs: 절대값
min = Math.abs(n-i) // n-i를 min에 대입
result = i;
}
}
return result;
}
이렇게만 쓰면 테스트 5번이 실패가 뜸
이유. "가장 가까운 수가 여러 개일 경우 더 작은 수를 return 합니다."라는 조건이 있어서
function solution(array, n) {
let min = Infinity;
let result = 0;
for(let i of array.sort()) {
if(Math.abs(n-i) < min){
min = Math.abs(n-i)
result = i;
}
}
return result;
}
그래서 미리 정렬을 해줘야 된다.
소스 코드
function solution(array, n) {
let min = Infinity;
let result = 0;
for(let i of array.sort()) {
if(Math.abs(n-i) < min){
min = Math.abs(n-i)
result = i;
}
}
return result;
}