문자열 다루기 기본,

김민준·2023년 12월 5일

코드테스트

목록 보기
14/37
post-thumbnail

문자열 다루기 기본
카펫

공부하며 느낀 점
참조한 페이지

문자열 다루기 기본

나의 풀이

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')) : 10310^3같은 지수를 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]
            }
        }
    }

}

시간 복잡도는 이것이 O(yellow)O(\sqrt{yellow}) 로 훨씬 낮지만 어짜피 절반 또는 절반을 지나치기전에 답이 나오기 때문에 오히려 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;
}
  • 2차 방정식의 일반해를 구하는 (b + √(b² - 4ac)) / 2 일명 근의 공식을 응용하고
  • 갈색 모서리의 갯수는 4개 고정 그리고 최소값이 8인것을 응용한것같긴한데 정확히 무슨 수학적 과정을 통해 나왔는지는 모르겠다.

속도 비교

특별할것 없는 결과가 나왔다.

예상외의 결과가 나왔다.

제곱근을 넘기기전에 답이 나올것이라고 생각했는데 실제로는 O(yellow)O(\sqrt{yellow})를 쓴쪽이 훨씬 좋은 성능을 냈다.
이런류의 알고리즘을 짤때는 제곱근(정확히는 방정식의 해)의 범위를 잘 고려해야겠다.

공부하며 느낀 점

  1. 같은 결과를 낸다면 범위를 무조건 좁혀야한다.

참조한 페이지

최대 공약수 구하기
JavaScript로 최대공약수(GCD), 최소공배수(LCM) 구하기

정수 확인
Number.isInteger() - 값이 정수인지 체크

profile
node 개발자

0개의 댓글