[백준] 2565 - 전깃줄 (S1)

2021. 12. 1. 16:13·알고리즘 (PS)/BOJ
반응형

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

 

2565번: 전깃줄

첫째 줄에는 두 전봇대 사이의 전깃줄의 개수가 주어진다. 전깃줄의 개수는 100 이하의 자연수이다. 둘째 줄부터 한 줄에 하나씩 전깃줄이 A전봇대와 연결되는 위치의 번호와 B전봇대와 연결되는

www.acmicpc.net

개인적으로 solved.ac 난이도에 비해 힘들게 푼 DP 문제이다.

이 문제는 1가지만 떠올리면 정말 정말 쉽게 풀린다.

 

현재 문제에서 요구하는게 '없애야 하는 전깃줄 개수의 최솟값'이다.

하지만 전체 전깃줄의 개수가 고정되어 있다는 점에서 이를 뒤집어 생각하면

'남겨야 하는 전깃줄 개수의 최댓값'을 구해서 이 문제를 풀 수도 있다.

이렇게 발상의 전환만 성공했다면, 이 문제는 단순한 LIS 문제로 바뀐다.

(나는 이 발상의 전환이 생각보다 많이 힘들었다.)

 

전깃줄을 A 지점 위치 기준으로 정렬시키고

가장 작은 위치의 전깃줄부터 하나씩 순회하면서

i 번째 전깃줄을 포함하는 경우, 최대 남길 수 있는 전깃줄의 개수를 센다.

 

i 번째 전깃줄의 A 위치와 B 위치를 ia, ib 라고 하면

i 번째 전깃줄을 포함하여 최대 전깃줄 포함 갯수는

MAX ( ka < ia, kb < ib 인 k번째 전깃줄 ( 0<= k < i) 의 최대 전깃줄 포함 갯수 ) + 1 이다.

 

이 DP 식을 그대로 구현하면 O(N^2) 의 시간복잡도로 문제를 풀 수 있다.

 

한가지 주의할 점은, 마지막 출력이 n - max(dp) 이지, n - dp[-1] 가 아니라는 점이다.

이 문제의 예제가 기가막히게 오름차순형태로 dp가 쌓아지는 모양이라

dp 테이블의 가장 마지막값이 최댓값이 된다는 착각을 하기가 쉽다.

 

import sys
def solve():
    n = int(input())
    l = []
    for _ in range(n):
        l.append((tuple(map(int, input().split()))))
    l.sort()
    dp = [1 for _ in range(n)]
    for i in range(n):
        a, b = l[i]
        for k in range(i-1, -1, -1):
            _a, _b = l[k]
            if _a < a and _b < b:
                dp[i] = max(dp[i], dp[k] + 1)

    print(n - max(dp))


if __name__ == '__main__':
    solve()
반응형
저작자표시 비영리 변경금지 (새창열림)

'알고리즘 (PS) > BOJ' 카테고리의 다른 글

[백준] 1647 - 도시 분할 계획 (G4)  (0) 2021.12.07
[백준] 13460 - 구슬 탈출 2 (G1)  (0) 2021.12.04
[백준] 16946 - 벽 부수고 이동하기 4 (G2)  (0) 2021.12.01
[백준] 12100 - 2048 (Easy) (G2)  (0) 2021.11.24
[백준] 2473 - 세 용액 (G4)  (0) 2021.11.21
'알고리즘 (PS)/BOJ' 카테고리의 다른 글
  • [백준] 1647 - 도시 분할 계획 (G4)
  • [백준] 13460 - 구슬 탈출 2 (G1)
  • [백준] 16946 - 벽 부수고 이동하기 4 (G2)
  • [백준] 12100 - 2048 (Easy) (G2)
에버듀
에버듀
개발은 좋은데 뭘로 개발할까
  • 에버듀
    Blog. 에버듀
    에버듀
  • 전체
    오늘
    어제
    • 분류 전체보기 (615) N
      • 개인 프로젝트 (43)
        • 토이 프로젝트 (3)
        • [2020] 카카오톡 봇 (9)
        • [2021] 코드악보 공유APP (22)
        • [2022] 유튜브 뮤직 클론코딩 (9)
        • [2025] 한글 SQL 데이터베이스 (0)
      • 팀 프로젝트 (22)
        • [2020] 인공지능 숫자야구 (4)
        • [2022] OSAM 온라인 해커톤 (10)
        • [2024] GDSC 프로젝트 트랙 (6)
        • [2025] 큰소리 웹 페이지 (2)
      • CS (335)
        • 자료구조 (19)
        • 어셈블리 (41)
        • 멀티미디어응용수학 (7)
        • 컴퓨터 구조 (29)
        • 알고리즘 분석 (4)
        • 컴퓨터 네트워크 (38)
        • 프로그래밍언어론 (15)
        • HCI 윈도우즈프로그래밍 (26)
        • 기초데이터베이스 (29)
        • 운영체제 (23)
        • 오토마타 (24)
        • 문제해결기법 (11)
        • 블록체인 (22)
        • 소프트웨어공학 (21)
        • 기계학습심화 (12)
        • 컴퓨터그래픽스와 메타버스 (8)
        • 분산시스템특론 (6)
      • 자기계발 (45) N
        • 생각 정리 (23) N
        • 대외활동 (11)
        • 동아리 (7)
        • 자격증 (3)
        • 머니 스터디 (1)
      • 알고리즘 (PS) (107)
        • BOJ (101)
        • Programmers (5)
        • 알고리즘 이모저모 (1)
      • WEB(BE) (8)
        • express.js (1)
        • Spring & Spring Boot (7)
      • WEB(FE) (2)
        • html, css, js (1)
        • React.js (1)
      • Tool & Language (6)
        • Edit Plus (1)
        • Git (1)
        • Python3 (2)
        • Java (2)
      • Infra (12)
        • AWS (1)
        • Oracle Cloud (8)
        • Firebase (2)
        • Network (1)
      • Android (18)
        • Java (6)
        • Flutter (12)
      • Window (2)
        • Visual Studio 없이 WPF (1)
        • MFC (1)
      • 독서 (14)
        • Inside Javascript (7)
        • Database Internals (6)
        • 한 글 후기 (1)
  • 링크

    • github
    • website
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
에버듀
[백준] 2565 - 전깃줄 (S1)
상단으로

티스토리툴바