[DFS] 백준 1987번: 알파벳(Swift)

2022. 11. 2. 18:25·코테

난이도: 골드 4

사용 언어: Swift

카테고리: DFS

https://www.acmicpc.net/problem/1987

code

let rc = readLine()!.split(separator: " ").map { Int($0)! }
let r = rc[0]
let c = rc[1]

var map = [[Int]]()
let direction: [(y: Int, x: Int)] = [
  (0,-1),
  (0,1),
  (-1,0),
  (1,0)
]
var result = 0

for _ in 0..<r {
  let y = readLine()!.map { Int($0.asciiValue!) - 65 }
  map.append(y)
}

func dfs(start: (y: Int, x: Int), count: Int, bit: Int) {
  result = result > count ? result : count
  for i in 0..<direction.count {
    let nextP: (y: Int, x: Int) = (start.y + direction[i].y, start.x + direction[i].x)
    
    if (0..<r).contains(nextP.y)
        && (0..<c).contains(nextP.x) {
      let newB = 1 << map[nextP.y][nextP.x]
      if bit & newB == 0 {
        dfs(start: nextP, count: count + 1, bit: bit | newB)
      }
    }
  }
}

dfs(start: (0,0), count: 1, bit: 1 << map[0][0])
print(result)
🗒 지나간 알파벳을 단순히 배열에 담아서 확인했을 때 시간초과가 발생했다. 이유는 배열의 contains(_:)의 시간복잡도가 O(n)이다.
때문에 비트 연산자를 사용해 지나간 알파벳을 확인해야 시간초과 없이 통과되었다.
예를들어, 알파벳 A, B, C, D가 있을 때
알파벳을 아스키코드 - 65를 하여,
A -> 0
B -> 1
C -> 2
D -> 3 으로 만들어준다.
위 값을 1에 << 비트 연산자를 이용하여 각
A -> 0001
B -> 0010
C -> 0100
D -> 1000 으로 만든다. 여기서 bit가 0011이면, 지나간 알파벳이 A와 B가 된다.

'코테' 카테고리의 다른 글

[BFS] 백준: 영역 구하기(Swift)  (0) 2022.11.08
[DFS] 백준 11725번: 트리의 부모 찾기(Swift)  (0) 2022.11.07
[BFS] 백준: 안전 영역(Swift)  (0) 2022.11.01
[BFS] 백준: 적록색약(Swift)  (0) 2022.10.29
[BFS] 백준: 섬의 개수(Swift)  (0) 2022.10.27
'코테' 카테고리의 다른 글
  • [BFS] 백준: 영역 구하기(Swift)
  • [DFS] 백준 11725번: 트리의 부모 찾기(Swift)
  • [BFS] 백준: 안전 영역(Swift)
  • [BFS] 백준: 적록색약(Swift)
Esiwon
Esiwon
iOS 개발 블로그
  • Esiwon
    시원한 코드 기록
    Esiwon
  • 전체
    오늘
    어제
    • 분류 전체보기 (70)
      • iOS&Swift (24)
      • git & github (1)
      • 코테 (41)
      • 네부캠 회고 (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    네부캠
    실버
    코딩테스트
    백준
    이분탐색
    dfs
    회고
    다이나믹 프로그래밍
    코테
    브루트포스 알고리즘
    photos
    구현
    완전탐색
    ios
    동시성
    PhotoKit
    재귀
    알고리즘
    Race Condition
    비동기
    챌린지
    노드
    BFS
    탐색
    Swift
    그리디
    photoUI
    Combine
    Property wrapper
    GCD
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Esiwon
[DFS] 백준 1987번: 알파벳(Swift)
상단으로

티스토리툴바