dkan601   2년 전

답은 다 맞게 나오는 것 같은데 구글링으로 1193 푸셨던 분들의 코드를 보니 전부 홀수 짝수 나눠서 푸셨더라구요..

저는 그렇게 효율적으로 생각하지 못해서 약간 무식한 방법으로 푼것같은데..

제가 짠 코드의 반례를 찾아주실 수 있을까요?

아니면 구글링해서 나온 코드들처럼 홀수 짝수 나누어서만 풀어야 하는건가요..?

bamgoesn   2년 전

4, 7, 11 등 분모나 분자가 1이 되는 입력에서 아무것도 출력하지 않습니다.

또한 위 풀이를 무식하게 푸셨다고 했는데, 시간 제한과 메모리 제한 안에서 주어진 제한에 맞는 입력에서 정답을 출력하기만 하면 상관 없습니다. 만약 이 문제에서 X의 최댓값이 10^14라거나 하면 위 코드는 시간 내로 정답을 출력하지 못 하기 때문에 이러면 문제가 맞지만, 이 문제는 그렇지 않기 때문에 지금 푸신 것처럼 하셔도 됩니다.

------------

다른 분들의 코드는 대부분 다음과 같은 논리를 거칩니다.

우선 찾고자 하는 분수가 몇 번째 대각선에 있는지를 먼저 찾은 다음, 그 대각선에서 어느 방향으로 분수를 세는지 찾고, 몇 번째 위치에 있는 분수가 정답인지를 알면 됩니다. 이러면 훨씬 빠르게 답을 찾을 수 있는데, 그 이유는 처음에 대각선 단위로 카운팅을 하면 한 번에 건너뛰는 분수가 많기 때문입니다.

지금 방식대로면 한번에 하나의 분수만을 세니까 X번 루프를 돌려야 하지만, 대각선 단위로 센다면 처음엔 1개, 다음엔 2개, 3개, 4개... 순으로 분수를 건너뛰기 때문에 대략 루트2X회 정도의 루프만 돌려도 충분합니다.

그 다음에 대각선이 홀수번째인지 짝수번째인지 알면 그 대각선은 어느 방향에서 세어나가는지 알 수 있습니다.

마지막으로 지금까지 대각선을 세면서 몇 개의 분수를 건너뛰었는지 알면 앞으로 몇 개의 분수를 더 세어야 하는지 알 수 있습니다. 일일이 세어도 되지만, 간단한 사칙연산을 활용하면 훨씬 빠르게 계산할 수 있습니다.

dkan601   2년 전

친절한 답변 ㅠㅠㅠ 정말 감사합니다.... 

덕분에 다른 분들의 코드도 확실히 이해할 수 있었어요!!

앞으로 반례를 더 꼼꼼하게 생각해봐야겠네요.. 

감사합니다. 좋은 하루 되세요! :)

댓글을 작성하려면 로그인해야 합니다.