[백준] 3745번 오름세 (Java)

subbni·2024년 4월 23일

백준

목록 보기
10/24
post-thumbnail

3745번 문제

문제

풀이

어쩌다보니 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;
    }
}

휴.. 화풀자

profile
개발콩나물

0개의 댓글