
function sol0(s) {
const length = s.length
if (length !== 4 && length !== 6) {
return false
}
if (s.includes('e')) {
return false
}
let number = Number(s)
if (isNaN(number)) {
return false
}
return true
}
if (length !== 4 && length !== 6) : 길이 조건을 만족하지 않으면 떨어뜨린다.
if (isNaN(number)) : 숫자가 아니면 NaN이 반환된다.
if (s.includes('e')) : 같은 지수를 10e3 과 같은 형태로 나타낼 수 있다.
그래서 e가 있다면 걸러낸다.
function sol1(s){
var regex = /^\d{6}$|^\d{4}$/;
return regex.test(s);
}
/^\d{6}$|^\d{4}$/ 세개의 부분으로 나뉘어진다.
^\d{6}$ : 숫자 6회 반복| : or^\d{4}$ : 숫자 4회 반복
반복 횟수 100회 증가 정직하게 증가한다.

입력값 10배증가... 아무런 변화 없다.
참고로 10배 증가한 값을 처리하는 함수는 4,6 자리 제한이던걸 40,60자리 제한으로 바꾸기만했다.


위의 식에서
y : 한줄에 노란칸의 수
Y : 노란칸이 몇줄인지 나타내는 수
function sol0(brown, yellow) {
const fullCell = brown + yellow
for (let i = 1 ; i <= yellow ; i++) {
let j = yellow/i;
if (Number.isInteger(j)) {
const isFullCell = (i+2)*(j+2)
if (isFullCell === fullCell) {
return [j+2,i+2]
}
}
}
}
brown+yellow = (y+2)*(Y*2) = yY + 2Y + (y+2)*2 임을 이용한 풀이이다.
function sol1(brown, yellow) {
const fullCell = brown + yellow
for (let i = 1 ; i <= Math.sqrt(yellow) ; i++) {
let j = yellow/i;
if (Number.isInteger(j)) {
const isFullCell = (i+2)*(j+2)
if (isFullCell === fullCell) {
return [j+2,i+2]
}
}
}
}
시간 복잡도는 이것이 로 훨씬 낮지만 어짜피 절반 또는 절반을 지나치기전에 답이 나오기 때문에 오히려 Math.sqrt(yellow)를 계산하는 불필요한 과정이 들어있는 것으로 생각된다.
function sol1(brown, red) {
var answer = [];
for (var i = 3; i <= (brown+red)/i; i++) {
var x = Math.floor((brown+red)/i);
if( (x-2)*(i-2)=== red) {
break;
}
}
return [x,i];
}
나와 접근방법이 동일한 풀이 방식이다.
function sol2(brown, yellow) {
const x = (brown - 12) * 0.5;
const y = yellow - brown + 8;
const i = ( 8 + x + Math.sqrt( Math.pow(x, 2) - (4 * y) ) ) * 0.5;
const j = ( 8 + x - Math.sqrt( Math.pow(x, 2) - (4 * y) ) ) * 0.5;
console.log(i)
var answer = [i, j];
return answer;
}
(b + √(b² - 4ac)) / 2 일명 근의 공식을 응용하고
특별할것 없는 결과가 나왔다.

예상외의 결과가 나왔다.
제곱근을 넘기기전에 답이 나올것이라고 생각했는데 실제로는 를 쓴쪽이 훨씬 좋은 성능을 냈다.
이런류의 알고리즘을 짤때는 제곱근(정확히는 방정식의 해)의 범위를 잘 고려해야겠다.
최대 공약수 구하기
JavaScript로 최대공약수(GCD), 최소공배수(LCM) 구하기