• Home
  • About
    • JOOS photo

      JOOS

      Joos's blog

    • Learn More
    • Email
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

[백준] 3015번 : 오아시스 재결합 with python3

16 Nov 2018

Reading time ~1 minute

문제: https://www.acmicpc.net/problem/3015

import sys
read = lambda : sys.stdin.readline().strip()

n = int(read())
stack = []
# stack은 각 지점에 왔을 때 높이를 비교할 대상들이 들어있는 곳
# 크기가 큰 것들이 밑에 있다.
ans = 0
for _ in range(n):
    print(stack)
    x = int(read())
    while stack and stack[-1][0] < x:
        # while문은 stack의 값중에서 x보다 작은 값인 애들은 다 뺀다.
        # 왜냐면 뒤에서 x 에 의해 가려지는 애들이어서 stack에 들어있을 이유가 없다.

        # x보다 작은 값들은 다 빼면서 매번 +1씩 한다. 왜냐면 그 애들은 x와 마주볼 수 있기 때문이다.
        ans+= stack.pop()[1]

    if stack and stack[-1][0] == x:
        # 같은게 있으면 cnt를 1씩 늘리는게 이 분기문이 하는 일
        cnt = stack.pop()[1]
        ans+= cnt
        # 2 2 2있으면 젤 앞에 2는 젤 끝에 2를 볼 수 있기 때문에 이렇게 한다.
        if len(stack) != 0 :
            ans += 1
        # 바로 직전의 애와 마주볼 수 있으므로 +1
        stack.append((x, cnt+1))
    else:
        # stack의 top이 x보다 더 크다! 뒤에 오는 애들이 현재 값과 stack의 값을 동시에 볼 수도 있기 때문이다.
        if len(stack) != 0 :
            ans += 1
        # 바로 직전의 애와 마주볼 수 있으므로 +1
        stack.append((x, 1))
    '''
        밑에 if문을 코드에 넣으려면 바로 직전의 if/else문에서
        if len(stack) != 0 :
            ans += 1
        이부분을 빼야한다.


        if stack and stack[0][0] > x:
            # stack의 값중에서 x보다 작은 값인 애들은 이미 사전에 빼서 [5 3] 에 4가 되서 문제가 될 것을 걱정할 필요가 없다.
            # 그냥 보면 이해가 안되지만 사실은 마주보는 애들의 값을 더하기 위해서 놓은 것이다.
            ans+= 1

    '''
print(ans)



algorithm백준python Share Tweet +1