정답 비율이 40%라 도전해봤는데 문제가 짧아서 당황했다.
문제를 읽어보니 문제 제목과 똑같이 입력받은 수로 어떠한 수를 나누었을 때 몫과 나머지가 같은 수들의 합을 구하면 되는 간단한 문제였다.
이런 문제 정답 비율이 왜 이렇게 낮을까 생각하고 문제 풀이를 시작했다.
입력받은 수를 n이라 했을 때 어떠한 수를 나누는 상황에서 나머지가 생기는 경우는 n-1가지의 경우이다.
( 나머지는 나누는 수 보다 무조건 작고, 1~n-1까지의 수이다. )
이러한 원리로 1부터 n-1까지 어떠한 수의 몫과 나머지가 같은 수를 만들어 더해주면 될 거라 생각했다.
아래는 처음에 작성한 Java 코드이다.
import java.util.Scanner;
public class SameMod {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int num = scan.nextInt();
int sum = 0;
for (int i = 1; i < num; i++) {
sum += (num*i)+i;
}
System.out.print(sum);
}
}
무조건 맞았다고 생각하고 제출해봤는데 0.1초만에 틀렸다.....
아무리 봐도 틀린 이유를 못찾았다. 그러다가 문제 조건을 다시 읽어 봤다.
틀린 이유는 여기에 있었다. 200,000,000을 입력받는다 가정하면
최대 200,000,000 * 199,999,999 + 199,999,999 까지의 수보다 더 많은 수를 표현해야 한다.
하지만, int로 표현할 수 있는 범위는 이보다 작다.
그래서 num과 sum을 long으로 바꾸어 제출 했더니 맞았다.
이 문제 정답 비율이 낮았던 이유는 아마도 이 부분을 다 신경 쓰지 않았기 때문인 것 같다.
다음은 정답 Java 코드이다.
import java.util.Scanner;
public class SameMod {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
long num = scan.nextInt();
long sum = 0;
for (int i = 1; i < num; i++) {
sum += (num*i)+i;
}
System.out.print(sum);
}
}