Post

JS 알고리즘 입문 20문제 (100문제 완료)

JS 알고리즘 입문 20문제 (100문제 완료)

1. 외계어 사전

1
2
3
4
5
6
7
function solution(spell, dic) {
    const spellStr = spell.sort().join("");    
    for(let str of dic) {
        if(str.split("").sort().join("").includes(spellStr)) return 1;
    }
    return 2;
}

2. 종이 자르기

1
2
3
4
5
class Solution {
    public int solution(int M, int N) {
        return (M-1) + (N-1) * M;
    }
}

3. 직사각형 넓이 구하기

1
2
3
4
function solution(dots) {
    dots.sort((a,b) => a[0] - b[0]);
    return Math.abs((dots[0][1] - dots[1][1]) * (dots[2][0] - dots[1][0]));
}

4. 로그인 성공?

1
2
3
4
5
6
7
8
9
10
function solution(id_pw, db) {    
    for(let value of db) {
        if(value[0] == id_pw[0] && value[1] == id_pw[1]) {
            return "login"
        } else if (value[0] == id_pw[0] && value[1] !== id_pw[1]) {
            return "wrong pw"
        }
    }
    return "fail";
}

5. 치킨 쿠폰

1
2
3
4
5
6
7
8
function solution(chicken) {
    var answer = 0
    while (chicken > 9) {
        answer += parseInt(chicken / 10)
        chicken = parseInt(chicken / 10) + chicken % 10;
    }
    return answer;
}

6. 등수 매기기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function solution(score) {
    var answer = new Array(score.length).fill(0);
    const average = [];
    
    for(let idx in score) {
        average.push([Number(idx), (score[idx][0] + score[idx][1]) / 2])
    }
    average.sort((a,b) => b[1] - a[1]);
    
    let curRank = 1;
    for(let i = 0 ; i < average.length ; i++) {
        if(i > 0 && average[i][1] == average[i-1][1]) {
            answer[average[i][0]] = answer[average[i-1][0]]
        } else {
            answer[average[i][0]] = curRank;
        }
        curRank++;
    }
    return answer;
}

// 다른 사람 풀이
function solution(score) {
    let avg = score.map(v=>(v[0]+v[1])/2);
    let sorted = [...avg].sort((a,b)=>b-a);
    return avg.map(v=>sorted.indexOf(v)+1);
}

7. 저주의 숫자 3

1
2
3
4
5
6
7
8
9
10
11
12
function solution(n) {
    let answer = 1;
    let count = 1;
    
    while (count < n) {
        answer++; 
        if (!answer.toString().includes("3") && answer % 3 !== 0) {
            count++;
        }
    }
    return answer;
}

8. 다음에 올 숫자

1
2
3
4
5
6
7
function solution(common) {
    if(common[1] - common[0] == common[common.length-1] - common[common.length-2]) {
        return common[common.length-1] + (common[1] - common[0])
    } else {
        return common[common.length-1] * (common[1] / common[0])
    }
}

9. 최빈값 구하기

1
2
3
4
5
6
7
8
9
10
11
function solution(array) {
    var answer = 0;
    const cntObj = {}
    
    for(let i = 0 ; i < array.length ; i++) {
        cntObj[array[i]] = (cntObj[array[i]] || 0) + 1;
    }
    
    const sorted = Object.entries(cntObj).sort((a, b) => b[1] - a[1]); // entries : 객체를 배열로 변환
    return (sorted.length > 1 && sorted[0][1] === sorted[1][1]) ? -1 : Number(sorted[0][0]);
}

10. 유한소수 판별하기

1
2
3
4
5
6
7
8
9
10
11
12
13
function solution(a, b) {
    function gcd(x, y) {
        return y === 0 ? x : gcd(y, x % y);
    }
    
    let g = gcd(a, b);
    b /= g;
    
    while (b % 2 === 0) b /= 2;
    while (b % 5 === 0) b /= 5;
    
    return b === 1 ? 1 : 2;
}

11. 문자열 밀기

1
2
3
4
function solution(A, B) {
    if(A == B) return 0;
    return (B + B).indexOf(A);
}

12. 특이한 정렬

1
2
3
4
5
function solution(numlist, n) {
    const close = numlist.map(el => el - n);
    const sorted = [...close].sort((a,b) => Math.abs(a)-Math.abs(b) || b - a);
    return sorted.map((el) => numlist[close.indexOf(el)]);
}

13. 다항식 더하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function solution(polynomial) {
    var answer = ''
    const polyArr = polynomial.split(" + ");
    
    let x = 0;
    let num = 0;
    for(let p of polyArr) {
        if(p.includes("x")) {
            x += Number(p.split("x")[0]) || 1
        } else {
            num += Number(p)
        }
    }
    
    if (x > 0) answer += (x === 1 ? "x" : x + "x");
    if (num > 0) answer += (answer ? " + " : "") + num;
    
    return answer;
}

14. OX 퀴즈

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function solution(quiz) {
    var answer = [];
    
    for(let q of quiz) {
        const[a, op, b, eq, ans] = q.split(" ");
        if(op == "+" && Number(a) + Number(b) == Number(ans)) {
            answer.push("O");
        } else if(op == "-" && Number(a) - Number(b) == Number(ans)) {
            answer.push("O");
        } else {
            answer.push("X")
        }
    }
    return answer;
}

15. 연속된 수의 합

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function solution(num, total) {
    var answer = []; 
    let sum = (num * (num + 1)) / 2;
    let start = 1;

    while(sum !== total) {
        if(sum < total) {
            sum -= start++;
            sum += (start + num - 1);
        } else {
            sum -= (start + num - 1);
            sum += --start;
        }
    }      
    for (let i = 0; i < num; i++) {
        answer.push(start + i);
    }
    return answer;
}

16. 분수의 덧셈

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function solution(numer1, denom1, numer2, denom2) {
    var answer = [];
    function gcd(x, y) {
        return y === 0 ? x : gcd(y, x % y);
    }
    let lcm = (denom1 * denom2) / gcd(denom1, denom2);
    let numerator = numer1 * (lcm / denom1) + numer2 * (lcm / denom2);

    // 기약분수로 변환하기 위한 최대공약수 계산
    let commonGCD = gcd(numerator, lcm);
    
    // 기약분수로 나누기
    numerator /= commonGCD;
    lcm /= commonGCD;
    
    answer.push(numerator);
    answer.push(lcm); 
    
    return answer;
}

17. 안전지대

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function solution(board) {
    var answer = 0;
    let n = board.length;

    let dx = [0, 1, 1, 1, 0, -1, -1, -1]
    let dy = [-1, -1, 0, 1, 1, 1, 0, -1]

    for (let x = 0; x < n; x++) {
        for (let y = 0; y < n; y++) {
            if (board[x][y] === 1) {
                for (let i = 0; i < 8; i++) {
                    const newX = x + dx[i];
                    const newY = y + dy[i];

                    if (newX >= 0 && newX < n && newY >= 0 && newY < n && board[newX][newY] === 0) {
                        board[newX][newY] = 2;
                    }
                }
            }
        }
    }
    
    answer = board.map(row => row.filter(value => value === 0).length).reduce((a, c) => a + c, 0)

    return answer;
}

18. 겹치는 선분의 길이

1
2
3
4
5
6
7
8
9
10
function solution(lines) {
    let arr = new Array(201).fill(0);
    
    for (let [start, end] of lines) {
        for (let i = start; i < end; i++) {
            arr[i + 100]++;
        }
    }
    return arr.filter(v => v > 1).length;
}

19. 평행

1
2
3
4
5
6
7
8
9
10
11
12
13
function solution(dots) {
    const [[x1, y1], [x2, y2], [x3, y3], [x4, y4]] = dots;
    
    function isParallel(x1, y1, x2, y2, x3, y3, x4, y4) {
        return (y2 - y1) * (x4 - x3) === (y4 - y3) * (x2 - x1);
    }

    if (isParallel(x1, y1, x2, y2, x3, y3, x4, y4)) return 1;
    if (isParallel(x1, y1, x3, y3, x2, y2, x4, y4)) return 1;
    if (isParallel(x1, y1, x4, y4, x2, y2, x3, y3)) return 1;

    return 0;
}

20. 옹알이(1)

1
2
3
4
5
6
7
8
9
10
11
function solution(babbling) {
    let answer = 0;
    for(let b of babbling) {
        let str = b;
        for (const i of ["aya", "ye", "woo", "ma"]){
            str = str.replaceAll(i, "1");
        }
        if (/^[1]+$/.test(str)) answer += 1; // "1"로만 이루어진 경우 카운트
    }
    return answer;
}

머쓱이 스탬프 - 입문

드디어 매일 20문제에서 벗어났다 ,,
하루에 20문제를 풀어야하니깐 마지막 쯤엔 집중력이 너무 바닥나고 문제도 어려워져서 다른 사람들 코드를 많이 참고했다.
몰랐던 문법들 정리하고 내일부턴 한문제 한문제 제대로 풀어봐야지 !


END

This post is licensed under CC BY 4.0 by the author.