일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- docker
- 헥사고날 아키텍처
- DP
- JPA
- BFS
- 비트마스크
- 스프링
- 데이터 flow
- 위상정렬
- 알고리즘
- java
- 다익스트라
- series
- 포트앤어댑터 아키텍처
- UML
- Redis
- 파이썬
- 세그먼트 트리
- ddd
- 백준
- disjoint set
- dfs
- dataframe
- 문자열
- springboot
- 이펙티브 자바
- pandas
- 자바
- equals
- spring security
Archives
- Today
- Total
코딩못하는사람
19584 난개발 (누적합,TreeSet) 본문
https://www.acmicpc.net/problem/19584
1.접근
문제의 예시 그림을 보고 고민을 해보면 X축의 값은 필요없고 Y축으로 압축해서 누적합이 가장 큰 곳을 구하면 된다는 생각을 할 수 있다.
통행량을 계속 증가시켜주기 위해서 구간에 대해서 세그먼트 트리도 생각해보고 여러가지 생각해보았지만 y축으로 정렬하여 존재하는 모든 y축을 돌면서 시작지점에는 +,종료지점에는 -를 해주는 방식을 생각했다.
2.풀이
누적합을 어떻게 구할지 생각하는게 중요한 문제이다.
최대값을 구하려면 y축의 좌표의 값에서의 통행량을 모두 체크해봐야 한다는 것을 알 수 있다.(점에 걸쳐도 인정되므로)
y좌표가 1->3으로 연결되고 통행량이 10, 3->5로 연결되고 통행량이 20이라고 가정해보자.
그러면 1,3,5 모두 들린 y좌표라서 Set자료형에 넣고 iter문을 돌면서 1일때는 +10 3일때는 -10,+20, 5일때는 -20을 해주어서 누적합을 구하는 방식이다.(밑에서 위로 올라가므로 낮은값에 +,높은값에 -를 해주어야 한다.)
또 중요한 것은 무조건 +연산부터 해주어야 한다는 것이다. 점이 걸쳐도 인정되기때문에 위에서 예시로 든 y=3에서 +20으로 연산을 진행해서 최대값을 체크한후 -10을 해주어야한다는 뜻이다.
마지막으로 사용된 y좌표들을 정렬하고 중복없이 체크해야할 필요가 있는다. 처음에는 단순하게 Set자료형을 만들고 거기서 또 정렬을 사용했었는데 시간초과가 났다.
코드를 좀 보고 생각을 고쳐 TreeSet을 사용했더니 통과했다.
3.코드
4.배운점
- 누적합을 구할 때 정렬된 데이터를 for문 돌면서 시작부분에 +,종료지점에 -를 하는방식을 배웠다.
- TreeSet을 자주 사용할 일이 없어서 생각이 잘 안났다. 정렬도 필요하고 중복도 제거하는 TreeSet 잊지말자
'백준 문제풀이(JAVA,Python)' 카테고리의 다른 글
22115 창영이와 커피 [DP] (0) | 2021.08.18 |
---|---|
22116 창영이와 퇴근[priority queue,Binary Search] (0) | 2021.08.18 |
1339 단어수학 (0) | 2021.02.22 |
파이썬 문자열 문제 (find,in,KMP알고리즘) ,7575 바이러스(백준) (0) | 2020.11.27 |
1062 가르침 (비트마스킹) (0) | 2020.11.23 |
Comments