https://www.acmicpc.net/problem/15922
문제의 접근 방법
- 선분이 겹치는 경우의 수를 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))
'백준 write-up > 정렬 & 그리디' 카테고리의 다른 글
[백준] 줄 세우기 : 11536번 - Python (0) | 2021.07.29 |
---|---|
[백준] 제 2회 IUPC는 잘 개최될 수 있을까? : 12788번 - Python (0) | 2021.07.29 |
[백준] 수열과 쿼리 3 : 13544번 - Python (0) | 2021.07.28 |
[백준] Project Teams : 20044번 - Python (0) | 2021.07.28 |
[백준] 단어 퍼즐 : 9946번 - Python (0) | 2021.07.27 |