주녘공부일지

[프로그래머스 C#] Lv.2 k진수에서 소수 개수 구하기 본문

Programmers - C#/CodingTest Lv.2

[프로그래머스 C#] Lv.2 k진수에서 소수 개수 구하기

주녘 2023. 8. 25. 16:08
728x90

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

 

프로그래머스

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

programmers.co.kr

1. 정답코드 및 핵심 아이디어, 유의사항

- 코드참조 ( 진수변환 -> 0을 기준으로 숫자 추출 -> 소수체크 )

 

+ 만약 테스트 1번만 시간초과가 뜬다면 소수를 체크하는 부분에서 최적화가 이루어지지 않았기 때문일 확률이 높다.

https://godgjwnsgur7.tistory.com/85

 

[C#] 소수 판별 최적화 알고리즘

1. 소수란? 1과 자기 자신으로만 나누어 떨어지는 수 public static bool IsPrime(int num) { if (num < 2) return false; for (int i = 2; i < num; i++) if (num % i == 0) return false; return true; } 시간복잡도 : O(log(√N) + 사실 일반

godgjwnsgur7.tistory.com

 

+ StringBuilder이 아닌 string으로 사용해도 시간초과는 뜨지 않지만, 문자열 내의 추가, 삭제 등이 많이 이루어진다면 StringBuilder를 사용하는 것이 좋다. // 테스트 1번 기준 2~3초 차이

https://godgjwnsgur7.tistory.com/66

 

[C#] StringBuilder VS String 연산 성능 비교

1. 성능비교 결과 기준 : String += 연산 VS StringBuilder.Insert() VS StringBuilder.Append() 연산 + String의 += 연산은 문자열 뒤에 문자열을 추가하는 것이 아닌, 새로운 문자열을 만드는 연산으로 생각보다 비용

godgjwnsgur7.tistory.com

    using System;
    using System.Text;

    public class Solution
    {
        public int solution(int n, int k)
        {
            int answer = 0;
            long num = 0;
            StringBuilder sb = new StringBuilder();

            // 1. 진수변환
            while (n != 0)
            {
                sb.Insert(0, (n % k).ToString());
                n /= k;
            }
            // 2. 0을 기준으로 숫자를 추출
            for (int i = 0; i < sb.Length; i++)
            {
                if (sb[i] != '0')
                {
                    num *= 10;
                    num += (long)sb[i] - '0';
                }
                else
                {
                    if (Function(num))
                        answer++;
                    num = 0;
                }
            }
            // 예외처리
            if (Function(num))
                answer++;
                
            return answer;
        }

        // 소수 체크 함수
        public bool Function(long num)
        {
            if (num < 2)
                return false;

            for (int i = 2; i <= Math.Sqrt(num); i++)
                if (num % i == 0)
                    return false;

            return true;
        }
    }
728x90