[코딩테스트] 🪑상어 초등학교 - 백준 21608

2025. 10. 1. 18:38알고리즘

문제링크

문제링크

난이도

골드 5

유형

구현

소요시간

1시간

회고

풀만했는데 문제 해석을 초반에 잘 못해서 헤맴. 인접 거리에 대한 해석을 대각선도 포함인줄 알았다. 문제를 우선 잘 보자!

코드

struct Info {
    let l: Int
    let e: Int
    let r, c: Int
}

typealias Seat = (i: Int, n: Set<Int>)

let N = Int(readLine()!)!
var students: [[Int]] = Array(repeating: Array(repeating: 0, count: 5), count: N*N)
var seats: [[Seat]] = Array(repeating: Array(repeating: (0, []), count: N), count: N)

(0..<N*N).forEach { i in
    students[i] = readLine()!.split(separator: " ").map { Int($0)! }
}

let dr = [-1, 0, 1, 0]
let dc = [0, 1, 0, -1,]

students.forEach { row in
    let student = row[0]
    let likes = Set(row[1..<5])
    var infoList = [Info]()

    var maxEmpty = 0
    var maxLikes = 0
    (0..<N).forEach { r in
        (0..<N).forEach { c in
            var likeCount: Int = 0
            var emptyCount: Int = 0

            if seats[r][c].i != 0 { return }
            (0..<4).forEach { k in
                let nr = r + dr[k]
                let nc = c + dc[k]

                if nr < 0 || nr >= N || nc < 0 || nc >= N { return }
                if seats[nr][nc].i == 0  {
                    emptyCount += 1
                } else if likes.contains(seats[nr][nc].i) {
                    likeCount += 1
                }
            }

            let info = Info(l: likeCount, e: emptyCount, r: r, c: c)
            infoList.append(info)
        }
    }

    let sorted = infoList.sorted { l, r in
        if l.l != r.l {
            return l.l > r.l
        } else if l.e != r.e {
            return l.e > r.e
        } else if l.r != r.r {
            return l.r < r.r
        } else {
            return l.c < r.c
        }
    }
    let info = sorted.first!
    seats[info.r][info.c] = (student, likes)
}

var answer = 0

(0..<N).forEach { r in
    (0..<N).forEach { c in
        var acc = 0
        let likes = seats[r][c].n
        (0..<4).forEach { k in
            let nr = r + dr[k]
            let nc = c + dc[k]

            if nr < 0 || nr >= N || nc < 0 || nc >= N { return }
            if likes.contains(seats[nr][nc].i) { acc += 1 }
        }
        answer += score(acc)
    }
}

func score(_ s: Int) -> Int {
    switch s {
    case 4: return 1000
    case 3: return 100
    case 2: return 10
    case 1: return 1
    default: return 0
    }
}

print(answer)