Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 백준
- programmers
- Codeforces Round #802 (Div. 2)
- 명품 자바 프로그래밍
- SQLD / SQLP
- Python
- 개념
- baekjoon
- 공공데이터
- Java11
- HAVING 절
- 기초100제
- java
- 헤드퍼스트 디자인패턴
- 기초
- level1
- 파이썬
- 단계별로 풀어보기
- pypy3
- 코딩테스트
- 이론
- 자바
- GROUP BY 절
- 응용
- JAVA 11
- BOJ
- Python 3
- 기본
- Codeup
- SELECT 절
Archives
- Today
- Total
Development Project
[ Baekjoon - 10/17 ] - 2457번: 공주님의 정원 본문
2457번: 공주님의 정원
첫째 줄에는 꽃들의 총 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 각 꽃이 피는 날짜와 지는 날짜가 주어진다. 하나의 날짜는 월과 일을 나타내는 두 숫자로 표현된다. 예를 들어서,
www.acmicpc.net
- 소요 시간 : 3시간
- 문제를 읽고 이해하기
- 제한
- 시간 : 1초
- 메모리 : 192MB
- 문제
- N개의 꽃(1≤N≤100,000)
- 3월 1일부터 11월 30일까지 매일 꽃이 한 가지 이상 피어있어야 하고, 가능한 정원에 심는 꽃들의 수를 가능한 적게 해야한다.
- 이해
- 조건대로 수행하면 되는데, 이제 어떻게 접근하여 최적화 할지 생각해야하는 문제이다.
- 제한
- 문제를 익숙한 용어로 재정의와 추상화
- 입출력 형태와 조건을 적어보았고, 기간으로 판단하는 문제이므로 어떤형태로 올수있는지 넘버링하며 적어보았다. 그리디 적으로 접근해야할것같긴한데 확실한 방법이 떠오르진 않아 해결방법을 고민했다.
- 문제를 어떻게 해결할 것인가
- 1st 접근 - 거의 세그먼트 트리? )
- 12개의 월에 각각 있는 날짜를 자식으로 넣어두고 해당날짜가 포함될때마다 +1을 해준다.
- 해당 배열 중 3월 1일~11월 30일에 속하는 부분중에서 최솟값이 가능한 경우의 수라 생각해서 그려본 접근이었다.
- 지금은 문제를 완전히 풀고 이해한 상태라 잘못된 접근이라는것을 알고있지만, 풀때는 저 방법이 정확하다고 생각해서 시간을 많이 쏟았다.. 문제에서 주어진 두번째 입출력 케이스만 넣어봐도 맞지 않다는걸 알수있지만 하나만 해보고 맞다 생각한 착오였다..
- 2nd 접근 - 그리디 )
- 빨리 개화하는 순서대로 정렬한 후, 이를 순회하며
현재 피어 있는 꽃이 지기 전에 피고, 그 중 가장 늦게 지는 꽃을 선택하면 꽃을 최소의 개수로 선택한다.
- 빨리 개화하는 순서대로 정렬한 후, 이를 순회하며
- 1st 접근 - 거의 세그먼트 트리? )
- 위 계획을 검증
- 그리디의 흔한 유형중 하나라 생략
- 계획 수행 (실제코드 작성)
- Python 3
-
import sys input = sys.stdin.readline N = int(input()) flowers = [] # 이전 월의 누적 일수 month = {'1': 0, '2':31, '3':59, '4':90, '5':120, '6':151, '7':181, '8':212, '9':243, '10':273, '11':304, '12':334} for i in range(N): flower = list(input().split()) start = month[flower[0]] + int(flower[1]) end = month[flower[2]] + int(flower[3]) flowers.append([start, end]) flowers.sort() fadeDates = 60 cnt = 0 tmp = 0 for flower in flowers: if flower[0] > fadeDates: if tmp and flower[0] - tmp <= 0: cnt += 1 fadeDates = tmp tmp = 0 if fadeDates > 334: break else: cnt = 0 break tmp = max(tmp, flower[1]) else: if tmp: cnt += 1 if tmp <= 334: cnt = 0 print(cnt)
-
- Python 3
- 결과
'CodingTest > Baekjoon' 카테고리의 다른 글
[ Baekjoon - 10/19 ] - 1644번: 소수의 연속합 (0) | 2022.10.20 |
---|---|
[ Baekjoon - 10/18 ] - 19238번: 스타트 택시 (0) | 2022.10.20 |
[ Baekjoon - 10/15 ] - 20365번: 블로그2 (0) | 2022.10.16 |
[ Baekjoon - 10/14 ] - 3980번: 선발 명단 (1) | 2022.10.14 |
[ Baekjoon - 10/13 ] - 20061번: 모노미노도미노2 (0) | 2022.10.14 |
Comments