백준 23886번: 알프수

최창효·2022년 1월 3일
0
post-thumbnail


문제 설명

ALPSOO가 되기 위해서는 다음의 조건들을 만족해야 합니다.

  • 산맥의 처음이 오르막으로 시작해야 합니다
  • 산맥의 마지막이 내리막으로 끝나야 합니다
  • 산맥에 평지가 없어야 합니다
  • 오르막 또는 내리막의 중간 경사가 달라지지 않아야 합니다

접근법

  • 경사가 같다는 건 A(i) - A(i-1) == A(i+1) - A(i)를 만족한다는 뜻입니다.
  • 단, 오르막에서 내리막으로 내리막에서 오르막으로 바뀌는 구간은 경사가 달라도 아무런 상관이 없습니다.
  • 오르막에서 내리막으로 내리막에서 오르막으로 바꼈다는 건 A(i) - A(i-1) x A(i+1) - A(i) < 0 와 같습니다. 왜냐하면 오르막은 양의 기울기 값을, 내리막은 음의 기울기 값을 가지기 때문입니다.
  • 저는 오르막에서 내리막으로 내리막에서 오르막으로바꼈는지 판단하는 내용을 upside_downside 변수에 담았습니다.

정답


lst = list(map(int,input()))

def check_alpsoo(lst):
    #i가 0일 때
    upside_downside = lst[1]-lst[0]
    slope = lst[1]-lst[0]
    #산맥의 처음이 오르막으로 시작하는지 확인합니다
    if slope <=0: 
        print("NON ALPSOO")
        return 
    
    #반복문 시작
    for i in range(1,len(lst)-1): #위에서 초기값(i=0)을 설정했기 때문에 i는 1부터 시작합니다
        #평평한 구간이 한 번이라도 나오면 NON ALPSOO 입니다
        if lst[i] == lst[i+1]:
            print('NON ALPSOO')
            return 
        #기울기의 방향이 바꼈는지 판별합니다
        upside_downside = (lst[i]-lst[i-1]) * (lst[i+1] - lst[i]) 
        if upside_downside > 0: #기울기의 방향이 바뀌지 않았다면 
        #경사가 이전과 같은지를 확인합니다
            if slope != lst[i+1]-lst[i]: #경사가 이전과는 다르면 NON ALPSOO 입니다
                print("NON ALPSOO")
                return
        else: #기울기의 방향이 바꼈다면 경사가 이전과 다른지 체크할 필요가 없습니다
            slope = lst[i+1]-lst[i] #slope를 현재의 경사값으로 갱신시켜 줍니다
    
    #산맥의 마지막이 내리막으로 끝나는지 확인합니다
    if slope<0:
        print("ALPSOO")
    else:
        print("NON ALPSOO")
    return 

#답을 얻기 위한 함수를 실행합니다
check_alpsoo(lst)

기타

  • 알고리즘을 함수로 구현하면 실패 조건이 나왔을 때 return을 활용해 곧바로 계산을 종료시킬 수 있습니다
profile
기록하고 정리하는 걸 좋아하는 개발자.

0개의 댓글