처음에 작성한 코드는 문제에서 말한 그대로 풀이를 한 방식이었는데, 숫자가 커지니 메모리 초과가 발생했다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
boolean[] arr = new boolean[N];
for (int i = 1; i <= N; i++) {
for (int j = 0; j < N; j++) {
if ((j + 1) % i == 0) {
arr[j] = !arr[j];
}
}
}
int count = 0;
for (boolean b : arr) {
if (b) count++;
}
bw.write(String.valueOf(count));
bw.close();
다른 방법으로 풀어야겠다 싶어서 규칙을 찾아보니
주어진 수 N이 정수 a의 제곱보다 크거나 같고 a+1의 제곱보다 작을 때 열려있는 창문의 개수가 a개인 것을 발견했다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
int count = 1;
while (true) {
if (Math.pow(count, 2) <= N && N < Math.pow(count + 1, 2)) break;
else count++;
}
bw.write(String.valueOf(count));
bw.close();
정답이긴 했지만 반복문을 사용하지 않는 좀 더 직관적인 방법은 없을까 생각해 봤다.
N의 제곱근을 구하고 소수점 이하를 버리면 count가 나오는 것이 보였다.
최종적으로 코드가 아주 심플해졌다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
bw.write(String.valueOf((int) Math.sqrt(N)));
bw.close();