[Algorithm] 비트마스킹 이론 & BOJ 11723 실습

2024. 12. 30. 18:01·🖥️ Computer Science/Algorithm

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

위 11723을 푸는데, Set으로 풀어서 실패하고

아래처럼 20개만 갖는 정수 배열로 0 1 판단을 했더니 실패했다.

// 실패한 코드
let M = Int(readLine()!)!
var array = Array(repeating: 0, count: 20)
(0..<M).forEach { i in 
    let input = readLine()!.split(separator: " ").map { String($0) }
    switch input[0] {
        case "add": array[Int(input[1])! - 1] = 1
        case "remove": array[Int(input[1])! - 1] = 0
        case "check": print(array[Int(input[1])! - 1] == 1 ? "1" : "0")
        case "toggle": (array[Int(input[1])! - 1] == 1) ? (array[Int(input[1])! - 1] = 0) : (array[Int(input[1])! - 1] = 1)
        case "all": array = Array(repeating: 1, count: 20)
        case "empty": array = Array(repeating: 0, count: 20)
        default: break
    }
}

비트마스킹

연산자 설명

  • a & b: AND
  • a | b: OR
  • a ^ b: XOR
  • ~a: NOT
  • a << b: a를 b비트 만큼 왼쪽으로 옮김 (값 증가)
  • a >> b: a를 오른쪽으로 옮김 (값 감소)

할당 연산자

  • |=: 비트 OR 할당
    특정 비트를 켜는 것
      var bit = 0 // 0000
      bit |= (1 << 2) // 1 << 2 == 0100
      print(bit) // 4
  • &=: 비트 AND 할당
    특정 비트를 끄는 것
      var bit = 6 // 0110
      bit &= ~(1 << 2) // ~(1 << 2) == 1011
      print(bit) // 2 (0110 & 1011 => 0010)
  • ^=: 비트 XOR 할당
    특정 비트를 토글화 시킴
      var bit = 6 // 0110
      bit ^= (1 << 1) // 1 << 1 == 0010
      print(bit) // 4 (0110 ^ 0010 => 0100)

모든 비트 1로 설정

  • (1 << (Max + 1)) - 1
  • 비트마스킹에서 모든 비트 켜기위한 방법 중 하나
      let count = 3 // 0011
      let allSet = (1 << (3 + 1)) - 1
      // 0001 << 4 == 10000, 10000 - 1 == 01111

근데 이 문제는 억까가 맞다. FileIO 써야하고, print도 딱 한 번만 써야하는 백준 식 문제라
정답 코드가 아닌, 불필요한 로직 제거한 비트마스킹에 초점을 둔 코드만 작성하고 마치겠다.

let M = Int(readLine()!)!
var bit = 0

(0..<M).forEach { i in 
    let input = readLine()!.split(separator: " ").map { String($0) }
    let value = Int(input.last!)!
    switch input[0] {
        case "add": bit |= 1 << value
        case "remove": bit &= ~(1 << value)
        case "check": print((bit & 1 << value) != 0 ? "1" : "0")
        case "toggle": bit ^= (1 << value)
        case "all": bit = (1 << value + 1) - 1
        case "empty": bit = 0
        default: break
    }
}
저작자표시 (새창열림)

'🖥️ Computer Science > Algorithm' 카테고리의 다른 글

[Algorithm] 백준 32350 - Swift 풀이  (0) 2024.12.28
Swift로 알고리즘 풀 때 알아둬야할 것들  (1) 2024.07.01
Swift로 코드 최적화하기  (1) 2024.05.25
[백준] 7576, 토마토 (Swift)  (0) 2024.02.13
[백준] 2644, 촌수계산(C++, BFS)  (1) 2023.09.02
'🖥️ Computer Science/Algorithm' 카테고리의 다른 글
  • [Algorithm] 백준 32350 - Swift 풀이
  • Swift로 알고리즘 풀 때 알아둬야할 것들
  • Swift로 코드 최적화하기
  • [백준] 7576, 토마토 (Swift)
kyxxn
kyxxn
컴퓨터공학을 좋아하는 대학생의 공부 일기
  • kyxxn
    컴공 학부생의 공부 일기
    kyxxn
  • 전체
    오늘
    어제
    • 분류 전체보기 (156)
      • 📱 iOS (64)
        • Xcode (10)
        • Swift (17)
        • Swift Concurrency (12)
        • UIKit (21)
        • SwiftUI (0)
      • 🖥️ Computer Science (57)
        • 🏛️ Software Architecture Pa.. (2)
        • 👨🏻‍🎨 Design Pattern (3)
        • Data Structure (4)
        • Algorithm (10)
        • Computer Architecture (4)
        • Operating System (19)
        • Network (15)
      • ✍🏻 회고록 (9)
      • 🎸 기타 (25)
        • 해커톤 (1)
        • git (6)
        • 세미나 (1)
        • 책을 읽고 (1)
        • AOS, Kotlin (6)
        • Reinforcement Learning (9)
  • 블로그 메뉴

    • 링크

      • 깃허브
      • 일상 블로그
    • 공지사항

    • 인기 글

    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.0
    kyxxn
    [Algorithm] 비트마스킹 이론 & BOJ 11723 실습
    상단으로

    티스토리툴바