주녘공부일지

[프로그래머스 C#] Lv.2 소수 찾기 본문

Programmers - C#/CodingTest Lv.2

[프로그래머스 C#] Lv.2 소수 찾기

주녘 2023. 8. 23. 17:24
728x90

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

 

프로그래머스

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

programmers.co.kr

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

- '만들 수 있는' 모든 소수의 개수를 구하는 것이기 때문에 DFS를 떠올렸다면 해결 가능!

- 주의할 부분은 매개변수로 넘긴 방문체크배열은 참조하여 사용하기 때문에, 사용이 끝나면 방문상태를 다시 변경해줘야 함

https://godgjwnsgur7.tistory.com/47

 

[C#] DFS(Depth First Search), BFS(Breadth First Search)

1. DFS(Depth First Search) - 깊이 우선 탐색 조합류 최단거리로 갈 수 있는 경로의 수, 목적지 도달 여부, 등에 사용 - 스택(LIFO) 사용, 재귀 함수 사용 // 스택을 이용 public void DFS(int index) { Node root = nodes[

godgjwnsgur7.tistory.com

+ 소수 체크 범위는 그냥 num - 1 또는 num / 2 로 해도 통과가 안되진 않겠지만, Sqrt를 사용하자. 빠르다.

    using System;
    using System.Collections.Generic;

    public class Solution
    {
        public List<int> list = new List<int>(); // 소수리스트

        public int solution(string numbers)
        {
            int answer = 0;
            bool[] boolArray = new bool[numbers.Length]; 
            char[] charArray = new char[numbers.Length]; 

            for (int i = 0; i < numbers.Length; i++)
            {
                boolArray[i] = false; // 방문 배열
                charArray[i] = numbers[i]; // 숫자 조각
            }

            DFS(boolArray, charArray, new string(""));

            foreach (int num in list)
                if (IsCheck(num))
                    answer++;

            return answer;
        }
        
        // 재귀 대상 DFS 함수
        public void DFS(bool[] boolArray, char[] charArray, string str)
        {
            if (str.Length == boolArray.Length)
                return;

            for (int i = 0; i < boolArray.Length; i++)
            {
                if (boolArray[i])
                    continue;

                boolArray[i] = true;
                DFS(boolArray, charArray, str + charArray[i]);
                boolArray[i] = false; // 참조하여 사용하기 때문에 해제 필수!

                int tempNum = Int32.Parse(str + charArray[i]);
                if (!list.Contains(tempNum))
                    list.Add(tempNum); // 소수 리스트에 추가
            }
        }

        // 소수 체크 함수
        public bool IsCheck(int num)
        {
            if (num <= 1)
                return false;

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

            return true;
        }
    }
728x90