0_ch4n
기계쟁이\n개발자
0_ch4n
0chn.xxx@gmail.com @0ch._.n
전체 방문자
오늘
어제

공지사항

  • All (282)
    • 🖥 CS (21)
      • 네트워크 (12)
      • 운영체제 (3)
      • 자료구조 (2)
      • Web (4)
    • 🧠 Algorithm (185)
      • [C] BOJ (93)
      • [JAVA] Programmers (91)
    • 📚 Study (69)
      • HTML&CSS (19)
      • MySQL (11)
      • JAVA (22)
      • Servlet&JSP (8)
      • Thymeleaf (2)
      • Spring (5)
      • JPA (2)
    • 📖 Book (1)
    • 📃 Certification (6)
      • 정보처리기사 (6)

인기 글

최근 글

최근 댓글

태그

  • CSS
  • Programmers
  • 코딩테스트
  • 프로그래머스
  • 자바
  • java
  • kakao
  • 카카오
  • 코테
  • til

블로그 메뉴

  • 홈
  • 태그
  • 방명록

티스토리

hELLO · Designed By 정상우.
0_ch4n

기계쟁이\n개발자

[12923번] 숫자 블록
🧠 Algorithm/[JAVA] Programmers

[12923번] 숫자 블록

2022. 8. 18. 21:55
반응형

 

✔️ 문제 설명

그렙시에는 0으로 된 도로에 숫자 블록을 설치하기로 하였습니다. 숫자 블록의 규칙은 다음과 같습니다.

블록의 번호가 n 일 때, 가장 처음 블록은 n * 2번째 위치에 설치합니다. 그다음은 n * 3, 그다음은 n * 4, ...로 진행합니다.만약 기존에 블록이 깔려있는 자리라면 그 블록을빼고 새로운 블록으로 집어넣습니다.

예를 들어 1번 블록은 2,3,4,5, ... 인 위치에 우선 설치합니다. 그다음 2번 블록은 4,6,8,10, ... 인 위치에 설치하고, 3번 블록은 6,9,12... 인 위치에 설치합니다.

이렇게 3번 블록까지 설치하고 나면 첫 10개의 블록은 0, 1, 1, 2, 1, 3, 1, 2, 3, 2이됩니다.

그렙시는 길이가 1,000,000,000인 도로에 1번 블록부터 시작하여 10,000,000번 블록까지 위의 규칙으로 모두 놓았습니다.

그렙시의 시장님은 특정 구간의 어떤 블록이 깔려 있는지 알고 싶습니다.

구간을 나타내는 두 수 begin, end 가 매개변수로 주어 질 때, 그 구간에 깔려 있는 블록의 숫자 배열(리스트)을 return하는 solution 함수를 완성해 주세요.

 

✔️ 제한 사항

  • begin, end 는 1 이상 1,000,000,000이하의 자연수 이고, begin는 항상 end보다 작습니다.
  • end - begin 의 값은 항상 10,000을 넘지 않습니다.

 

✔️ 입출력 예

입출력 예 #1

다음과 같이 블럭이 깔리게 됩니다.

 

✔️ 코드 구상

입출력 예제에서 표를 잘 살펴보면 규칙이 보인다.

begin ~ end 까지 순회하면서 1이라면 0, 소수라면 1, 그 외엔 최대 약수를 담은 배열을 반환하면 된다.

이 문제의 포인트는 블록이 10,000,000번까지 있다는 것과 엄청 큰 수의 효율성 테스트 케이스이다.

최대 약수를 구하는 부분에서 최대한 시간을 줄여야 할 것 같다.

 

✔️ 코드

class Solution {
    public int[] solution(long begin, long end) {
        int diff = (int) (end - begin) + 1;
        int[] answer = new int[diff];

        for(int i = 0; i < diff; i++) {
            long num = begin + i;

            if(num == 1) {
                answer[i] = 0;
                continue;
            }

            if(isPrime(num)) {
                answer[i] = 1;
                continue;
            }

            for(long j = Math.max(2, num / 10000000); j * j <= num; j++) {
                if(num / j <= 10000000 && num % j == 0) {
                    answer[i] = (int) (num / j);
                    break;
                } else {
                    answer[i] = 1;
                }
            }
        }

        return answer;
    }

    public boolean isPrime(long n) {
        for (int i = 2; i <= Math.sqrt(n); i++) {
            if (n % i == 0) {
                return false;
            }
        }
        return true;
    }
}

 

📄 원문

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

반응형
저작자표시 (새창열림)

'🧠 Algorithm > [JAVA] Programmers' 카테고리의 다른 글

[118666번] 성격 유형 검사하기  (1) 2022.08.22
[118667번] 두 큐 합 같게 만들기  (0) 2022.08.19
[12913번] 땅따먹기  (0) 2022.08.16
[12900번] 2 x n 타일링  (0) 2022.08.11
[12949번] 행렬의 곱셈  (0) 2022.08.10
    0_ch4n
    0_ch4n
    while(true) { study(); }

    티스토리툴바