Search

1206. 1일차 - View

대분류
기타
소분류
코딩테스트
난이도
D3
문제 주소
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV134DPqAA8CFAYh&categoryId=AV134DPqAA8CFAYh&categoryType=CODE&problemTitle=view&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1
테스트사이트
SWEA
최종 편집 일시
2024/10/27 15:36
생성 일시
2024/05/18 18:37
13 more properties

문제 설명

강변에 빌딩들이 옆으로 빽빽하게 밀집한 지역이 있다.이곳에서는 빌딩들이 너무 좌우로 밀집하여, 강에 대한 조망은 모든 세대에서 좋지만 왼쪽 또는 오른쪽 창문을 열었을 때 바로 앞에 옆 건물이 보이는 경우가 허다하였다.그래서 이 지역에서는 왼쪽과 오른쪽으로 창문을 열었을 때, 양쪽 모두 거리 2 이상의 공간이 확보될 때 조망권이 확보된다고 말한다.빌딩들에 대한 정보가 주어질 때, 조망권이 확보된 세대의 수를 반환하는 프로그램을 작성하시오. 아래와 같이 강변에 8채의 빌딩이 있을 때, 연두색으로 색칠된 여섯 세대에서는 좌우로 2칸 이상의 공백이 존재하므로 조망권이 확보된다. 따라서 답은 6이 된다.

제한 사항

가로 길이는 항상 1000 이하로 주어진다.
맨 왼쪽 두 칸과 맨 오른쪽 두 칸에는 건물이 지어지지 않는다. (예시에서 빨간색 땅 부분)
각 빌딩의 높이는 최대 255이다.
A와 B로 표시된 세대의 경우는 왼쪽 조망은 2칸 이상 확보가 되었지만 오른쪽 조망은 한 칸 밖에 확보가 되지 않으므로 조망권을 확보하지 못하였다.
C의 경우는 반대로 오른쪽 조망은 2칸이 확보가 되었지만 왼쪽 조망이 한 칸 밖에 확보되지 않았다.

입출력 예

입력
10 0 0 254 185 76 227 84 175 0 0 10 0 0 251 199 176 27 184 75 0 0 11 0 0 118 90 243 178 99 100 200 0 0 ...
Plain Text
복사
출력
#1 111 #2 60 #3 165 ...
Plain Text
복사

입출력 예 설명

입력
총 10개의 테스트케이스가 주어진다.
각 테스트케이스의 첫 번째 줄에는 건물의 개수 N이 주어진다. (4 ≤ N ≤ 1000)
그 다음 줄에는 N개의 건물의 높이가 주어진다. (0 ≤ 각 건물의 높이 ≤ 255)
맨 왼쪽 두 칸과 맨 오른쪽 두 칸에 있는 건물은 항상 높이가 0이다. (예시에서 빨간색 땅 부분)
출력
#부호와 함께 테스트케이스의 번호를 출력하고, 공백 문자 후 조망권이 확보된 세대의 수를 출력한다.

문제 풀이

문제 파악

문제에 나온 예시 그림을 리스트 형태로 변환하면 다음과 같다.
apt_height_list = [0,0,3,5,2,4,9,0,6,4,0,6,0,0]
여기서 각 왼쪽( [0], [1] ), 오른쪽( [-1], [-2] )은 아파트가 없으므로 0으로 처리되어 있다.
아파트 층마다 조망권이 있는 지 확인하는 방법
양 사이드로 2칸 내에 해당 아파트의 층 높이보다 높은 곳이 있으면 해당 층은 조망권이 없다.
이걸 수식으로 표현하면 main_height > side_height: True이다.
그렇다면 해당 빌딩을 제외한 양 사이드 중에 제일 큰 빌딩을 찾고 해당 빌딩과 비교하여 해당 빌딩이 더 클 경우 main_height - side_height이 된다.

로직

1번째 반복문 : 테스트 케이스 10개 구동용
river = int input
building = [int input]
answer = int
2번째 반복문 : 2번째 칸부터 강물 길이-2만큼 (각 왼쪽과 오른쪽 2칸은 비어있기 때문)
왼쪽(2)과 오른쪽(2) 빌딩중에서 제일 높은 빌딩을 찾음
현재 빌딩과 제일큰빌딩을 비교할때 현재빌딩보다 작다면 차 만큼 결과에 더해주기
해당 테스트 결과값 반환

주요 사용 함수

max

의사 코드

# 기본 조건은 10개의 케이스 # 각 케이스마다 받아야 하는 인자는 2개 # 강물의 가로 길이(건물의 갯수) # 아파트들의 높이 리스트 # 반환해야 하는 포맷 형식: #{케이스 번호} {해당 케이스에서 조망권이 확보된 세대의 수} # 로직 # 1번째 조건문 : 테스트 케이스 10개 구동용 # river = int input # building = [int input] # answer = int # 2번째 조건문 : 2번째 칸부터 강물 길이-2만큼 (각 왼쪽과 오른쪽 2칸은 비어있기 때문) # 왼쪽(2)과 오른쪽(2) 빌딩중에서 제일 높은 빌딩을 찾음 # 현재 빌딩과 제일큰빌딩을 비교할때 현재빌딩보다 작다면 차 만큼 결과에 더해주기 # 해당 테스트 결과값 반환 case_num -> int, count -> int
Python
복사

코드

for case_num in range(1, 11): # 테스트 케이스 10개 river = int(input()) # 첫 번째 인자 buildings = list(map(int, input().split())) # 두 번째 인자 # map 객체로 만든후 list형태로 변환 answer_cnt = 0 #왼쪽2칸과 오른쪽 2칸은 비어있음 for i in range(2, river-2): # 왼쪽과 오른쪽 빌딩중에서 제일 높은 빌딩을 찾음 high_building = max(buildings[i+1], buildings[i+2], buildings[i-1], buildings[i-2]) # 현재 빌딩과 제일큰빌딩을 비교할때 현재빌딩보다 작다면 차 만큼 결과에 더해주기 jomang = buildings[i] - high_building if jomang > 0 : answer_cnt += jomang print(f"#{case_num} {answer_cnt}")
Python
복사

다른 방식

for t in range(1, 11): N = int(input()) buildings = [int(x) for x in input().split()] Sum = 0 for i in range(2, N - 2): ans = buildings[i] - max(buildings[i - 2:i] + buildings[i + 1: i + 3]) if(ans < 0): ans = 0 Sum += ans print('#', end = '') print(t, Sum)
Python
복사