
어쩌다보니 LIS만 파는 사람 ..
이 문제도 그냥 LIS 길이 구하면 된다.
근데 입출력 때문에 진짜 개빡침
일단 덕분에 BufferedReader에서 EOF를 확인하는 방법을 알게 되었다 ^__^
while((line = br.readLine()) != null)
1. 제출 전에 VSCODE 상에서 입력 값을 넣어 출력이 제대로 잘 나오는지 확인을 해보려는데, 아무리 기다려도 출력이 안 나오는 상황 발생 ㅎ^ㅎ
2. 디버깅을 해보았는데 아니 계속 br.readLine()이 이상하게 나오는거다 ...
3. 알고보니 디버깅하면서 watch 에 br.readLine()을 넣어놨더니 여기에 버퍼가 다 사용되었던 것이었다 뭐 이런 바보같은 일이 ..
4. 그래서 watch에서 삭제하고 다시 돌려보아도 EOF 이후에 클래스가 종료되지 않아 출력이 안 나옴
5. 일단 디버깅으로 확인한 결과 답은 맞게 나오는 걸 확인하고 제출
6. 통과했다 ...
VSCODE의 터미널을 맹신하지 말자.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int[] memo;
public static void main(String[] args) throws IOException{
StringBuilder sb = new StringBuilder();
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line = br.readLine()) != null) {
int N = Integer.parseInt(line.trim());
int[] arr = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0; i<N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
memo = new int[N+1];
int len = 0, idx = 0;
for(int i=0; i<N; i++) {
if (arr[i] > memo[len]) {
len++;
memo[len] = arr[i];
} else {
idx = binarySearch(0, len, arr[i]);
memo[idx] = arr[i];
}
}
sb.append(len+"\n");
}
} catch(Exception e) {
} finally {
System.out.println(sb.toString());
}
}
static int binarySearch(int left, int right, int key) {
int mid;
while(left < right) {
mid = (left+right)/2;
if(memo[mid] < key) {
left = mid+1;
} else {
right = mid;
}
}
return right;
}
}

휴.. 화풀자