-
백준 18808 스티커 붙이기Algorithm/BOJ 2021. 3. 7. 18:48728x90
출처: 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