우당탕탕 개발일지
[SWEA] 1206. [S/W 문제해결 기본] 1일차 - View(Java, D3) 본문
문제
왼쪽과 오른쪽으로 창문을 열었을 때, 양쪽 모두 거리 2 이상의 공간이 확보될 때 조망권이 확보된다고 말한다.
빌딩들에 대한 정보가 주어질 때, 조망권이 확보된 세대의 수를 구해야 한다.
아래와 같이 강변에 8채의 빌딩이 있을 때, 연두색으로 색칠된 여섯 세대에서는 좌우로 2칸 이상의 공백이 존재하므로 조망권이 확보된다. 따라서 답은 6이 된다.

A와 B로 표시된 세대의 경우는 왼쪽 조망은 2칸 이상 확보가 되었지만 오른쪽 조망은 한 칸 밖에 확보가 되지 않으므로 조망권을 확보하지 못하였다.
C의 경우는 반대로 오른쪽 조망은 2칸이 확보가 되었지만 왼쪽 조망이 한 칸 밖에 확보되지 않았다.
[제약 사항]
가로 길이는 항상 1000이하로 주어진다.
각 빌딩의 높이는 최대 255이다.
맨 왼쪽 두 칸과 맨 오른쪽 두 칸에 있는 건물은 항상 높이가 0이다. (예시에서 빨간색 땅 부분)
입출력 예
풀이
위 그림은 예시 문제를 그림으로 나타내었다.
이중 4번 건물(76)를 예시로 설명하겠다.
조망권 조건 ( [4] > [3] && [4] > [2] ) && ( [4] > [5] && [4] > [6] )
왼쪽 2개와 오른쪽 2개가 [4] 보다 작아야 한다.
이를 표현하면 ( [i] > [i-1] && [i] > [i-2] ) && ([i] > [i+1] && [i] > [i+2] ) 로 할 수 있다.
조건을 만족하면 양쪽 4개의 건물 중 가장 높은 건물 높이를 구한다.
그 후, ([4] - 가장 높은 건물 높이) 의 값을 더한다.
해당 부분을 반복하여 결과 값을 찾는다.
해당 코드는 위의 설명에 따른 코드이다.
for문을 2부터 count - 2 까지 진행하는 이유는 맨 앞과 맨뒤 2칸은 0으로 고정되기 때문이다.
코드
Scanner sc = new Scanner(System.in);
int t=sc.nextInt();
for(int tc =1; tc<1+t; tc++) {
int result = 0;
int count = sc.nextInt();
int[] building = new int[count];
for(int i=0; i<count; i++) {
building[i] = sc.nextInt();
}
for(int i=2; i<count-2; i++) {
if( building[i] > building[i-1] && building[i] > building[i-2] ) {
if(building[i] > building[i+1] && building[i] > building[i+2]) {
int[] findMax = {
building[i-1],
building[i-2],
building[i+1],
building[i+2]
};
Arrays.sort(findMax);
result += building[i] - findMax[3];
}
}
}
System.out.println("#"+tc+ " " + result);
}
SWEA 문제
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV134DPqAA8CFAYh
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
'코테 > SW Expert Academy' 카테고리의 다른 글
[SWEA] 2805. 농작물 수확하기(Java, D3) (0) | 2024.05.17 |
---|---|
[SWEA] 1208. [S/W 문제해결 기본] 1일차 - Flatten(Java, D3) (0) | 2024.05.17 |
[SWEA] 19113. 식료품 가게(Java, D3) (0) | 2024.05.14 |
[SWEA] 1213. [S/W 문제해결 기본] 3일차 - String(Java, D3) (0) | 2024.05.13 |
[SWEA] 1234. [S/W 문제해결 기본] 10일차 - 비밀번호(Java, D3) (0) | 2024.05.13 |