Early Riser
생각정리
Early Riser
전체 방문자
오늘
어제
  • 분류 전체보기 (128)
    • JS (19)
    • React (33)
    • React Native (2)
    • Library, Tool (13)
    • CSS (2)
    • Algorithm (40)
    • Computer Science (3)
    • 회고 (3)
    • AI (13)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 글쓰기

공지사항

인기 글

태그

  • local minima
  • 비동기
  • javascript
  • js
  • 부스트캠프 합격 후기
  • 백준
  • lightgbm
  • 부스트캠프 합격
  • 완전탐색
  • useEffect
  • RNN
  • boosting
  • 부스트캠프 9기
  • dfs
  • 자바스크립트
  • BFS
  • 프로그래머스
  • 구현
  • 백트래킹
  • global minima
  • useState
  • 손실함수
  • 알고리즘
  • 논문리뷰
  • 딥러닝
  • 밑바닥
  • react
  • LGBM
  • 오늘의불경
  • 파이썬

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Early Riser

생각정리

백준 1987번: 알파벳(javascript, DFS, 백트래킹)
Algorithm

백준 1987번: 알파벳(javascript, DFS, 백트래킹)

2023. 4. 10. 15:26

말이 지날 수 있는 최대의 칸 수를 구하는 문제이다. 최대의 칸을 구해야 하기 때문에 단순 BFS가 아닌 완전탐색 혹은 백트래킹을 이용해 문제를 풀어야 하겠다고 생각했다. 왜냐하면 DFS나 BFS는 한번 방문한 곳은 다시 방문하지 않는데 이 때문에 방문경로에 따라 최대값이 달라지는 경우가 생기기 때문이다.

 

백트래킹 풀이를 위해서 방문배열을 만들었는데 아스키코드를 이용해 방문을 체크하였다. 왜냐하면 Set자료형에 방문한 알파벳을 넣을수도 있지만 Set은 원소를 집어넣을 때 O(n)이 필요하지만 아스키코드를 이용해 배열의 인덱스에 바로 접근하면 O(1)로 시간복잡도를 줄일 수 있기 때문이다.

 

그리고 DFS의 인수로 cnt를 주어서 DFS가 재귀할 때마다 cnt에 1을 더해 최대값을 구하고자 했다.

 

이를 이용해 푼 코드는 다음과 같다.

 

const fs = require('fs');
let input = fs.readFileSync("/dev/stdin").toString().trim().split('\n')

const [R, C] = input[0].split(' ').map(a=> Number(a))
let board = []
for(let i=0; i<R; i++){
    board[i] = input[i+1].split('')
}

let visited = new Array(26).fill(0)
visited[board[0][0].charCodeAt(0)-65] = 1
const dx = [0,0,1,-1]
const dy = [1,-1,0,0]

let answer = 0

function DFS(r,c,cnt){
    answer = Math.max(answer, cnt)
    for(let i=0; i<4; i++){
        const nx = r + dx[i]
        const ny = c + dy[i]
        if(0<=nx && nx < R && 0<= ny && ny< C && !(visited[board[nx][ny].charCodeAt(0)-65])){
            visited[board[nx][ny].charCodeAt(0)-65] = 1
            DFS(nx,ny,cnt+1)
            visited[board[nx][ny].charCodeAt(0)-65] = 0
        }
    }
}

DFS(0,0,1)
console.log(answer)

 

'Algorithm' 카테고리의 다른 글

프로그래머스: 프렌즈 4 블록(javascript, 구현)  (0) 2023.05.04
프로그래머스: 파일명 정렬(javascript, 구현)  (0) 2023.05.03
백준 2529번: 부등호 (javascript, DFS, 백트래킹)  (0) 2023.04.09
백준 13913번: 숨바꼭질4 (javascript, BFS)  (0) 2023.04.05
백준 1697번: 숨바꼭질 (javascript, bfs)  (0) 2023.04.04
    'Algorithm' 카테고리의 다른 글
    • 프로그래머스: 프렌즈 4 블록(javascript, 구현)
    • 프로그래머스: 파일명 정렬(javascript, 구현)
    • 백준 2529번: 부등호 (javascript, DFS, 백트래킹)
    • 백준 13913번: 숨바꼭질4 (javascript, BFS)
    Early Riser
    Early Riser
    2년차 프론트엔드 개발자입니다. https://github.com/EarlyRiser42

    티스토리툴바