반응형
오늘은 실버 5단계인 백준 13909번 창문닫기 리뷰입니다.(문제 해결법을 깨닫고 재밌어서 바로 글남김)
문제를 요약하자면, N번째 사람은 N의 배수인 창문을 닫거나 열어서 마지막에 몇 개의 창문이 열려있는지 맞히는 문제
문제 해결을 위해 7번째 사람까지 메모장에 작성해 보며 찾은 규칙성은 N의 약수의 개수가 짝수면 창문이 열리고 홀수면 닫히는 것이다.
그래서 작성한 코드는 아래와 같다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Number_13909 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
int windowCount = 0;
for(int i = 1 ; i <= N ; i++) {
// 약수의 개수가 짝수이면 창문이 닫힌 상태
if(getDivisorCount(i) % 2 != 0) {
windowCount++;
}
}
bw.write(String.valueOf(windowCount));
br.close();
bw.flush();
bw.close();
}
public static int getDivisorCount(int a) {
int count = 0;
for(int i = 1 ; i <= Math.sqrt(a) ; i++) {
if(a % i == 0) count++;
}
if(Math.sqrt(a) * 10 % 10 == 0) {
return count * 2 - 1;
}else{
return count * 2;
}
}
}
어제 바로 유튜브로 시간 복잡도를 공부했는데, 딱 봐도 이중 루프라서 시간제한이 2초정도는 되야 할거 같았는데 주어진 것은 1초였다. 결과는 바로
시간 제한이 1초인 것을 보고 약수의 개수를 찾아 푸는 문제는 아니라고 생각했다.
그래서 N을 9 정도까지 메모장에 작성하다가 깨달은 점은 특정 숫자에만 약수의 개수가 홀수라는 사실을 깨달았다.
1, 4, 9
맞다. 바로 제곱근들이다. 실제로 문제 예시를 24로 한 것도 25를 염두에 두고 예시로 준 것이 아닌가 생각했다.
그래서 N이 제곱근일 때만 창문이 열리고 그 외에는 다 닫힌다.
사실 getDivisorCount를 만들 때 제곱근이냐 아니냐에 따라 약수의 개수를 -1을 해줬는데 더 효율적인 방법이 있었던 것이다. 아무튼 그래서 완성된 코드는 아래와 같다. (여기까지 해놓고 For문으로 제곱근을 일일이 찾은 내가 레전드)
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Number_13909 {
public static void main(String[] args) throws IOException {
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)));
br.close();
bw.flush();
bw.close();
}
}
재밌었다.
반응형
'Algorithm > Baekjoon' 카테고리의 다른 글
[백준][JAVA] 1003번 : 피보나치 함수(동적계획법과 메모이제이션을 활용한 풀이) (1) | 2023.12.08 |
---|---|
자바 배열로 스택 구현해보기(백준 28278번 : 스택 2) (2) | 2023.12.07 |
[백준 알고리즘][자바] 1475번 : 방 번호 (0) | 2023.05.05 |
[백준 알고리즘][자바] 1158번 : 요세푸스 문제 (0) | 2023.04.26 |
[백준 알고리즘][자바] 4673번 : 셀프넘버, 자릿수 판별하는 방법 (0) | 2023.04.24 |
댓글