본문 바로가기

알고리즘

[투포인터] 빗물 - backjoon Swift

문제 : https://www.acmicpc.net/problem/14719

 

14719번: 빗물

첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500) 두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치

www.acmicpc.net

 

풀이방법 

벽을 2차원 배열로 만들고 row 한줄씩 본다.

1과 1사이를 두개의 포인터로 지정후 가운데를 2로 채운다.

2의 갯수를 센다.

 

코드

import Foundation

func checkRainWater() -> Int {
    var mapInfo = readLine()!.components(separatedBy: " ").map{Int($0)!}
    let wall = readLine()!.components(separatedBy: " ").map{Int($0)!}
    let width = mapInfo[0]
    let columns = mapInfo[1]

    var result = 0
    var map = Array(repeating: Array(repeating: 0, count: columns), count: width)

    //벽 채우기 : 1
    for column in 0..<columns {
        for row in 0..<wall[column] {

            map[width-1-row][column] = 1
        }
    }
    
    for row in 0..<width {
        var startIndex = -1
        var endIndex = -1

        for elementIndex in 0..<map[row].count {
            //벽이 있는 곳 : 1
            if map[row][elementIndex] == 1 {
                if startIndex == endIndex {
                    startIndex = elementIndex
                } else {
                    endIndex = elementIndex

                    for index in startIndex+1..<endIndex {
                        //물이 고인곳 : 2
                        map[row][index] = 2
                        result += 1
                    }
                    startIndex = endIndex
                    endIndex = -1
                }

            }
        }
    }

    return result
}

print(checkRainWater())

 

투포인터 + 완전탐색으로 풀었는데 다른분이 푼 것보다 느렸다. 완탐말고 다른 방법을 생각해 봐야하는 것 같다.

반응형