본문 바로가기

백준 write-up/정렬 & 그리디

[백준] 아우으 우아으이야!! : 15922번 - Python

728x90
반응형

https://www.acmicpc.net/problem/15922

 

15922번: 아우으 우아으이야!!

N개의 선분을 모두 그렸을 때, 수직선 위에 그어진 선분 길이의 총합을 출력한다아아어으잉에애야우아으아이아야아아아아아아이야!!!

www.acmicpc.net

 

 

 

 

 

 

 

 

문제의 접근 방법

 

- 선분이 겹치는 경우의 수를 case별로 나눠서 생각해보기

- x,y는 좌표가 아니라 구간을 의미

- 입력되는 x와 y값은 오름차순으로 정렬되어 있는 것과 같음

- 처음 입력 받는 x,y 값과 그 다음에 입력받을 x,y값들을 분리해서 입력 받기

 

 

 

내가 막혔던 부분

 

선분이 그려질 수 있는 경우의 수를 파악하지 못 함.

 

 

 

문제 풀이 방법

 

(1) 수직선 위에 그릴 선분의 개수 N을 입력 받는다.

(2) 가장 처음으로 입력 받을 x,y값을 x1,y1으로 입력 받는다.

(3) 이미 한 번 입력 받았으므로 N-1번만큼 반복문을 돌려 나머지 x,y값을(x2,y2) 입력 받는다.

(4) 위 그림처럼 3가지 경우의 수를 나눠서 조건문으로 처리해준다. (코드는 case번호가 반대로 구현되어 있음)

case 3: y2 값이 x1과 y1사이의 값일 때 => 처음에 입력 받은 값들로 만들어진 선분 안에 새로 입력 받은 선분이 포함돼있을 때

"continue"

case 2: x2값은 x1과 y1사이의 값이지만 y2의 값은 x1과 y1사이의 값이 아닐 때 => y2-y1만큼 길이가 늘어날 때, 즉 선분이 겹쳐있을 때

"y1값을 y2값으로 바꿔준다"

case 1: 완전히 다른 선분일 때

"result에 여태까지 판별했던 선분의 길이 (y1-x1)을 계산해주고, 이 값과 그 다음에 입력되는 x,y값들을 (4)의 방식으로 반복하여 판별해주기 위해 현재 x2,y2의 값을 x1,y1으로 바꿔준다"

위 과정을 N-1만큼 반복!!!

(5) 여태까지 더해줬던 선분의 길이 result에 마지막에 남겨져있을 y1-x1값을 더해서 최종 선분의 길이를 출력해준다.

 

 

 

소스코드

N = int(input())

x1,y1 = map(int, input().split())

result = 0
for i in range(N-1):
    x2,y2 = map(int, input().split())

    if x1 <= y2 <= y1:  # case 3
        continue
    elif x1 <= x2 <= y1 and not x1 <= y2 <= y1: # case 2
        y1 = y2
    else:   # case 1
        result += abs(y1 - x1)
        x1, y1 = x2, y2

print(result + abs(y1 - x1))
728x90
반응형