갓생사는 김초원의 개발 블로그
chocho_log
갓생사는 김초원의 개발 블로그
전체 방문자
오늘
어제
  • 분류 전체보기 (78)
    • 개발 (23)
      • Spring (4)
      • Java (4)
      • Database (2)
      • Elasticsearch (3)
      • ETC (3)
      • JPA (3)
      • 이슈 (1)
    • 코딩 테스트 (43)
      • 프로그래머스 (23)
      • 백준 (12)
      • TIP (8)
    • 자료구조 (2)
    • 알고리즘 (4)
    • 잡생각 (0)
    • 경험 (5)
      • AWS re:Invent 2024 (5)

블로그 메뉴

    공지사항

    인기 글

    태그

    • war
    • jar
    • Lazy Loading
    • 지연로딩
    • 디자인패턴 #SOLID 원칙
    • jpa
    • querydsl
    • Spring Boot Embedded Tomcat

    최근 댓글

    최근 글

    갓생사는 김초원의 개발 블로그

    chocho_log

    코딩 테스트/백준

    [백준][Gold1] 제곱ㄴㄴ수 - JAVA

    2021. 4. 7. 21:31

    [문제 설명]

    www.acmicpc.net/problem/1016

     

    1016번: 제곱 ㄴㄴ 수

    어떤 수 X가 1보다 큰 제곱수로 나누어 떨어지지 않을 때, 제곱ㄴㄴ수라고 한다. 제곱수는 정수의 제곱이다. min과 max가 주어지면, min과 max를 포함한 사이에 제곱ㄴㄴ수가 몇 개 있는지 출력한다.

    www.acmicpc.net

     

    문제는 간단하지만 풀다보니 시간효율성을 통과하는 것이 까다로워 가히 Gold 레벨에 있는것이 납득이 가는 문제다. 

    문제를 읽고 일반 코드로 풀어보니 시간 초과가 나면서 통과하지 못했다. 

    에라토스테네스의 체 원리를 이용하여 된다.

     

    [JAVA code]

    package com.algorithm.baekjoon.silver5;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.Arrays;
    
    public class Test05 {
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String[] strs = br.readLine().split(" ");
            long min = Long.parseLong(strs[0]);
            long max = Long.parseLong(strs[1]);
            solution(min, max);
        }
    
        public static void solution(long min, long max) {
            boolean[] checkArray = new boolean[1000001];
            Arrays.fill(checkArray, false);
    
            int end = (int) Math.sqrt(max);
            for (int i = 2; i <= end; i++) {
                long pow = (long) Math.pow(i, 2);
                long count = min / pow == 0 ? pow : (min / pow) * pow;
                for (long j = count; j <= max; j += pow) {
                    if (j >= min) {
                        if (checkArray[(int) (j - min)]) {
                            continue;
                        }
                        checkArray[(int) (j - min)] = true;
                    }
                }
            }
    
            long answer = 0;
            for (int i = 0; i < checkArray.length; i++) {
                answer += checkArray[i] == true ? 1 : 0;
            }
    
            System.out.println(max - min + 1 - answer);
        }
    }
    

    '코딩 테스트 > 백준' 카테고리의 다른 글

    [백준][Gold1]11401-이항계수3-JAVA  (0) 2021.04.27
    [백준][Gold1] 구간 합 구하기 - JAVA  (0) 2021.04.13
    [백준][Gold1] 책 페이지 - JAVA  (0) 2021.04.10
    [백준][silver5][JAVA] 1010-다리 놓기  (0) 2021.03.30
    [백준][silver4][JAVA]터렛  (2) 2021.03.28
      '코딩 테스트/백준' 카테고리의 다른 글
      • [백준][Gold1] 구간 합 구하기 - JAVA
      • [백준][Gold1] 책 페이지 - JAVA
      • [백준][silver5][JAVA] 1010-다리 놓기
      • [백준][silver4][JAVA]터렛
      갓생사는 김초원의 개발 블로그
      갓생사는 김초원의 개발 블로그
      갓생사는 김초원의 개발 블로그 github: https://github.com/kimchowon

      티스토리툴바