programmers

코딩 테스트 / 안전지대, 겹치는 선분의 길이

이미사용 2023. 6. 5. 12:40
명언
-
728x90
반응형

안전지대

※풀이

1. 보드의 크기인 n을 구합니다. board.length를 통해 구할 수 있습니다.
2. 위험 영역을 탐색하기 위해 상대적인 좌표 차이를 저장하는 d 배열을 생성합니다. 각 요소는 [행의 변화량, 열의 변화량]을 나타냅니다.
3. 위험 영역을 저장할 dangerZone이라는 빈 Set을 생성합니다.
4. 이중 반복문을 사용하여 보드를 탐색합니다.
· board[i][j] === 1인 경우, 현재 위치가 위험 영역임을 나타냅니다.
· d 배열의 각 요소에 대해서, 현재 위치에서 변화량을 더한 새로운 위치 [col, row]를 계산합니다.
· 새로운 위치 [col, row]가 보드 내에 있는 경우, 해당 위치를 dangerZone Set에 추가합니다.
5. n*n에서 dangerZone의 크기를 뺀 값을 반환합니다. 

 

 

ex1)

    {
        function solution(board) {
            const n = board.length
            const d = [
                [0, 0],
                [0, 1],
                [0, -1],
                [1, 1],
                [1, 0],
                [1, -1],
                [-1, -1],
                [-1, 0],
                [-1, 1],
            ]
            let dangerZone = new Set()
            for (let i = 0; i < n; i++){
                for (let j = 0; j < n; j++){
                    if (board[i][j] === 1){
                        d.forEach(v =>{
                            let [col, row] = [i + v[0], j + v[1]]
                            if (col >= 0 && col < n && row >=0 && row < n){
                                dangerZone.add(col + " " + row)
                            }
                        })
                    }
                }
            }
            return n*n - dangerZone.size
        }
        console.log(solution([[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 1, 0, 0], [0, 0, 0, 0, 0]]));
        //16
    }

 

ex2)

    {
        function solution(board) {
            const n = board.length
            const d = [
                [0, 0],
                [0, 1],
                [0, -1],
                [1, 1],
                [1, 0],
                [1, -1],
                [-1, -1],
                [-1, 0],
                [-1, 1],
            ]
            let dangerZone = new Set()
            for (let i = 0; i < n; i++){
                for (let j = 0; j < n; j++){
                    if (board[i][j] === 1){
                        d.forEach(v =>{
                            let [col, row] = [i + v[0], j + v[1]]
                            if (col >= 0 && col < n && row >=0 && row < n){
                                dangerZone.add(col + " " + row)
                            }
                        })
                    }
                }
            }
            return n*n - dangerZone.size
        }
        console.log(solution([[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 1, 1, 0], [0, 0, 0, 0, 0]]));
        //13
    }

 

겹치는 선분의 길이

※풀이

1. 길이가 200인 배열 line을 생성하고 모든 요소를 0으로 초기화합니다. 이 배열은 -100부터 99까지의 인덱스를 가지며, 각 인덱스는 해당 위치에서 겹치는 직선들의 개수를 나타냅니다.
2. lines 배열을 순회하면서 각 직선의 범위에 대해 작업을 수행합니다.
· 시작점 min부터 끝점 max 직전까지 반복문을 실행합니다.
· line[min+100]의 값을 1 증가시킵니다. 이는 현재 위치 min에서 직선과 겹치는 개수를 나타냅니다.
3. line 배열에서 값이 1보다 큰 요소들을 필터링하고, 그 개수를 반환합니다.

 

ex1)

    {
        function solution(lines) {
            let line = new Array(200).fill(0)
            lines.forEach(([min, max]) => {
                for (; min < max; min++){
                    line[min+100]++
                }
            })
            return line.filter(v => v > 1).length;
        }
        console.log(solution([[0, 1], [2, 5], [3, 9]]));
        //2
    }

ex2)

    {
        function solution(lines) {
            let line = new Array(200).fill(0)
            lines.forEach(([min, max]) => {
                for (; min < max; min++){
                    line[min+100]++
                }
            })
            return line.filter(v => v > 1).length;
        }
        console.log(solution([[-1, 1], [1, 3], [3, 9]]));
        //0
    }

 

 

출처:https://school.programmers.co.kr/