백준 13909 창문 닫기 JAVA 풀이 (수학, O(1))

2026. 3. 24. 16:14·코테(Solved.ac + Programmers)
728x90

🔗 문제 링크

https://www.acmicpc.net/problem/13909


📌 문제 개요

N개의 창문이 있고 처음에는 모두 닫혀 있다.
1번째 사람부터 N번째 사람까지 순서대로 자기 번호의 배수에 해당하는 창문의 상태를 바꾼다.

  • 1번째 사람 → 모든 창문 변경
  • 2번째 사람 → 2, 4, 6, ... 변경
  • 3번째 사람 → 3, 6, 9, ... 변경

이 과정을 모두 수행한 후, 마지막에 열려 있는 창문의 개수를 구하는 문제\


📌 접근 방법

이 문제는 처음 보면 시뮬레이션으로 풀 수 있을 것 같지만,
각 창문이 몇 번 상태가 바뀌는지를 생각하면 더 효율적으로 해결할 수 있다.

i번 창문은 i의 약수에 해당하는 사람들에 의해 상태가 바뀐다.


즉, i번 창문은 i의 약수 개수만큼 토글된다.

처음 상태가 닫힘이므로,

  • 짝수 번 바뀌면 → 닫힘
  • 홀수 번 바뀌면 → 열림

따라서 마지막에 열린 창문은 약수 개수가 홀수인 수이다.


📌 핵심 아이디어

일반적인 수의 약수는 (a, b) 형태로 쌍을 이루기 때문에 개수가 짝수

  • 12 → (1,12), (2,6), (3,4) → 6개

 

하지만 완전제곱수는 가운데 값이 자기 자신과 짝이 된다.

  • 4 → 1, 2, 4 (3개)
  • 9 → 1, 3, 9 (3개)
  • 16 → 1, 2, 4, 8, 16 (5개)

 

즉, 완전제곱수만 약수 개수가 홀수

 

따라서 마지막에 열린 창문 번호는 1, 4, 9, 16, 25 ... 와 같은 완전제곱수

결론적으로 N 이하의 완전제곱수 개수를 구하면 된다.

 

→ 정답 = (int) Math.sqrt(N)


📌 전체 코드

package no_13909;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class No13909 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        System.out.println((int) Math.sqrt(N));
    }
}

📄 정리

이 문제는 창문을 직접 열고 닫는 시뮬레이션 문제가 아니라,
각 창문이 몇 번 토글되는지를 약수 개수로 해석하는 것이 핵심

 

약수 개수가 홀수인 수는 완전제곱수뿐이므로,
결국 마지막에 열린 창문의 개수는 N 이하 완전제곱수 개수

728x90

'코테(Solved.ac + Programmers)' 카테고리의 다른 글

백준 9656 돌 게임 2 JAVA 풀이 (게임이론, 시간복잡도)  (0) 2026.03.26
백준 2669 직사각형 네 개의 합집합의 면적 JAVA 풀이 (브루트포스, 구현, 시간복잡도)  (0) 2026.03.25
백준 8979 올림픽 JAVA 풀이 (정렬, 구현, 시간복잡도)  (0) 2026.03.23
백준 9093 단어 뒤집기 JAVA 풀이 (문자열, 구현, 시간복잡도)  (0) 2026.03.22
백준 1924 2007년 JAVA 풀이 (구현, 시간복잡도)  (0) 2026.03.21
'코테(Solved.ac + Programmers)' 카테고리의 다른 글
  • 백준 9656 돌 게임 2 JAVA 풀이 (게임이론, 시간복잡도)
  • 백준 2669 직사각형 네 개의 합집합의 면적 JAVA 풀이 (브루트포스, 구현, 시간복잡도)
  • 백준 8979 올림픽 JAVA 풀이 (정렬, 구현, 시간복잡도)
  • 백준 9093 단어 뒤집기 JAVA 풀이 (문자열, 구현, 시간복잡도)
PUSH → MERGE → DEPLOY
PUSH → MERGE → DEPLOY
데이터 흐름과 운영 자동화를 설계하는 백엔드 개발자
  • PUSH → MERGE → DEPLOY
    Coding Dongin
    PUSH → MERGE → DEPLOY
  • 전체
    오늘
    어제
    • MEUN
      • 코테(Solved.ac + Programmers)
      • BootCamp(JAVA)
      • JAVA
      • SpringBoot
      • JavaScript
      • JSP
      • DB(SQL)
      • React
      • HTML_CSS
      • jQuery
      • SCSS
      • GSAP
      • 설치 + 꿀팁
      • 정보처리기사 오답노트
      • 정보처리기사 기출문제
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GIT
  • 공지사항

  • 인기 글

  • 태그

    자료구조
    피보나치
    정처기오답노트
    Level2
    level1
    백준
    프로그래머스
    알고리즘
    구현
    실기
    정처기
    배열
    완전탐색
    코딩테스트
    java
    수학
    level0
    자바
    정보처리기사 실기 기출문제
    브루트포스
    springboot
    시뮬레이션
    dp
    정처기실기
    solved.ac
    문자열
    백엔드개발자
    정보처리기사
    기출문제
    정렬
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.4
PUSH → MERGE → DEPLOY
백준 13909 창문 닫기 JAVA 풀이 (수학, O(1))
상단으로

티스토리툴바