제주코딩베이스캠프 유튜브 - JavaScript 알고리즘 100일 챌린지

팩토리얼

i팩토리얼 (i!)은 1부터 i까지 정수의 곱 ex) 5! = 5 * 4 * 3 * 2 * 1 = 120 

정수 n이 주어질 때 다음 조건을 만족하는 가장 큰 정수 i를 구하기

function solution(n) {
	let i = 1;
	let factorial = 1;
	while (factorial <= n) {
		i += 1;
		factorial *= i;
	} 
	// factorial === n일경우도 실행되기때문에 i-1 리턴
	return i -  1; 
}

k의 개수

정수 i, j, k가 매개변수로 주어질 때, i부터 j까지 k가 몇 번 등장하는지 구하기 ex)k = 1 일때 10에서 1개, 11에서 2개, 12에서 1개, 13에서 1개 총 6번

function solution(i, j, k) {
	//i = 1, j = 13, k = 1
	let s = '';
	for(i; i <= j; i++) {
			s+=i
	}
	
	return s
	// 12345678910111213
	.split(k)
	//["","23456789","0","","","2","3"] 
	.length // 7
	.length - 1; // 6
}

또는

function solution(i, j, k) {
	//i = 1, j = 13, k = 1
	return Array(j - i + 1)
	// i부터 j까지 갯수의 empty Array 생성
	.fill(i) // [1, ..., 1]
	.map((v, idx) => v + idx) // [1, ..., 13]
	.join('') // "12345678910111213"
	.split(k) // filter or split
	.length - 1; // 6
}

가까운 수

정수 배열 array와 정수 n이 매개변수로 주어질 때,  array에 들어있는 정수 중 n과 가장 가까운 수 구하기

단, 가장 가까운 수가 여러개일 경우 더 작은 수 return

function solution(array, n) { 
	let minDiff = Infinity;
	let result = 0;
	
	array.sort((a, b) => a - b);
	
	for (let i of array) { 
	// 음수는 거리 비교를 할 수 없기때문에 절대값으로 구해야 함
	if (Math.abs(n - i) < minDiff) { 
		 minDiff = Math.abs(n - i); 
		 result = i; 
		}
	}
	return result; 
 }

한번만 등장한 문자

s에서 한 번만 등장하는 문자를 구하고 사전 순으로 정렬하기

// split
function solution(s) {
	return [...s]
	.filter(char => s.split(char).length === 2)
	.sort()
	.join('');
}
// 정규표현식, match
function solution(s) {    
	return [...s]
	.filter(char => s.match(new RegExp(char, 'g')).length === 1)
	// 숫자를 포함하지 않은 문자열일때만 sort() 
	.sort()
	.join('');
}

잘라서 배열로 저장하기

my_str을 길이 n씩 잘라서 저장한 배열 구하기

function solution(my_str, n) {
	return my_str.match(new RegExp(`.{1,${n}}`, 'g'));
}
function solution(my_str, n) {
	let result = [];
	for(let i = 0; i < my_str.length; i += n) {
		result.push(my_str.slice(i, i + n))
	}
	return result;
}

진료순서 정하기

정수 배열 emergency가 매개변수로 주어질 때  응급도가 높은 순서대로 진료 순서 배열을 구하기

function solution(emergency) { 
	let 응급순서 = emergency.slice().sort((a, b) => b - a);
	return emergency.map(v => 응급순서.indexOf(v) + 1);
}

영어가 싫어요

문자열 numbers가 매개변수로 주어질 때,  numbers를 정수로 바꾸기

function solution(numbers) {
	return +numbers
		.replaceAll('zero', '0')
		.replaceAll('one', '1')
		.replaceAll('two', '2')
		.replaceAll('three', '3')
		.replaceAll('four', '4')
		.replaceAll('five', '5')
		.replaceAll('six', '6')
		.replaceAll('seven', '7')
		.replaceAll('eight', '8')
		.replaceAll('nine', '9');
}
function solution(numbers) {
	const obj = {
		zero: 0,
		one: 1,
		two: 2,
		three: 3,
		four: 4,
		five: 5,
		six: 6,
		seven: 7,
		eight: 8,
		nine: 9,
	}
	
	return +numbers.replace(/zero|one|two|three|four|five|six|seven|eight|nine/g, (v)=> obj[v])
}

외계어 사전

알파벳이 담긴 배열 spell과 외계어 사전 dic이 매개변수로 주어지고, spell에 담긴 알파벳을 한번씩만 모두 사용한 단어가 dic에 존재한다면 1, 존재하지 않는다면 2를 return

function solution(spell, dic) { 
	return dic.some((v) => [...v].sort().toString() === [...spell].sort().toString()) ? 1 : 2; 
}

문자열 밀기

문자열 A를 오른쪽으로 반복해서 밀어 B가 될 수 있다면 최소 횟수를, 안 되면 -1을 return

hello -> ohell : 1 
hello -> lohel : 2 
hello -> llohe : 3

A * 2 에서 B의 index를 찾고 A.length - B의 index를 비교해서 구할 수도 있지만

hellohello -> ohell : 4
hellohello -> lohel : 3
hellohello -> llohe : 2

B * 2에서 A의 index를 구할 수도 있다

ohellohell -> hello : 1
lohellohel -> hello : 2
llohellohe -> hello : 3
function solution(A, B) { 
	return (B + B).indexOf(A); 
}

좌표 이동 관련 추가 팁

[0, 0, 0, 0]
[0, 1, 0, 0] // 2번째 줄 1번 인덱스의 1을
[0, 0, 0, 0] // 3번째 줄 1번 인덱스의 1로
[0, 0, 0, 0]

이런 경우 1차원으로 만든 후 index의 값을 찾아 바꿔주면 됨.

[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

나 자신을 0으로 만들고, 4칸 이후에 있는 index값을 1로 바꿔주면 됨


컨트롤제트

숫자와 “Z”가 공백으로 구분되어 담긴 문자열이 s로 주어질때, 숫자를 순서대로 더하되, “Z”가 나오면 직전 숫자를 제외한 최종 합 구하기

function solution(s) { 
	s = s.split(' '); 
	let result = []; 
	for(let i of s) { 
		if(i === 'Z') { 
			result.pop(); 
		} else { 
			result.push(+i); 
		} 
	} 
	return result.reduce((a, c) => a + c, 0) 
}

비슷한 문제 풀 때 팁

"110Z3"

이렇게 주어지고 1~10까지의 숫자를 판단해야 되는 경우

  1. 정규식으로 1~10를 판단해 주거나
  2. 1 다음 0이 나오면 10이라는 것을 인식해 주면 됨 위 코드 그대로 쓰려면 0 나왔을때 pop + push 하거나
function solution(s) {
	s = s.match(/10|[1-9]|Z/g);
	let result = [];
	
	for (let i of s) {
		if (i === 'Z') {
			result.pop();
		} else {
			result.push(+i);
		}
	}
 
	return result.reduce((a, c) => a + c, 0);
}

아니면

function solution(s) { 
	s = s.split(''); 
	let result = []; 
	for(let i of s) { 
		if(i === 'Z') { 
			result.pop(); 
		} else if (+i === 0) {
			result.pop(); 
			result.push(10); 
		}	else { 
			result.push(+i); 
			 
		} 
	} 
	return result.reduce((a, c) => a + c, 0) 
}