입력)
총 10개의 테스트케이스
1000개 이하의 빌딩의 높이가 주어진다.
이 빌딩의 높이는 최대 255이다.
맨 왼쪽 두 칸과 오른쪽 두 칸은 0이다. (건물이 지어지지 않기 때문)
출력)
#(테스트 케이스 번호) (해당 테케에서 조망권이 확보된 세대의 수)
입, 출력 분석)
(생략) int로 다루면 된다.
핵심)
해당 빌딩에서 조망권이 확보된 개수 = 해당 빌딩 높이 - 좌우 두 칸 사이에 제일 높은 빌딩의 높이
예시 분석)
index 2와 6을 통해 내 코드가 잘 구현이 되었는지 디버깅을 돌려보았다.
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
height | 0 | 0 | 225 | 214 | 82 | 73 | 241 | 233 | 179 |
viewCnt | 11 | 8 |
실수)
- 좌우 두 칸 빌딩의 높이가 낮을 때만 조망권 개수를 계산하면 되는데,
차이 구하는데 정신 팔려서 abs() 함수로 처리하고 있었다.
- 테스트 케이스 for문 안에서 갱신되어야 하는 변수를 밖에서 갱신해서,
#1 691 #2 9092+691=>9783이 나왔다..
(숫자보고 딱 어? 뭔가 밀렸다! 감잡아서 다행이지.. 시험장이었으면 멘탈 털렸을 것 같다..)
구현)
#include<stdio.h>
using namespace std;
int main(int argc, char** argv){
int test_case = 1, cnt = 0;
for (; test_case <= 10; ++test_case) {
int heights[1000] = {0, }, total = 0;
scanf("%d", &cnt);
for (int i = 0; i < cnt; i++)
scanf("%d", &heights[i]);
for (int i = 2; i <= cnt-3; i++){
int viewCnt = heights[i], temp = 0;
for (int d = 1; d <= 2; d++){
if(heights[i] <= heights[i+d] || heights[i] <= heights[i-d]){
viewCnt = 0; break;
}
temp = heights[i] - heights[i + d];
if(temp < viewCnt) viewCnt = temp;
temp = heights[i] - heights[i - d];
if (temp < viewCnt) viewCnt = temp;
}
total += viewCnt;
}
printf("#%d %d\n", test_case, total);
}
return 0;
}
'Algorithm&Problem > [Problems] SWEA' 카테고리의 다른 글
[D4] 1211. ladder2 (0) | 2020.08.20 |
---|---|
[D4] 1210.Ladder1 (0) | 2020.08.18 |
[D3] 1208. Flatten (0) | 2020.07.25 |
[D2] 1204. 최빈수 구하기 (0) | 2020.07.22 |
[D2] 1859. 백만 장자 프로젝트 (0) | 2020.07.21 |