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
- 도커
- dp
- BFS
- 구간 트리
- 이분 매칭
- 게이트웨이
- 이분 탐색
- spring cloud
- 플로이드 와샬
- 달팽이
- Logback
- Gradle
- 다익스트라
- 서비스 디스커버리
- 백트래킹
- 스프링 시큐리티
- 비트마스킹
- Spring Cloud Config
- docker-compose
- 구현
- Zuul
- 메모이제이션
- ZuulFilter
- 스택
- 주울
- 트리
- spring boot
- 유레카
- Java
- 완전 탐색
Archives
- Today
- Total
Hello, Freakin world!
[백준 1946번][Java] 신입 사원 - 정렬과 스택 본문
문제 풀이
모든 지원자 중 자신보다 면접, 서류 분야 점수가 더 낮은 사람이 존재하는 경우 탈락하게 됩니다.
입력이 크기 때문에 N^2 로는 통과할 수 없습니다.
아래의 그림을 살펴보면 힌트를 얻을 수 있습니다.
빨간색으로 체크 친 지원자가 떨어지게 되는데, 해당 포인트는 점선으로 이뤄진 영역에 임의의 포인트를 포함합니다.
먼저 x축으로 입력을 정렬한 후 어떤 포인트를 포함하는 경우는 스택에 푸시하지 않고 아닌 경우에 푸시하도록 합니다.
그리고 마지막에 스택의 사이즈를 반환하면 끝.
hasInnerPoint 를 구현할 때 x축은 오름차순이 보장되므로 y축만 비교했습니다.
import java.io.*;
import java.util.*;
public class Main {
static int T,N;
public static void main(String[] args) throws IOException {
InputReader reader = new InputReader();
// InputReader reader = new InputReader("testcase.txt");
T = reader.readInt();
for (int tc = 0; tc < T; tc++) {
N = reader.readInt();
List<Point> applicant = new ArrayList<>();
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(reader.readLine());
int y = Integer.parseInt(st.nextToken());
int x = Integer.parseInt(st.nextToken());
applicant.add(new Point(y, x));
}
applicant.sort(Comparator.comparingInt(point -> point.x));
int ret = solve(applicant);
System.out.println(ret);
}
}
private static int solve(List<Point> applicant) {
List<Point> stack = new ArrayList<>();
for (int i = 0; i < N; i++) {
Point point = applicant.get(i);
if(!hasInnerPoint(applicant.get(i), stack)) {
stack.add(point);
}
}
return stack.size();
}
private static boolean hasInnerPoint(Point point, List<Point> stack) {
if(stack.isEmpty()) return false;
Point top = stack.get(stack.size()-1);
if(top.y < point.y) return true;
return false;
}
}
class Point {
int y, x;
public Point(int y, int x) {
this.y = y;
this.x = x;
}
}
class InputReader {
private BufferedReader br;
public InputReader() {
br = new BufferedReader(new InputStreamReader(System.in));
}
public InputReader(String filepath) {
try {
br = new BufferedReader(new FileReader(filepath));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public List<Character> readLineIntoCharList() throws IOException {
List<Character> l = new ArrayList<>();
while(true) {
int readVal = br.read();
if(readVal == '\n' || readVal == -1) break;
l.add((char)readVal);
}
return l;
}
public boolean ready() throws IOException {
return br.ready();
}
public String readLine() throws IOException {
return br.readLine();
}
public int readInt() throws IOException {
return Integer.parseInt(readLine());
}
public Long readLong() throws IOException {
return Long.parseLong(readLine());
}
}
'알고리즘 > PS' 카테고리의 다른 글
[백준 2522번][Java] 사회망 서비스 - 트리, DP, 메모이제이션 (0) | 2020.10.18 |
---|---|
[백준 1014번][Java] 컨닝 - 비트마스킹, DP, 메모이제이션 (0) | 2020.10.17 |
[백준 2565번][Java] 전깃줄 - 이름만 바뀐 LIS 문제 (0) | 2020.10.16 |
[백준 1965번][Java] 상자 넣기 - 동적 계획법에 대한 고찰 (0) | 2020.10.14 |
[백준 16236번][Java] 아기 상어 - 최단 거리에 있는 여러 노드들 정렬 (0) | 2020.10.14 |
Comments