[Silver II] 창고 다각형 - 2304
성능 요약
메모리: 69108 KB, 시간: 12 ms
분류
브루트포스 알고리즘, 자료 구조, 스택
제출 일자
2023년 12월 27일 18:19:12
문제 설명
N 개의 막대 기둥이 일렬로 세워져 있다. 기둥들의 폭은 모두 1 m이며 높이는 다를 수 있다. 이 기둥들을 이용하여 양철로 된 창고를 제작하려고 한다. 창고에는 모든 기둥이 들어간다. 이 창고의 지붕을 다음과 같이 만든다.
- 지붕은 수평 부분과 수직 부분으로 구성되며, 모두 연결되어야 한다.
- 지붕의 수평 부분은 반드시 어떤 기둥의 윗면과 닿아야 한다.
- 지붕의 수직 부분은 반드시 어떤 기둥의 옆면과 닿아야 한다.
- 지붕의 가장자리는 땅에 닿아야 한다.
- 비가 올 때 물이 고이지 않도록 지붕의 어떤 부분도 오목하게 들어간 부분이 없어야 한다.
그림 1은 창고를 옆에서 본 모습을 그린 것이다. 이 그림에서 굵은 선으로 표시된 부분이 지붕에 해당되고, 지붕과 땅으로 둘러싸인 다각형이 창고를 옆에서 본 모습이다. 이 다각형을 창고 다각형이라고 하자.
그림1 . 기둥과 지붕(굵은 선)의 예
창고 주인은 창고 다각형의 면적이 가장 작은 창고를 만들기를 원한다. 그림 1에서 창고 다각형의 면적은 98 ㎡이고, 이 경우가 가장 작은 창고 다각형이다.
기둥들의 위치와 높이가 주어질 때, 가장 작은 창고 다각형의 면적을 구하는 프로그램을 작성하시오.
입력
첫 줄에는 기둥의 개수를 나타내는 정수 N이 주어진다. N은 1 이상 1,000 이하이다. 그 다음 N 개의 줄에는 각 줄에 각 기둥의 왼쪽 면의 위치를 나타내는 정수 L과 높이를 나타내는 정수 H가 한 개의 빈 칸을 사이에 두고 주어진다. L과 H는 둘 다 1 이상 1,000 이하이다.
출력
첫 줄에 창고 다각형의 면적을 나타내는 정수를 출력한다.
풀이
위의 문제에서 중요한 것은 오목하게 들어가있는 부분이 없다는 점과 최대 높이를 기준으로 잡는 것이라고 생각합니다.
최대 높이를 기준으로 왼쪽 부분은 최대 높이를 만나기 전까지 높이가 높아질 때마다 해당 높이로 갱신해주면 되는 것이고,
오른쪽 부분은 가장 오른쪽부터 시작하여 최대 높이를 만나기 전까지 똑같은 방법으로 시행해주면 됩니다.
여기서 제가 고민했던 부분은 '최대 높이가 여러 개 있으면 어떻게 해야하는지'였는데, 최대 높이가 나타난 가장 처음 인덱스를 기준으로 왼쪽 부분과 오른쪽 부분을 나누고 계산하면 오른쪽 부분에서 최대 높이를 고려한 결과가 나타납니다.
그림으로 보면 다음과 같이 해결하였습니다.

다음은 코드입니다.
let n = Int(readLine()!)!
var storages = Array(repeating: 0, count: 1001)
for _ in 0..<n {
let input = readLine()!.split(separator: " ").map { Int($0)! }
let (width, height) = (input[0], input[1])
storages[width] = height
}
let maxHeightIndex = storages.firstIndex(of: storages.max()!)!
var (leftArea, leftHeight, rightArea, rightHeight) = (0, 0, 0, 0)
for i in 0..<maxHeightIndex { // 최대 높이의 왼쪽 부분
leftHeight = max(storages[i], leftHeight)
leftArea += leftHeight
}
for i in stride(from: storages.count - 1, to: maxHeightIndex, by: -1) { // 최대 높이의 오른쪽 부분
rightHeight = max(storages[i], rightHeight)
rightArea += rightHeight
}
print(leftArea + storages[maxHeightIndex] + rightArea)
'PS > BOJ' 카테고리의 다른 글
[백준(BOJ)] 14713 앵무새 - 스위프트 (Swift) (2) | 2024.01.02 |
---|---|
[백준(BOJ)] 10845 큐 - 스위프트 (Swift) (0) | 2024.01.02 |
[백준(BOJ)] 2257 화학식량 - 스위프트 (Swift) (0) | 2023.12.28 |
[백준(BOJ)] 15815 천재 수학자 성필 - 스위프트 (Swift) (2) | 2023.12.28 |
[백준(BOJ)] 2841 외계인의 기타 연주 - 스위프트 (Swift) (2) | 2023.12.28 |
[Silver II] 창고 다각형 - 2304
성능 요약
메모리: 69108 KB, 시간: 12 ms
분류
브루트포스 알고리즘, 자료 구조, 스택
제출 일자
2023년 12월 27일 18:19:12
문제 설명
N 개의 막대 기둥이 일렬로 세워져 있다. 기둥들의 폭은 모두 1 m이며 높이는 다를 수 있다. 이 기둥들을 이용하여 양철로 된 창고를 제작하려고 한다. 창고에는 모든 기둥이 들어간다. 이 창고의 지붕을 다음과 같이 만든다.
- 지붕은 수평 부분과 수직 부분으로 구성되며, 모두 연결되어야 한다.
- 지붕의 수평 부분은 반드시 어떤 기둥의 윗면과 닿아야 한다.
- 지붕의 수직 부분은 반드시 어떤 기둥의 옆면과 닿아야 한다.
- 지붕의 가장자리는 땅에 닿아야 한다.
- 비가 올 때 물이 고이지 않도록 지붕의 어떤 부분도 오목하게 들어간 부분이 없어야 한다.
그림 1은 창고를 옆에서 본 모습을 그린 것이다. 이 그림에서 굵은 선으로 표시된 부분이 지붕에 해당되고, 지붕과 땅으로 둘러싸인 다각형이 창고를 옆에서 본 모습이다. 이 다각형을 창고 다각형이라고 하자.
그림1 . 기둥과 지붕(굵은 선)의 예
창고 주인은 창고 다각형의 면적이 가장 작은 창고를 만들기를 원한다. 그림 1에서 창고 다각형의 면적은 98 ㎡이고, 이 경우가 가장 작은 창고 다각형이다.
기둥들의 위치와 높이가 주어질 때, 가장 작은 창고 다각형의 면적을 구하는 프로그램을 작성하시오.
입력
첫 줄에는 기둥의 개수를 나타내는 정수 N이 주어진다. N은 1 이상 1,000 이하이다. 그 다음 N 개의 줄에는 각 줄에 각 기둥의 왼쪽 면의 위치를 나타내는 정수 L과 높이를 나타내는 정수 H가 한 개의 빈 칸을 사이에 두고 주어진다. L과 H는 둘 다 1 이상 1,000 이하이다.
출력
첫 줄에 창고 다각형의 면적을 나타내는 정수를 출력한다.
풀이
위의 문제에서 중요한 것은 오목하게 들어가있는 부분이 없다는 점과 최대 높이를 기준으로 잡는 것이라고 생각합니다.
최대 높이를 기준으로 왼쪽 부분은 최대 높이를 만나기 전까지 높이가 높아질 때마다 해당 높이로 갱신해주면 되는 것이고,
오른쪽 부분은 가장 오른쪽부터 시작하여 최대 높이를 만나기 전까지 똑같은 방법으로 시행해주면 됩니다.
여기서 제가 고민했던 부분은 '최대 높이가 여러 개 있으면 어떻게 해야하는지'였는데, 최대 높이가 나타난 가장 처음 인덱스를 기준으로 왼쪽 부분과 오른쪽 부분을 나누고 계산하면 오른쪽 부분에서 최대 높이를 고려한 결과가 나타납니다.
그림으로 보면 다음과 같이 해결하였습니다.

다음은 코드입니다.
let n = Int(readLine()!)!
var storages = Array(repeating: 0, count: 1001)
for _ in 0..<n {
let input = readLine()!.split(separator: " ").map { Int($0)! }
let (width, height) = (input[0], input[1])
storages[width] = height
}
let maxHeightIndex = storages.firstIndex(of: storages.max()!)!
var (leftArea, leftHeight, rightArea, rightHeight) = (0, 0, 0, 0)
for i in 0..<maxHeightIndex { // 최대 높이의 왼쪽 부분
leftHeight = max(storages[i], leftHeight)
leftArea += leftHeight
}
for i in stride(from: storages.count - 1, to: maxHeightIndex, by: -1) { // 최대 높이의 오른쪽 부분
rightHeight = max(storages[i], rightHeight)
rightArea += rightHeight
}
print(leftArea + storages[maxHeightIndex] + rightArea)
'PS > BOJ' 카테고리의 다른 글
[백준(BOJ)] 14713 앵무새 - 스위프트 (Swift) (2) | 2024.01.02 |
---|---|
[백준(BOJ)] 10845 큐 - 스위프트 (Swift) (0) | 2024.01.02 |
[백준(BOJ)] 2257 화학식량 - 스위프트 (Swift) (0) | 2023.12.28 |
[백준(BOJ)] 15815 천재 수학자 성필 - 스위프트 (Swift) (2) | 2023.12.28 |
[백준(BOJ)] 2841 외계인의 기타 연주 - 스위프트 (Swift) (2) | 2023.12.28 |