본문 바로가기
알고리즘

[Swift 알고리즘] 백준 1027 고층 건물

by 코코종 2023. 4. 18.
728x90

안녕하세요 코코종입니다....

또 알고리즘이랑 싸우다가 왔습니다.... 백준은 인간적으로 예제에 대한 설명좀 자세히 달아라 진짜 ㅡㅡ

//
//  main.swift
//  BackJoon
//
//  Created by kokojong on 2023/04/18.
//

import Foundation

// 백준 1027 고층 건물 완탐 골4

let n = Int(readLine()!) ?? 0
let arr: [Double] = readLine()!.split(separator: " ").map { Double(String($0))! }
var answer = 0

func findLeft(x1: Int) -> Int { // 기준점의 왼쪽에 몇개가 되는지
    var leftCnt = 0
    let y1 = arr[x1]
    var maxD: Double = Double(Int.max)
    
    for l in 1...x1 {
        let x2 = x1 - l
        let y2 = arr[x2]
        let d = Double(y2 - y1) / Double(x2 - x1)
        if d < maxD { // 기울기는 양수, 그 중 최근에 나온 가장 큰 기울기보다 작은 기울기가 나와야만 가능
            leftCnt += 1
            maxD = d
        } else {
            return leftCnt
        }
    }
    
    return leftCnt
    
}

func findRight(x1: Int) -> Int { // 기준점의 오른쪽에 몇개가 되는지
    var rightCnt = 0
    let y1 = arr[x1]
    var minD: Double = Double(Int.min)
    
    for l in x1+1..<n {
        let x2 = l
        let y2 = arr[x2]
        let d = Double(y2 - y1) / Double(x2 - x1)
        if d > minD { // 기울기는 음수, 그 중 최근에 나온 가장 작은 기울기보다 큰 기울기가 나와야만 가능
            rightCnt += 1
            minD = d
        } else {
            return rightCnt
        }
    }
    return rightCnt
}
    
for i in 0..<n {
    var left = 0
    var right = 0
    if i > 0 {
        left = findLeft(x1: i)
    }
    
    if i < n-1 {
        right = findRight(x1: i)
    }
    
    answer = max(left + right, answer)
}

print(answer)

아아아아아무리 봐도 맞는데 말이죠... 틀렸대요...ㅜㅜ 문제를 찾느라 너무 힘들었습니닷...

문제는 바로 left, right에서 else return을 해준게 문제였는데요,,,, 
예제 1번 입력인

15
1 5 3 2 6 3 2 6 4 2 5 7 3 1 5

경우에 원하는 값은 7이 되어야 하는데 저는 6이 나오더라구요...? index 5의 경우높이가 6인데 쩌기 오른쪽에 7도 있죠?

그래서 왼쪽에서는 1, 5, 3, 2가 보이고 오른쪽에서는 3, 2 (쭉안보이다가) 7이 보이는겁니다...

제가 멍충인게 자기보다 낮은 건물이라고 생각했네요.... 하하... 진짜 멍충인가...안보이는 건물이 보인다고 멈추면 안됩니다!!! 다들 참고하세요 ㅜㅜ

//
//  main.swift
//  BackJoon
//
//  Created by kokojong on 2023/04/18.
//

import Foundation

// 백준 1027 고층 건물 완탐 골4

let n = Int(readLine()!) ?? 0
let arr: [Double] = readLine()!.split(separator: " ").map { Double(String($0))! }
var answer = 0

func findLeft(x1: Int) -> Int { // 기준점의 왼쪽에 몇개가 되는지
    var leftCnt = 0
    let y1 = arr[x1]
    var maxD: Double = Double(Int.max)
    
    for l in 1...x1 {
        let x2 = x1 - l
        let y2 = arr[x2]
        let d = Double(y2 - y1) / Double(x2 - x1)
        if d < maxD { // 기울기는 양수, 그 중 최근에 나온 가장 큰 기울기보다 작은 기울기가 나와야만 가능
            leftCnt += 1
            maxD = d
        }
    }
    
    return leftCnt
    
}

func findRight(x1: Int) -> Int { // 기준점의 오른쪽에 몇개가 되는지
    var rightCnt = 0
    let y1 = arr[x1]
    var minD: Double = Double(Int.min)
    
    for l in x1+1..<n {
        let x2 = l
        let y2 = arr[x2]
//        if x2 - x1 == 0 { continue }
        let d = Double(y2 - y1) / Double(x2 - x1)
        if d > minD { // 기울기는 음수, 그 중 최근에 나온 가장 작은 기울기보다 큰 기울기가 나와야만 가능
            rightCnt += 1
            minD = d
        }
    }
    return rightCnt
}
    
for i in 0..<n {
    var left = 0
    var right = 0
    if i > 0 {
        left = findLeft(x1: i)
    }
    
    if i < n-1 {
        right = findRight(x1: i)
    }
    
//    print(left, right)
    answer = max(left + right, answer)
}

print(answer)

조건을 쪼금만 바꿨더니 되는 이런... 허헣ㅎ.ㅎ.ㅎ.

다들 저처럼 실수하지 마세요 ㅎ..

728x90