ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 18808 스티커 붙이기
    Algorithm/BOJ 2021. 3. 7. 18:48
    728x90

    출처: www.acmicpc.net/problem/18808

    분류: 시뮬레이션


    접근방식

    주어진 요구사항대로 잘 구현하면 되는 문제였습니다!

    각 부분을 함수로 잘 쪼개면 어렵지 않게 해결할 수 있을 것 같네요 :)

    저는 isPaste, paste, rotate 등을 함수로 분리해서 해결했습니다.

    rotate 하는 부분이 좀 헷갈렸는데, 기억해두면 나중에도 유용하게 사용할 수 있을 것 같아요! 

    90도 회전

    func rotate(_ sticker: [[Int]]) -> [[Int]] {
        let rowSize = sticker.count
        let colSize = sticker[0].count
        var rotated = [[Int]](repeating: [Int](repeating: 0, count: rowSize), count: colSize)
        
        for r in 0..<rowSize {
            for c in 0..<colSize {
                rotated[c][rowSize-r-1] = sticker[r][c]
            }
        }
        return rotated
    }

     

    해결방법

    typealias Point = (r: Int, c: Int)
    
    func isPastable(_ sticker: [[Int]], to point: Point) -> Bool {
        for r in 0..<sticker.count {
            for c in 0..<sticker[0].count {
                let pr = point.r + r
                let pc = point.c + c
                guard pr < notebook.count, pc < notebook[0].count else { return false }
                guard sticker[r][c] == 1 else { continue }
                guard notebook[pr][pc] else { return false }
            }
        }
        return true
    }
    
    func paste(_ sticker: [[Int]], to point: Point) {
        for r in 0..<sticker.count {
            for c in 0..<sticker[0].count {
                guard sticker[r][c] == 1 else { continue }
                notebook[point.r + r][point.c + c] = false
                pasteCount += 1
            }
        }
    }
    
    func rotate(_ sticker: [[Int]]) -> [[Int]] {
        let rowSize = sticker.count
        let colSize = sticker[0].count
        var rotated = [[Int]](repeating: [Int](repeating: 0, count: rowSize), count: colSize)
        
        for r in 0..<rowSize {
            for c in 0..<colSize {
                rotated[c][rowSize-r-1] = sticker[r][c]
            }
        }
        return rotated
    }
    
    func tryPaste(_ sticker: [[Int]]) -> Bool {
        for r in 0..<nmk[0] {
            for c in 0..<nmk[1] {
                guard isPastable(sticker, to: (r, c)) else { continue }
                paste(sticker, to: (r, c))
                return true
            }
        }
        return false
    }
    
    
    var nmk = readLine()!.split(separator: " ").map { Int(String($0))! }
    var notebook = [[Bool]](repeating: [Bool](repeating: true, count: nmk[1]), count: nmk[0])
    var pasteCount = 0
    
    for _ in 0..<nmk[2] {
        let rc = readLine()!.split(separator: " ").map { Int(String($0))! }
        var sticker = [[Int]]()
        for _ in 0..<rc[0] {
            sticker.append(readLine()!.split(separator: " ").map({ Int(String($0))! }))
        }
        
        for _ in 0..<4 {
            guard tryPaste(sticker) else {
                sticker = rotate(sticker)
                continue
            }
            break
        }
    }
    
    print(pasteCount)
    

    배운점

    처음에 노트북을 생성할 때 가로 세로를 반대로 해서 시간을 엄청 날려먹었다....

     

    'Algorithm > BOJ' 카테고리의 다른 글

    백준 16236 아기상어  (0) 2021.03.10
    백준 12100 2408(easy)  (0) 2021.03.08
    백준 2143 두 배열의 합  (0) 2021.03.05
    백준 1939 중량제한  (0) 2021.03.04
    백준 7453 합이 0인 네 정수  (0) 2021.03.04

    댓글

Designed by Tistory.