250x250
250x250
JinSeopKim
Hello World!
JinSeopKim
전체 방문자
오늘
어제
  • 분류 전체보기 (168)
    • Artificial intelligence (14)
      • DeepDiveToAI (3)
      • Pytorch (3)
      • Etc (8)
    • Back-end (19)
      • Spring (10)
      • JPA (9)
    • Language (24)
      • Python (3)
      • Java (11)
      • Swift (10)
    • Math (4)
      • Linear Algebra (4)
    • CodingTest (79)
      • Algolithm (12)
      • Backjoon (25)
      • Programmers (42)
    • Etc (27)
      • Book Review (3)
      • Adsp (6)
      • Life (2)
      • Docker (1)
      • odds and ends (15)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • GitHub

인기 글

태그

  • DP
  • 구현
  • Python
  • 알고리즘
  • SpringMVC
  • 선형대수
  • uArm
  • 머신러닝
  • 자바
  • 문제풀이
  • JPA
  • java
  • BFS
  • AI
  • 프로그래머스
  • 개발
  • JAVA8
  • Front-end
  • ios
  • certificate
  • 코딩테스트
  • ADsP
  • 개발자
  • swift
  • BOJ
  • 파이썬
  • 카카오
  • 브루트포스
  • data
  • 백준

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
JinSeopKim

Hello World!

[카카오] k진수에서 소수 개수 구하기 (java)
CodingTest/Programmers

[카카오] k진수에서 소수 개수 구하기 (java)

2022. 1. 22. 20:38
728x90
728x90

문제링크

https://programmers.co.kr/learn/courses/30/lessons/92335#

 

코딩테스트 연습 - k진수에서 소수 개수 구하기

문제 설명 양의 정수 n이 주어집니다. 이 숫자를 k진수로 바꿨을 때, 변환된 수 안에 아래 조건에 맞는 소수(Prime number)가 몇 개인지 알아보려 합니다. 0P0처럼 소수 양쪽에 0이 있는 경우 P0처럼 소

programmers.co.kr

문제풀이

👨🏻‍💻 핵심 스킬 👨🏻‍💻
  소수, 재귀

n으로 주어진 숫자를 k진수로 변경한 후 0을 오른쪽 또는 왼쪽으로 가지고 있는 수들이 소수인지 판단하여 개수를 구해주는 문제이다.

 

10진수인 n을 k진수로 변경하는 방법은 재귀와 나누기 그리고 %연산을 활용하여 만들 수 있다. %연산을 하여 구한 mod값을 앞쪽에 붙여주고, 나누기 연산을 해서 재귀적으로 돌려준다. 나누기 연산을 했을 때 그 값이 k보다 작게 된다면 k진수를 알맞게 구해준 것이라고 할 수 있다.

 

k 진수의 값을 구해주었다면, String의 split을 활용하여 0이 양옆으로 붙어있는 값들을 잘라내어준다. 그리고 그 값이 소수인지 확인하기 위해 2부터 %연산자를 활용해 나누어 떨어지는지(mod = 0) 계산한다. 이 때 2부터 소수인지 구하려고 하는 값까지 모두 체크해주는 것은 굉장히 비효율 적이기 때문에 그 값의 $√n$값 까지만 수행해주어도 된다.

 

2021.10.10 - [CordingTest/Algolithm] - 최대, 최소공배수 그리고 소수 소수를 구하는 방법을 알아보고 싶으면 왼쪽 링크를 확인해 주면된다.

 

에라토스테네스의 체로 구현을 하지 않은 이유는, 값이 Integer의 범위를 넘어가는 경우도 있기 때문이다.

 

구현코드

public class Solution {

    public int solution(int n, int k) {
        int answer = 0;
        String value = makeJinSu(n, k,"");
        String[] values = value.split("0+");

        for (int i = 0; i < values.length; i++) {
            if (values[i].equals("1"))
                continue;
            if (isPrime(Long.parseLong(values[i])))
                answer++;
        }
        return answer;
    }

    private boolean isPrime(long val) {
        if(val == 1L)
            return false;
        
        for (long j = 2; j * j <= val; j++) {
            if (val % j == 0) {
                return false;
            }
        }
        return true;
    }

    public String makeJinSu(int n, int k,String result) {
        if(n < k)
            return n%k+result;
        return makeJinSu(n/k,k,n%k + result);
    }
}

 

시간복잡도

소수를 구해주는 시간 $O(n/k)$  n의 값을 k로 나누어준 만큼 돌아주기 때문에

소수인지 체크해주기 위해 걸리는 시간은 $O(√n)$이 된다. 

잘못된 지식이나 궁금한 내용이 있을 경우 편하게 댓글 남겨주시면 감사하겠습니다 :)

 

728x90
728x90
저작자표시 비영리 (새창열림)

'CodingTest > Programmers' 카테고리의 다른 글

[PGM_62048] 멀쩡한 삼각형 (java)  (0) 2022.01.27
[카카오] 양궁대회 (java)  (0) 2022.01.22
[카카오] 주차 요금 계산 (java)  (0) 2022.01.20
[카카오] 단체사진찍기 (java)  (0) 2022.01.16
[카카오] 오픈채팅방 (java)  (0) 2022.01.15
    'CodingTest/Programmers' 카테고리의 다른 글
    • [PGM_62048] 멀쩡한 삼각형 (java)
    • [카카오] 양궁대회 (java)
    • [카카오] 주차 요금 계산 (java)
    • [카카오] 단체사진찍기 (java)
    JinSeopKim
    JinSeopKim
    기록📚

    티스토리툴바