알고리즘/백준

[백준/Swift] 14500번: 테트로미노

녕이 2022. 12. 19. 11:30
728x90

 

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

 

14500번: 테트로미노

폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변

www.acmicpc.net

 

c++로도 풀었던 문제였는데, Swift로 다시 풀어봤다!

블록을 하나만 넣어서 해당 수의 합을 구하면 되는 문제라 쉬웠다! 모두 사용해야 했으면..ㅎ..

Swift에는 pair가 없어서 tuple을 사용해서 배열에 넣어줬다.

2차원 배열 array를 입력받을 때, 뒤에 Array(repeating: 0, count: 4)를 넣어줬는데, 왜 그랬냐면

내가 구현한 로직은 모든 원소를 돌면서 block를 끼워 넣고 해당 좌표의 수들의 합을 구하는 것이다. 그런데 옆으로 길이가 4인 블록이 있어서 배열 array의 범위를 벗어날 수 있다. 이를 방지하기 위해 0으로 채워준 것이다.

이렇게 하지 않으려면 내가 생각하기엔 모든 블록의 사이즈를 동일하게 해 주고, 배열 array의 탐색 원소의 범위를 조절해주면 될 것 같은데,,

4개의 원소를 추가하는 것이니.. 그냥 했다^_^

 

 

import Foundation

/*
 NxM 종이 위에 테트로미노 하나를 놓으려한다.
 테트로미노 "하나"를 적절히 놓아서 테트로미노가 놓인 칸에 쓰여있는 수들의 합을 최대로 하는 프로그램
 회전/대칭 가능
 */

let block : [[(Int, Int)]] =
            [
                //cyan
                [(0, 0), (0, 1), (0, 2), (0, 3)],
                [(0, 0), (1, 0), (2, 0), (3, 0)],
                //yellow
                [(0, 0), (0, 1), (1, 0), (1, 1)],
                //orange
                [(0, 0), (1, 0), (2, 0), (2, 1)],
                [(0, 1), (1, 1), (2, 1), (2, 0)],
                [(0, 0), (0, 1), (1, 0), (2, 0)],
                [(0, 0), (0, 1), (1, 1), (2, 1)],
                [(0, 0), (0, 1), (0, 2), (1, 2)],
                [(0, 0), (0, 1), (0, 2), (1, 0)],
                [(0, 0), (1, 0), (1, 1), (1, 2)],
                [(1, 0), (1, 1), (1, 2), (0, 2)],
                //green
                [(0, 0), (1, 0), (1, 1), (2, 1)],
                [(0, 1), (1, 0), (1, 1), (2, 0)],
                [(0, 1), (0, 2), (1, 0), (1, 1)],
                [(0, 0), (0, 1), (1, 1), (1, 2)],
                //magenta
                [(0, 0), (0, 1), (0, 2), (1, 1)],
                [(0, 1), (1, 1), (1, 0), (2, 1)],
                [(0, 0), (1, 0), (1, 1), (2, 0)],
                [(0, 1), (1, 1), (1, 0), (1, 2)]
            ]

let input = readLine()!.split(separator: " ").map{ Int(String($0))! }
let N = input[0]
let M = input[1]
var array = [[Int]](Array(repeating: [Int](repeating: 0, count: 505), count: 505))
for i in 0..<N {
    array[i] = readLine()!.split(separator: " ").map{ Int(String($0))! }
    array[i].append(contentsOf: Array(repeating: 0, count: 4)) //뒤를 0으로 채워서 out of index range를 피함
}
var answer = 0 //max value
for i in 0..<N {
    for j in 0..<M {
        for k in 0..<19 {
            var sum = 0
            for l in 0..<4 {
                sum += array[i+block[k][l].0][j+block[k][l].1]
            }
            answer = max(answer, sum)
        }
    }
}
print(answer)

 

 

728x90