본문 바로가기
Algorithm/SWEA

[SW Expert Academy] 1206번 [S/W 문제해결 기본] (python)

by eoieiie 2024. 3. 17.

 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

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

아래와 같이 강변에 8채의 빌딩이 있을 때, 연두색으로 색칠된 여섯 세대에서는 좌우로 2칸 이상의 공백이 존재하므로 조망권이 확보된다. 따라서 답은 6이 된다.
 


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

정답코드


def maxsideindex(lista, indx):
    maxval = max(lista[indx - 2], lista[indx - 1], lista[indx + 1], lista[indx + 2])
    return maxval


for i in range(10):

    totaljomang = 0

    howmany = int(input())
    lista = list(map(int, input().split()))

    for where, buildingfloor in enumerate(lista):
        if buildingfloor == 0:
            continue
        else:
            temp = buildingfloor - maxsideindex(lista, where)
            if temp < 0:
                continue
            else:
                totaljomang += temp

    print(f"#{i+1} {totaljomang}")

 

풀이


  1. 핵심 로직은 다음과 같다:
  2. "어떤 건물의 양쪽 2건물 층수 중 가장 높은 층과, 해당 건물과의 층수 차이는 확보 가능한 조망권의 개수이다. "

  3. maxsiedeindex  함수로 위 내용을 구현하였다. 
  4. 10개의 테스트 케이스가 존재하므로 10번 반복해 주고, 
  5. 조망권의 총 개수를 저장할 totaljomang값을 초기화해 준다.
  6. 사실상 별 의미 없는 howmany 변수를 입력받는다.
  7. enumerate함수를 사용하여 각 요소의 인덱스와 값을 where와 buildingfloor에 저장한다. 

  8. 앞뒤로 2개의 buildingfloor 0 이 존재하므로, 그 빌딩들을 제외하고
  9. 만약 buildingfloor가 0이 아니라면

    1. maxsideindex로 양쪽 2 건물의 층수 중 가장 높은 층과, 현재 조망권을 알아보려는 건물의 층수의 차이를 temp에 저장해 준다.
    2. 만약 양쪽 건물 중 가장 높은 건물이 현재 건물보다 높다면 (차가 음수라면) 애초에 조망권을 구할 수 없으므로 해당 경우에는 continue 해준다. 
    3. 만약 그렇지 않다면, totaljomang을 temp만큼 증가시킨다. 

  10. 끗!

 

느낀 점


다른 정답 코드와 비교하여 큰 이질감이 없었고, 로직을 잘 생각하고 구현한 것 같아 기분이 좋았다. 
enumerate함수는 생각보다 많이 편하다.
 
 
 

 

댓글