문제 해석
이런 식으로 진행했을 때, N명 만큼의 사람이 모두 창문에 대한 처리를 하였을 때, 마지막까지 열려있는 창문의 수를 구하면 된다.
단, 닫혀있으면 열고, 열려있으면 닫는다!!
이 과정을 지켜보니까 약수의 개수가 홀수인 경우 열고-닫고-열기 이니 마지막에는 열려있다.
다시 말해, N까지의 숫자중에 약수의 개수가 홀수인 숫자를 찾으면 되는 문제이다.
정리
n번째 창문이 열려 있으려면, 그 창문을 열고 닫은 횟수가 홀수여야한다.
n = 4일 경우,
첫번째 사람, 두번째 사람, 네번째 사람이 네번째 문을 열고 닫고 연다.
n = 9일 경우,
첫번째 사람, 세번째 사람, 아홉번째 사람이 9번째 문을 열고 닫고 연다.
즉, 약수의 갯수가 3인 n번째 창문이 열려 있다.
따라서 1, 4, 9, 16, 25 .... 를 기점으로 열린 창문의 갯수가 하나씩 증가하는 것을 알 수 있다.
다시 말해 약수가 홀수인 것은 제곱 수밖에 없다는 것!!
코드
import java.io.*;
public class Main {
//입력&출력 부분
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
int count = 0; //창문이 열려있는 개수
for(int i = 1; i * i <= N; i++) { //제곱수만 카운트
count++;
}
bw.write(count + "\n");
br.close();
bw.flush();
bw.close();
}
}
결과
느낀 점
규칙성을 찾아내면 압도적으로 메모리를 아낄수있군용