23-05-25 TIL

more·2023년 5월 25일

문제

  1. 백준 10815 문제를 자바로 해결 시도
    1-1. 배열 두개를 만들어서 직접 비교해보려함
    1-2. 시간초과가 계속 뜸
  2. 백준 14425 문제를 자바로 풀어봄
    1-1. 이진 탐색을 해서 배열에 존재하는 값과 같으면 count++ 해줌
    1-2. count가 정상적으로 출력되지 않는다.

시도

  1. 시간초과를 해결해보기 위한 시도
    1-1. BufferedReader를 사용해봄
    -> 안됨
    1-2. BufferedWriter를 사용해봄
    -> 안됨
    1-3. 자바말고 다른 언어를 사용해봄
    -> C언어 사용 -> 여전히 시간초과
    1-4. 알고리즘에 문제가 있을 수 있겠다고 생각, 코드를 다시 살펴봄. 직접 배열을 하나하나 비교하는게 시간이 많이 걸리면 정렬이나 탐색 알고리즘을 사용하면 좀 줄어드나?
    -> 탐색 알고리즘을 적용해봐야 할듯
  2. 여러 가지 시도
    2-1. String 값이 제대로 들어가지 않았나 싶어서 String 값 출력해봄
    -> 제대로 출력됨
    2-2. Objects.equals의 반환 값 문제인가 싶어서 compareTo로 비교해봄
    -> 일단 이 방식은 맞는데 count 값에 대한 해결은 안됨
    2-3. count++ 가 제대로 안 먹히나?
    -> sout으로 해봤는데 제대로 찍힘
    2-4. BufferedWriter 문제 일 것으로 예상

해결

  1. 일단 이진 탐색 알고리즘을 사용
    1-1. 우선은 sort로 정렬을 하고 시작 + BufferedReader, BufferedWriter도 사용
    1-2. 정렬한 Array를 이진 탐색
    1-3. 해결
  2. BufferedWriter에서 제대로 된 int값을 출력하지 않는다는 것을 확인
    2-1. 그러면 String 값만 출력되는 건가?
    2-2. String만 출력되는 것으로 확인
    2-3. String을 형변환을 시켜주면 될 것으로 보임
    -> String.valueOf()라는 것을 쓰면 된다고 나옴
    2-4. 해결

알게 된 점

  1. 일일히 배열을 비교하는 것은 O(n^2) 이 걸릴 것으로 예상되지만 이진 탐색은 O(logN)이 걸린다.
    1-1. 중간을 기준으로 탐색 대상을 절반씩 줄여나가기 때문
  2. BufferedWriter가 String 값만 출력해준다는 것을 처음 알았다... 공부 좀 하자
    2-2. String.valueOf() 말고 Integer.toString()이라는 메서드도 integer를 String으로 바꿔줄 수 있다.
    -> 다만 null이 들어오면 String.valueOf()는 null을 문자열로 받아드리지만 Integer.toString()은 Null PointerException 발생... 예외 처리 해줘야함.

자바는 뭔가 쓸만한게 많음 그래서 외울 것도...

0개의 댓글