import Foundation

let n = Int(readLine()!)!
let num = n * n
let level = [0, 1, 10, 100, 1000]
var chair = Array(repeating: Array(repeating: -1, count: n + 2), count: n + 2)
var point = Array(repeating: Array(repeating: 0, count: 4), count: num)
var result = 0

for i in 1...n {
    for j in 1...n {
        chair[i][j] = 0
    }
}

for _ in 0..<num {
    let input =  readLine()!.components(separatedBy: " ").map {Int($0)!}
    let student = input[0]
    let like = input[1...4]
    
    for i in 0..<4 {
        point[student - 1][i] = input[i + 1]
    }

    
    var arr:[Int] = []
    
    for i in 1...n {
        for j in 1...n {
            if chair[i][j] == 0 {
                var p = 0
                if like.contains(chair[i][j - 1]) {
                    p += 10
                }
                if like.contains(chair[i - 1][j]) {
                    p += 10
                }
                if like.contains(chair[i + 1][j]) {
                    p += 10
                }
                if like.contains(chair[i][j + 1]) {
                    p += 10
                }
                
                if chair[i][j - 1] == 0 {
                    p += 1
                }
                if chair[i - 1][j] == 0 {
                    p += 1
                }
                if chair[i + 1][j] == 0 {
                    p += 1
                }
                if chair[i][j + 1] == 0 {
                    p += 1
                }
                
                arr.append(p)
            } else {
                arr.append(-1)
            }
        }
    }
    
    if let index = arr.firstIndex(of: arr.max()!) {
        let i = index / n
        let j = index % n
        chair[i + 1][j + 1] = student
    }
    
}

for i in 1...n {
    for j in 1...n {
        var count = 0
        let num = chair[i][j] - 1
        
        if point[num].contains(chair[i][j - 1]) {
            count += 1
        }
        if point[num].contains(chair[i - 1][j]) {
            count += 1
        }
        if point[num].contains(chair[i + 1][j]) {
            count += 1
        }
        if point[num].contains(chair[i][j + 1]) {
            count += 1
        }
        result += level[count]
        
    }
}

print(result)
  1. n을 입력 받으면 n+2 짜리 배열 chair를 만들어 줌 (-1로 초기화)

  2. 좋아하는 친구 4명을 저장할 point 배열 만듬

  3. chair에서 테두리 제외하고 0으로 초기화 해줌

    -1 -1 -1 -1 -1
    -1 0 0 0 -1
    -1 0 0 0 -1
    -1 0 0 0 -1
    -1 -1 -1 -1 -1

    주변 비교를 할 때 boundary는 예외처리를 해줘야 하는데, 그게 귀찮아서 테두리를 하나 만듬

  4. 입력을 받음 4 2 5 1 7

    student = 4, like = [2, 5, 1, 7]

    point[4] 에 좋아하는 친구들 [2, 5, 1,7] 저장

    for 루프를 돌면서 주변 4개의 자리에 대해 확인함

    빈 자리 이면

    1. 좋아하는 친구가 있으면 p += 10
    2. 자리가 비어있으면(==0) p += 1

    자리가 안 비었으면 (else 문)

    p = -1

    arr에 결과값 저장

    arr에서 가장 큰 값의 index를 고른다. (i, j)

    chair[i + 1][j + 1] 에 현재 학생 student 값을 넣어준다.

  5. chair 에 대해 for 문을 돈다

    주변에 좋아하는 친구들의 수를 센다. → point 배열에서 가져와 비교

    좋아하는 수에 따라 level 배열에서 점수를 불러온다. let level = [0, 1, 10, 100, 1000]

    result에 합쳐준다.