알고리즘 - 테스트

이한결·2023년 2월 2일
0

부트 캠프

목록 보기
36/98
post-thumbnail

2월 2일 여정 25일차이다.

오늘은 그토록 기다리던 항해 99 알고리즘 테스트보는 날이었다. 다행히 잘 풀어서 테스트는 합격했다. ㅎㅎ
내가 풀은 문제를 여기에 공유하겠다.

오늘의 Today I Learned

1번 문제

나의 코드

function solution(num) {
    let change = 1000 - num;
    let count = 0;

    while (change !== 0) {
        if (change >= 500) change = change - 500;
        else if (change >= 100) change = change - 100;
        else if (change >= 50) change = change - 50;
        else if (change >= 10) change = change - 10;
        else if (change >= 5) change = change - 5;

        count++;
    }

    return count;
}
let num1 = 160;
console.log(solution(num1));

전날에 힌트로 준 백준 문제와 거의 동일했다. 덕분에 어렵지 않게 풀 수 있었다.

1000엔에서 물건 값을 뺀 후에, 남은 잔돈이 0원이 될 때까지 계속 빼는 것이다.

2번 문제

나의 코드

 function solution(str) {
    let count = 0;
    let sum = 0;

    for (let i = 0; i < str.length; i++) {
        if (str[i] === 'O') {
            count++;
        } else if (str[i] === 'X') {
            count = 0;
        }
        sum += count;
    }

    return sum;
}
let str = 'OXOOOXXXOXOOXOOOOOXO';
console.log(solution(str));

이 문제 역시 그 전날 준 힌트와 거의 동일하였다.
for문을 돌려서 O일 경우 count가 올라가고 x일 경우, 0으로 초기화가 된다.

3번 문제

나의 코드

function solution(N, arr) {
    let answer = 0;
    let arn = Array.from({ length: N }, () => Array(N).fill(0));
    let n = N;
    let x = [1, -1, 0, 0, 1, 1, -1, -1];
    let y = [0, 0, 1, -1, 1, -1, 1, -1];
    for (let i = 0; i < n; i++) {
        let num = 0;
        for (let j = 0; j < n; j++) {
            for (let k = 0; k < 8; k++) {
                let directx = i + x[k];
                let directy = j + y[k];
                if (directx >= 0 && directx < n && directy >= 0 && directy < n && arr[directx][directy] !== '.') {
                    num += Number(arr[directx][directy]);
                }
                if (directx >= 0 && directx < n && directy >= 0 && directy < n && Number(arr[i][j])) {
                    arn[i][j] = '*';
                }
            }
            if (num > 0 && num < 10 && isNaN(arr[i][j])) arn[i][j] += num;
            else if (num > 0 && num >= 10 && isNaN(arr[i][j])) arn[i][j] = 'M';
            num = 0;
        }
    }
    return arn;
}
let N = 5;
let arr1 = [
    ['1', '.', '.', '.', '.'],
    ['.', '.', '3', '.', '.'],
    ['.', '.', '.', '.', '.'],
    ['.', '4', '.', '.', '.'],
    ['.', '.', '.', '9', '.'],
];
console.log(solution(N, arr1));

이 문제는 가장 어려운 문제였다.
이중배열에서 4방향 탐색을 배웠지만, 그럼에도 응용을 하는 부분이 있어서 푸는데 애를 먹었다.

  1. arn변수에 NxN개 만큼의 배열에 0을 채워 선언과 동시에 초기화를 한다.

  2. 변수 n에는 N의 값을 담아놓는다.

  3. 내가 탐색하고자하는 x축 y축 방향을 담아 놓는다. (총 상하좌우대각선방향 7가지이다.)

  4. 2중 for문을 돌려 이중배열을 탐색한다.

  5. 마지막 for문으로 7방향을 탐색한다. (총 3중 for문이다... ㄷㄷ)

  6. 내가 현재 있는 위치에서 x와 y만큼 더한다.
    => 내가 있는 곳이 arr[1]][1]이면 위 방향은 arr[0][1]이 된다. 그러면 x= [-1], y = [0]만큼 가야한다.

  7. if문에서 밑에 부분은 인덱스 밖으로 나가서 탐색하는 것을 방지하려고 조건을 달아놓았다.

    directx >= 0 && directx < n && directy >= 0 && directy < n
  8. 만약 지뢰가 없는 부분이면 주변 탐색 후 주변의 숫자를 더한다.

  9. 나 자신이 숫자라면 그곳은 지뢰이기 때문에 '*'로 표시해놓는다.

  10. 0초과 10미만이며 나 자신이 숫자가 아니면 지뢰가 없는 곳에 더한 숫자를 넣는다.

  11. 0초과 10이상이며, 나 자신이 숫자가 아니면 Many의 'M'을 넣는다.

  12. 마지막 완성된 배열을 리턴한다.

profile
평범한 삶을 위하여

0개의 댓글