백준 10951

YJ·2022년 5월 12일
0

- 문제

이번 문제는 사실 이해가 안됐다. 아직 백준 문제를 여러개
풀어본 것은 아니지만 가끔 조건이나 설명이 부실해 이해가
안가거나 어떤 답을 원하는지 알기 어려울 때가 있다.


내 의문은 두 가지였다.

  1. 종료 시점이 지정되지 않았는데 어떻게 코드를 작성하지?
  2. 입력 받을 때 마다 해당하는 결과를 출력하는 과정을
    반복할 것인지, 모든 입력을 받고 모든 결과가 출력될 것인지?

코드를 몇가지 짜봤지만, 종료 시점을 어떻게 지정해야 하는지,
어떻게 문제를 풀 수 있을지 머릿속에 그려지지 않았다.


따라서 구글검색을 통해 도움을 받았다.
https://st-lab.tistory.com/40
비슷한 상황에서 헤매고 있다면 위 글을 한 번 읽어보면 될 것이다.


위 블로그에서 얻은 내용을 정리하자면,

  1. Scanner를 썼을 경우 while문의 조건 식으로 hasNext(),
    hasNextInt()을 사용할 수 있고, BurfferedReader를 사용했을
    경우 readLine()을 통해 조건식을 만들 수 있다.
  1. 위와 같이 코드를 작성한 경우에도 EOF(종료 시점)를
    체크해줄 수 없는 것은 똑같다. 이유는 우리가 사용하는 IDE
    환경에서 마지막 두 값을 입력 받은 후 종료를 나타낼 방법이
    없기 때문이다. 다시 말해, 엔터를 치면 엔터키가 입력 값으로
    들어오는 것이지 EOF로 지정되는 것이 아니다. 따라서 윈도우의
    경우 테스트 시 입력이 끝난 후 ctrl + z 단축키를 이용해
    강제로 EOF를 지정해야 한다.
  1. 하지만 백준의 경우 데이터를 넣은 후 EOF를 알아서 지정하는
    로직이 있으므로 해당 코드를 넣었을 때, 정답으로 인정된다.




- 풀이

여러가지 방법을 사용할 수 있지만 위와 같은 풀이가 속도가
빠른 편에 속하는 것 같다. 위 블로그에 보면 for문 안에서
객체 선언이 반복되는 StringTokenizer를 사용했을 경우와 비교해,
charAt을 통한 풀이도 제공하고 있다. 둘을 비교 했을 때, 객체
선언이 이루어지지 않아 후자가 더 빠르다고 말하고 있다.

내용적으로만 봤을 때는 고개를 끄덕이게 된다. 하지만 실제로는
올바른 테스트 케이스가 작성된건지 의문이다.


나의 경우 블로그와 다르게 위 charAt을 사용했을 때와 아래
StringTokenizer를 사용했을 때의 결과를 비교해보면 전자가
후자 보다 느리다는 결과를 얻을 수 있었다.

이에 관련해 이 전 문제를 풀면서 가졌던 의문과 내가 짰던
테스트 케이스의 오류에 대해 정리해 보겠다.
(사실 따로 정리한줄 알았는데, 까먹었던 것 같다.)




- 잘못된 Test와 알게된 점


https://okky.kr/article/1218860

위 글을 보면 어떤 문제가 있었는지 알 수 있다. 간단하게 정리하면
readLine을 사용한 코드에서, for문 안에 변수를 선언한 경우와 for문
밖에서 변수를 선언한 경우에 대해 속도를 비교해보고 싶었다.

횟수를 높여가며 측정하던 과정에서 우연히 동일 횟수에서 여러 번
반복하는 테스트를 실행하게 됐다. 하지만 이상하게도 동일 횟수임에도
불구하고, 반복할 때 마다 결과가 달랐다. 나는 이 문제에 대한 원인으로
System.currentMillis() 메서드를 생각했다.

하지만 알고 보니 readLine이 들어간 코드가 문제였던 것이다. 즉,
반복 횟수에 따른 차이 보다 readLine에서 해당 데이터를 내가 얼마나
빨리 입력 했느냐, 늦게 입력 했느냐에 따른 차이가 결과를 해석하는데
혼동을 준 것이다.

따라서 이 글 이전에 백준에서 값을 입력 받는 기능이 포함된 문제를
본인 블로그에서 System.currentMillis() 통해 속도 비교한 사례들은
모두 잘못된 것이라고 할 수 있다.

이 전 글과 이 후에 입력 받는 기능이 포함된 문제들에 대해 올바른
테스트를 작성하기 위해서는 start 지점을 입력 받는 과정이 끝난
곳에 코드로 작성해야한다.

추가적인 궁금증은 아래 링크에 재질문을 올렸다.
https://okky.kr/article/1219866
이 내용과는 관련이 없으니 설명은 생략하겠다.


결과적으로 백준이 테스트 시 내부적으로 똑같은 입력 값을 똑같은
속도로 입력하고, EOF를 호출하는 시점까지의 시간이 늘 일치한다면
위 블로그의 테스트가 올바른 결과를 도출했다고 볼 수 있지만,
그렇지 않다면 위 블로그에 테스트로 도출한 결과는 오류가 될 수 있다.

profile
hi

0개의 댓글