[백준] 2170번: 선 긋기 Python - 스위핑 알고리즘, 정렬

2023. 3. 6. 23:27·Algorithm (PS)
728x90

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

 

2170번: 선 긋기

첫째 줄에 선을 그은 횟수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 다음 N개의 줄에는 선을 그을 때 선택한 두 점의 위치 x, y (-1,000,000,000 ≤ x < y ≤ 1,000,000,000)가 주어진다.

www.acmicpc.net

문제 첫인상은 별로 어렵지 않을 것 같아보였으나 (...) 왜 정답률이 30%대인지 알겠는 문제

i ) 선형적으로 문제를 풀어야 하니까 정렬 , 투포인터 , .. 등등을 떠올리게 되었다. 

ii ) 문제를 그려서 이해해보았다. 

한 선분을 기준으로, start와 end 가 선분의 양 끝점이라고 한다. 

이 경우 새로운 두 개의 점이 주어졌을 때 위의 그림과 같이 두가지 경우로 나뉘게 된다. 합쳐지거나, 합쳐지지 못하거나 두가지이다. 

주어지는 (x, y) 에 대해 오름차순 정렬을 한다. 오름차순 정렬을 통해 얻는 효과는 start 와 end 에 합쳐질 수 있는지 바로 직전에 갱신된 start, end 좌표 값과 x, y 값을 비교해서 합쳐지거나 합쳐지지 못한다는 것을 알 수 있다. 

합쳐지지 않는 경우는 end < x 인 경우이고, 합쳐지는 경우는 그 이외의 모든 경우일 것이다. 따라서 if - else 문으로 분기처리했다. 

즉, 이미 오름차순 정렬을 했으므로 x는 항상 더 큰 값만 나올 것이다!! 라는게 핵심이다

n = int(input())
answer = 0

points = []
for i in range(n):
    x, y = map(int, input().split())
    points.append((x, y))
points.sort()
s, e = points[0]
for i in range(1, n):
    x, y = points[i]
    if e < x: # 갱신해야 함
        answer += (e - s)
        s, e = x, y
    else:
        e = max(e, y)

answer += (e-s)
print(answer)
728x90

'Algorithm (PS)' 카테고리의 다른 글

[백준] 9997번: 폰트 - 비트마스킹 Python  (0) 2023.03.19
[백준] 9205번: 맥주 마시면서 걸어가기 Python  (0) 2023.03.11
[프로그래머스] 행렬 테두리 회전하기 Python/파이썬  (0) 2023.03.05
[백준] 18428번: 감시 피하기  (0) 2023.03.05
[백준] 1956번: 운동 Python (플로이드-워셜)  (0) 2023.03.04
'Algorithm (PS)' 카테고리의 다른 글
  • [백준] 9997번: 폰트 - 비트마스킹 Python
  • [백준] 9205번: 맥주 마시면서 걸어가기 Python
  • [프로그래머스] 행렬 테두리 회전하기 Python/파이썬
  • [백준] 18428번: 감시 피하기
minjiwoo
minjiwoo
Data Engineering과 Cloud Native 기술에 대해 Dive Deep 하는 플랫폼 엔지니어가 되는 것을 목표로 하고 있습니다. 경험과 공부한 내용을 기록하며 지속가능한 엔지니어가 되는 것이 꿈입니다.
minjiwoo
minji's engineering note
minjiwoo
전체
오늘
어제
  • 분류 전체보기 (613)
    • Data Engineering (42)
      • Apache Spark (11)
      • Databricks & Delta Lake (9)
      • Airflow (3)
      • SQL (6)
      • Trouble Shooting (2)
      • Hadoop (2)
      • MLOps (1)
    • Cloud Engineering (104)
      • AWS (23)
      • Linux 🐧 (29)
      • Docker 🐳 (21)
      • Kubernetes ⚙️ (20)
      • Ansible (10)
    • Computer Science (87)
      • 네트워크 (9)
      • 운영체제 (25)
      • 정보처리기사 (48)
      • CS 기술 면접 스터디 (3)
    • Programming Languages (27)
      • Python (17)
      • C와 C++ (10)
    • Backend (5)
      • Django (2)
    • 프로젝트 (2)
      • 테크포임팩트 (2)
    • iOS (11)
      • 레이블러리 (2)
    • Algorithm (PS) (275)
      • LeetCode (6)
    • 개발일기 (30)
      • 내돈내산 후기🎮 (3)
      • 개발자 취준생 (5)
      • Today I Learned (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Hi there

인기 글

태그

  • 운영체제
  • ansible
  • 데이터엔지니어
  • 리눅스
  • AWS
  • Kubernetes
  • 클라우드
  • 프로그래머스
  • SPARK
  • BFS
  • 데이터브릭스
  • dfs
  • dp
  • 백준
  • Databricks
  • Leetcode
  • 스파크
  • docker
  • 백트래킹
  • Swift
  • 빅데이터
  • 파이썬
  • linux
  • python
  • 데이터엔지니어링
  • EC2
  • 코딩테스트
  • 쿠버네티스
  • 카카오코딩테스트
  • 알고리즘

최근 댓글

최근 글

hELLO· Designed By정상우.v4.5.2
minjiwoo
[백준] 2170번: 선 긋기 Python - 스위핑 알고리즘, 정렬
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.