πŸ§‘πŸ»‍πŸ’» Coding Test/⌨️ Programmers

[ ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ ] μ†Œμˆ˜μ°ΎκΈ°

EarthSea 2024. 3. 24. 14:19

 

 

 

πŸ„ μ½”λ”©ν…ŒμŠ€νŠΈ

μ½”λ”©ν…ŒμŠ€νŠΈ 문제 풀이

✍🏻 Github

문제 풀이 github 링크

 

 

문제 μ„€λͺ…

1λΆ€ν„° μž…λ ₯받은 숫자 n 사이에 μžˆλŠ” μ†Œμˆ˜μ˜ 개수λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜, solution을 λ§Œλ“€μ–΄ λ³΄μ„Έμš”.

μ†Œμˆ˜λŠ” 1κ³Ό 자기 μžμ‹ μœΌλ‘œλ§Œ λ‚˜λˆ„μ–΄μ§€λŠ” 수λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

(1은 μ†Œμˆ˜κ°€ μ•„λ‹™λ‹ˆλ‹€.)

 

μ œν•œ 쑰건

  • n은 2이상 1000000μ΄ν•˜μ˜ μžμ—°μˆ˜μž…λ‹ˆλ‹€.

 

μž…μΆœλ ₯ 예

n result
10 4
5 3

 

μž…μΆœλ ₯ 예 μ„€λͺ…

μž…μΆœλ ₯ 예 #1

1λΆ€ν„° 10 μ‚¬μ΄μ˜ μ†Œμˆ˜λŠ” [2,3,5,7] 4κ°œκ°€ μ‘΄μž¬ν•˜λ―€λ‘œ 4λ₯Ό λ°˜ν™˜

μž…μΆœλ ₯ 예 #2

1λΆ€ν„° 5 μ‚¬μ΄μ˜ μ†Œμˆ˜λŠ” [2,3,5] 3κ°œκ°€ μ‘΄μž¬ν•˜λ―€λ‘œ 3λ₯Ό λ°˜ν™˜

 

 

문제 풀이

λ‚˜μ˜ 풀이

import Foundation

func solution(_ n:Int) -> Int {
    var primeArray = [Bool](repeating: true, count: n-1)
    var i = 2
    while i*i <= n {
        if primeArray[i-2] {
            stride(from:i*i, through: n, by: i).forEach{
                primeArray[$0-2] = false
            }
        }
        i += 1
    }
    return primeArray.filter{ $0 }.count
}

아무리 풀어도 μ‹œκ°„μ΄ˆκ³Όκ°€ λ‚˜μ„œ μ†Œμˆ˜λ₯Ό μ°ΎλŠ” μˆ˜ν•™μ  곡식이 μžˆλ‚˜ μ‹Άμ–΄μ„œ μ°Ύμ•„λ³΄μ•˜λ”λ‹ˆ “μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체”λΌλŠ” μ†Œμˆ˜λ₯Ό μ°ΎλŠ” λΉ λ₯΄κ³  μ‰¬μš΄ 방법이 μžˆμ—ˆλ‹€.

 

μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체

μ†Œμˆ˜λ₯Ό μ°ΎλŠ” κ°€μž₯ λΉ λ₯΄κ³  μ‰¬μš΄ λ°©λ²•μœΌλ‘œ μ—λΌν† μŠ€ν…Œλ„€μŠ€κ°€ λ°œκ²¬ν•œ 곡식이닀. 방법은 μ•„λž˜μ™€ κ°™λ‹€.

2λΆ€ν„° NκΉŒμ§€μ˜ λ‚˜μ—΄λœ μˆ˜κ°€ μžˆλ‹€.

  1. μ—¬κΈ°μ„œ 2λ₯Ό μ œμ™Έν•œ 2의 배수λ₯Ό μ°Ύμ•„ μ†Œκ±°μ‹œν‚¨λ‹€. → κ²°κ³Ό : 2, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, …
  2. 2의 배수λ₯Ό μ†Œκ±°μ‹œν‚¨ λ°°μ—΄μ—μ„œ 2의 κ·Έλ‹€μŒ 수인 3을 μ œμ™Έν•œ 3의 배수λ₯Ό μ°Ύμ•„ μ†Œκ±°μ‹œν‚¨λ‹€. → κ²°κ³Ό : 2, 3, 5, 7, 11, 13, 17, 19, 23, 25, 29, 31, …
  3. 2와 3의 배수λ₯Ό μ†Œκ±°μ‹œν‚¨ λ°°μ—΄μ—μ„œ 2와 3 λ‹€μŒ 수인 5을 μ œμ™Έν•œ 5의 배수λ₯Ό μ°Ύμ•„ μ†Œκ±°μ‹œν‚¨λ‹€. → κ²°κ³Ό : 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, …
  4. 2와 3κ³Ό 5의 배수λ₯Ό μ†Œκ±°μ‹œν‚¨ λ°°μ—΄μ—μ„œ 2, 3, 5 λ‹€μŒ 수인 7을 μ œμ™Έν•œ 7의 배수λ₯Ό μ°Ύμ•„ μ†Œκ±°μ‹œν‚¨λ‹€. → κ²°κ³Ό : 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, …
  5. … 11
  6. … 13
  7. … 17

μ—¬κΈ°μ„œ λ§Œμ•½ N 이 μ†Œκ±°μ‹œν‚€λŠ” κ°’μ˜ μ œκ³±λ³΄λ‹€ μž‘λ‹€λ©΄, μ†Œκ±°μ‹œν‚¬ 값이 μ—…μœΌλ―€λ‘œ μ’…λ£Œν•œλ‹€.

예λ₯Ό λ“€μ–΄ N이 100이라고 ν–ˆμ„ λ•Œ 11의 μ œκ³±μ€ 121μ΄λ―€λ‘œ 100을 μ΄ˆκ³Όν•œλ‹€. κ·ΈλŸ¬λ―€λ‘œ 7의 λ°°μˆ˜κΉŒμ§€λ§Œ μ°Ύμ•„ μ†Œκ±°μ‹œμΌœλ„ 1λΆ€ν„° 100κΉŒμ§€μ˜ μ†Œμˆ˜κ°’μ„ 찾을 수 μžˆλŠ” 것이닀.

κ·Έ μ–΄λ–€ 방법보닀 이 방법이 빨랐고, λ‚˜λŠ” 이 방법 κ·Έλƒ₯ μŠ΅λ“ν•˜μ—¬ μ™Έμš°κΈ°λ‘œ ν–ˆλ‹€.

 

 

λ‹€λ₯Έ μ‚¬λžŒ 풀이

func solution(_ n:Int) -> Int {
    var primes:[Bool] = [Bool](repeating:false, count:n+1);
    var count = 0;
    for i in 2...n {
        if(!primes[i]){
            count = count + 1;
        }
        for j in 1...(n/i) {
            primes[i*j]=true;
        }
    }
    return count;
}

이 뢄은 배열을 λ§Œλ“€μ–΄λ‚Έ 뒀에 count λ₯Ό ν•˜μ§€ μ•Šκ³  λ°˜λ³΅λ¬Έμ„ μ‹€ν–‰ν•˜λ©΄μ„œ μ†Œμˆ˜μ˜ 갯수λ₯Ό 카운트 ν•˜μ˜€λ‹€. 배수λ₯Ό false둜 λ§Œλ“œλŠ” 과정을 λ°˜λ³΅λ¬Έμ„ μ‚¬μš©ν•΄ κ΅¬ν˜„ν•˜μ˜€λ‹€.

 

 

μ€‘μš”ν•œ κ°œλ…

  • μ†Œμˆ˜λ₯Ό κ΅¬ν•˜κΈ° μœ„ν•œ κ°€μž₯ λΉ λ₯Έ 방법은 μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체