본문 바로가기

Hanghae99

221123 TIL 알고리즘 문제풀이 4

[33번 로또의 순위]

나의 풀이

단순하지만 깔끔한 방법... ㅋㅋ

function solution(lottos, win_nums) {
    var answer = [];
    
    let numsBest = 0;
    
    let numsWorst = 0;
    
    for (let i = 0; i < 6; i++) {
        for (let j = 0; j < 6; j++) {
            if (lottos[i] === win_nums[j]) {
            numsBest += 1;
            numsWorst += 1;
        };
        };
        
        if (lottos[i] === 0) {
            numsBest += 1;
        };
    };
    
    switch (numsBest) {
            case 6:
            answer.push(1);
            break;
        case 5:
            answer.push(2);
            break;
        case 4:
            answer.push(3);
            break;
        case 3:
            answer.push(4);
            break;
        case 2:
            answer.push(5);
            break;
        case 1:
            answer.push(6);
            break;
        case 0:
            answer.push(6);
            break;
    };
    
    switch (numsWorst) {
            case 6:
            answer.push(1);
            break;
        case 5:
            answer.push(2);
            break;
        case 4:
            answer.push(3);
            break;
        case 3:
            answer.push(4);
            break;
        case 2:
            answer.push(5);
            break;
        case 1:
            answer.push(6);
            break;
        case 0:
            answer.push(6);
            break;
    };
    
    return answer;
}

참고할만한 풀이

function solution(lottos, win_nums) {
	// 순위 배열을 만들어 둔다.
    const rank = [6, 6, 5, 4, 3, 2, 1];

	// include를 사용하여 교집합을 구하고 filter로 재구성한다.
    // 그리고 length로 갯수를 센다
    let minCount = lottos.filter(v => win_nums.includes(v)).length;
    let zeroCount = lottos.filter(v => !v).length;

    const maxCount = minCount + zeroCount;

	// rank[index]를 이용해 배열의 원소를 추출한다.
    return [rank[maxCount], rank[minCount]];
}

 

[36번 문자열 내림차순으로 배열하기] - 다시 풀이

정렬 메소드가 왜 작동을 안할까? -> sort 메소드는 배열 메소드이기때문에 

=> sort에 함수식을 더했더니 정렬이 되었다.

런타임에러? => 처음에 정규식을 사용해 풀었더니 런타임 에러가 발생하였다. 정규식표현은 사실살 필요가 없었고 sorting하니 대문자까지 정렬이 되었다.

 

나의 풀이 => 런타임에러 발생

function solution(s) {

	// 정규식 표현을 사용하여 조건에 맞는 문자를 추출하고 내림차순으로 정렬하였다.
    // 그리고 join으로 합쳤다.
    let sLower = s.match(/[a-z]/g).sort(function (a, b) {
        if (a > b) return -1;
        else if (b > a) return 1;
        else return 0;
    }).join('');
    
    let sUpper = s.match(/[A-Z]/g).sort(function (a, b) {
        if (a > b) return -1;
        else if (b > a) return 1;
        else return 0;
    }).join('');
    
    return sLower + sUpper
    
}

 

정규식 표현

https://curryyou.tistory.com/234

 

[자바스크립트] 정규표현식(Regular Expression) 기초/기본 쉽고 상세한 사용 방법 정리(샘플 예제 코

# 정규표현식이란?(Regular Expression: Regex) 정규표현식은 "특정 패턴의 문자열"을 찾기 위한 표현 방식입니다. (이런걸 형식 언어, formal languange라고 합니다.) 정규표현식을 이용하면, 특정 패턴에 매

curryyou.tistory.com

다시 푼 나의 풀이

function solution(s) {
    
    // split으로 배열로 만들어준 후 sort식을 사용하여 내림차순으로 정렬하니 대문자까지 정렬되었다.
    // 그 후 join('')을 사용하여 문자열로 변환하였다.
   return s.split('').sort(function (a, b) {
        if (a > b) return -1;
        else if (b > a) return 1;
        else return 0;
    }).join('')
    
}

 

[37번 소수판별식]

나의 풀이

function solution(nums) {
    var answer = 0;
    
    let sumArr = [];
    
    // 3중 for 문을 사용할때 중복되지 않도록 하려면 initial 값을 같지 않도록 바꿔주면 된다.
    for (let i = 0; i < nums.length; i++) {
        for (let j = i + 1; j < nums.length; j++) {
            for (let k = j + 1; k < nums.length; k++) {
                if (i !== j && i !== k && j !== k) {
                    sumArr.push(nums[i] + nums[j] + nums[k])
                };
            };
        };
    };
    
    let sumArrSorted = sumArr.sort()
    
    // for문으로 반복하며 소수판별을 해주었다.
    for (let l = 0; l < sumArrSorted.length; l++) {
                                 
        function isPrime(x) {
            if (x === 2) {
                return true;
            };
            
            // 소수판별에는 제곱근까지만 나누어주는 방법을 사용했다.
            // 조금 복잡하지만 속도가 빠르다.
            for (let m = 2; m <= Math.floor(Math.sqrt(x)); m++) {
                if (x % m === 0) {
                    return false;
                };
            };
            
            return true
        };
        
        if (sumArrSorted[l] !== 1 && isPrime(sumArrSorted[l]) === true ) {
            answer += 1
        };
            
        };
    
    return answer / 6;
}

 

소수 판별식

https://ant-programmer.tistory.com/2

 

[JavaScript] 소수 판별식

소수(Prime Number)를 판별하는데 여러가지 방법이 있는데 오늘은 내가 알고리즘 공부를 하면서 직접 찾아본 세 가지 방법을 정리하려한다. 1) 직접 나누어서 계산하기 2) N/2 까지만 나누어서 계산하

ant-programmer.tistory.com

 

[20번 완주하지 못한 선수] - 다시 풀이

나의 풀이

function solution(participant, completion) {
    var answer = '';
    
    // 먼저 배열들을 정렬해준다.
    let partSorted = participant.sort()
    let compSorted = completion.sort()
    
    // 정렬된 배열의 각 인덱스를 비교한다.
    // 주의할 점은 이 문제에 "completion의 길이는 participant의 길이보다 1 작습니다."
    // 이러한 조건이 있기 때문에 가능하다는 것이다.
    // 중복검사는 따로 필요가 없다.
    for (let i = 0; i < partSorted.length; i++) {
        if (partSorted[i] !== compSorted[i]) {
            return partSorted[i]
        };
    };
}

 

[21번 이상한 문자 만들기] - 다시 풀이

나의 풀이

function solution(s) {
    let answer = '';
    
    // split으로 단어를 잘라 배열을 만들어주었다.
    let sSpl = s.split(' ')
    
    let sSpl2 = [[]]
    
    // 2차원 배열의 형태로 짝,홀수번째의 경우에 따라 대/소문자로 변환해주었다.
    for (let i = 0; i < sSpl.length; i++) {
        sSpl2[i] = [];
        
        for (let j = 0; j < sSpl[i].length; j++) {
            if (j % 2 === 0) {
                sSpl2[i].push(sSpl[i][j].toUpperCase())
            } else {
                sSpl2[i].push(sSpl[i][j].toLowerCase())
            };
        };
        
        // 아래와 같이 if문을 적용해도 마지막에 공백(' ')이 추가되지 않는다.
        /*if (i < sSpl.length - 1) {
            sSpl2[i].push(' ')
        };*/
    };
    
    // 배열들의 값을 새로운 문자열로 저장해주었다.
    for (let k = 0; k < sSpl2.length; k++) {
        for (let l = 0; l < sSpl2[k].length; l++) {
            answer += sSpl2[k][l]
        };
        // k번째 배열의 작업이 끝나면 공백(' ')이 저장되도록 하였다.
        // 이렇게 하면 마지막에 공백이 추가로 붙는다. 이것을 제거해주어야 한다.
        answer += ' '
    };
    
    // substr 메소드를 통해 처음부터 마지막 문자열(공백' ')전까지의 문자열을 추출해주었다.
    return answer.substr(0, answer.length - 1)
}

 

push 메소드는 배열 함수이기 때문에 문자열에 작동하지 않는다. sort 또한 마찬가지이다.
splice 를 쓰면 시간이 상당히 오래걸리는데 왜일까? - 시간복잡도에 상관있을수도 있다.

 

[30번 최소직사각형] - 다시 풀이

나의 풀이

function solution(sizes) {
    var answer = 0;
    
    let maxSizes = [];
    let minSizes = [];
    
    // 배열을 만들어 2차 배열에서 최대값과 최소값을 각각의 배열에 넣어준다.
    // Math.max를 사용하기 위해 Function.prototype.apply() 를 사용하였다.
    // 전개연산자(spread operator)도 사용해보았다.
    for (let i = 0; i < sizes.length; i++) {
        maxSizes.push(Math.max(...sizes[i]));
        minSizes.push(Math.min(...sizes[i]));
        };
    
    /*let maxSorted = maxSizes.sort(function (a, b) {
        if (a > b) return -1;
        else if (b > a) return 1;
        else return 0});
    
    let minSorted = minSizes.sort(function (a, b) {
        if (a > b) return -1;
        else if (b > a) return 1;
        else return 0});
        
    return maxSorted[0] * minSorted[0];*/
    
    // 좀더 간결한 코드를 위해 아래와 같이 바꿔보았다.
    let maxSorted = Math.max(...maxSizes)
    let minSorted = Math.max(...minSizes)
    
    return maxSorted * minSorted;
}

 

배열에서 최대값/최소값 구하기

https://hianna.tistory.com/487

 

[Javascript] 배열에서 최대값, 최소값 구하기

Javascript 배열의 여러 원소들 중 최대값, 최소값을 구하는 방법을 정리합니다. 1. Math.max(), Math.min() 소개 2. Function.prototype.apply() 사용하기 3. Spread Operator(전개 연산자) 사용하기 1. Math.max(), Math.min()

hianna.tistory.com

[38번 숫자 문자열과 영단어]

나의 풀이

 

function solution(s) {
    
    // replace는 첫번째 인자에 해당하는 문자열을 두번째 인자로 변환해준다.
    // replace는 조건에 맞는 가장 첫번째 문자열만을 변환해주기 때문데 /문자/g 의 정규표현식을 사용하여 모든 문자열을 검사해줄수 있다.
    // 문자열로 출력이 되기때문에 Number()로 감싸 숫자로 변환해주었다.
    return Number(s
                .replace(/zero/g,'0')
                .replace(/one/g,'1')
                .replace(/two/g,'2')
                .replace(/three/g,'3')
                .replace(/four/g,'4')
                .replace(/five/g,'5')
                .replace(/six/g,'6')
                .replace(/seven/g,'7')
                .replace(/eight/g,'8')
                .replace(/nine/g,'9')
                  );
}

 

모든 문자열 치환하기

https://hianna.tistory.com/343

 

[Javascript] 모든 문자열 치환하기 (replace, replaceAll)

Javascript에서 문자열을 치환하기 위해서 replace() 함수를 사용하는 방법을 알아보았습니다. 그런데, replace() 함수는 문자열에서 변경하려는 문자열이 여러 번 반복될 경우, 첫 번째로 발견한 문자

hianna.tistory.com

 

알고리즘 추가문제

https://docs.google.com/spreadsheets/d/1-Q7sCRa61BGol1D0-3ta-Uily0MI4LZkaAbGVc0MvAQ/edit#gid=0

'Hanghae99' 카테고리의 다른 글

221125 TIL React 입문 주차 1  (0) 2022.11.25
221124 TIL 알고리즘 문제풀이 5  (0) 2022.11.24
221122 TIL 알고리즘 문제풀이 3  (0) 2022.11.22
221121 TIL 알고리즘 문제풀이 2  (0) 2022.11.22
221120 WIL 항해99 1주차 회고  (0) 2022.11.21