λ¬Έμ λ§ν¬
https://www.acmicpc.net/problem/17103
λ¬Έμ ν΄κ²° μμ΄λμ΄
- ν¨μ isPrimeNumber
- νμ¬ μ λ ₯λ°μ μκΉμ§ λ¬΄μ¨ μμκ° μ‘΄μ¬νλμ§ λ°°μ΄λ‘ μ 리
- μλ₯Όλ€μ΄ 9κ° μ λ ₯λλ©΄, [2, 3, 5, 7] μ΄ λ°νλλ€.
- main
- μ λ ₯λ°μ num κΉμ§ λ¬΄μ¨ μμκ° μ‘΄μ¬νλμ§ isPrimeNums λ°°μ΄ μμ±
- 2λΆν° num/2 κΉμ§ λ°λ³΅
- μ num/2 λ? 10μ μλ‘ λ€λ©΄, (3, 7), (5, 5) (7, 3) μ΄λ κ² κ³¨λλ°ν νν°μ μ΄ 3μμ΄ μ‘΄μ¬νκ² λλ€. νμ§λ§ λ¬Έμ μ€λͺ ν΄μ μ΄λ κ² λ κ²½μ°, μμκ° λ€λ°λμ΄λ νλλ‘ μ·¨κΈνλ€κ³ νκΈ°μ, λ΅μ 3μμ΄ μλλΌ 2μμ΄ λλ€. λ°λΌμ num/2 κΉμ§ 루νλ₯Ό λκ²λλ©΄, λ€μ λ°λ³΅λλ κ²λ€μ count νμ§ μκΈ° λλ¬Έμ num/2 λ‘ λ²μλ₯Ό μ€μ νλ€.
- jμ num - j κ° λͺ¨λ primeNums λ°°μ΄μ μ‘΄μ¬νλ€λ©΄, count+1
μ΄ μμ΄λμ΄λ₯Ό κ·Έλλ‘ μ½λλ‘ κ΅¬ννλ€.
λ΄κ° νΌ νμ΄ - μκ°μ΄κ³Ό
*------------ μκ°μ΄κ³Ό ----------------*/
import Foundation
let n = Int(readLine()!)!
//μμ μμ± ν¨μ
func isPrimeNumber (n: Int) -> Array<Int> {
var primeNums: [Int] = []
var check = Array(repeating: true, count: n+1)
check[0] = false
check[1] = false
for i in 0..<n+1 {
if check[i] == true {
var j = 2
while (i*j) <= n {
check[i*j] = false
j += 1
}
}
}
for i in 0..<check.count {
if check[i] == true {
primeNums.append(i)
}
}
return primeNums
}
///μ
λ ₯λ°κΈ°
for i in 0..<n {
let num = Int(readLine()!)! //μ
λ ₯λ°μ μ
var count = 0
let primeNums = isPrimeNumber(n: num) //μ
λ ₯λ°μ numκΉμ§ μ‘΄μ¬νλ μμ
for j in stride(from: 2, through: num/2, by: 1) {
if primeNums.contains(j) { //num-jν κ²°κ³Όκ° μμλ©΄ count+1
if primeNums.contains(num-j) {
count+=1
}
}
}
print(count)
}
λ΄κ° νΌ νμ΄ - λ§μμ΅λλ€!
λΉκ΅μ μ μκ°μ΄κ³ΌμΈμ§ λΉ λ₯Έ μκ°λ΄λ‘ μ°Ύμ μ μμλ€. κ°μ₯ μκ°μ λΉ λ₯΄κ² μ€μΌ μ μλ λ°λ³΅λ¬Έ λ¨Όμ μ΄ν΄λ³΄λ©΄μ λ²μλ₯Ό μμ ν΄μ£Όμκ³ , 2μ°¨λ‘ λ μκ°μ΄κ³Όκ° λ¨κΈΈλ λλ²μ§Έλ‘ μμμμ±ν¨μλ₯Ό Intλ‘ λ°κΎΈλ κ³Όμ μ μ€μ¬μ€μΌλ‘μ¨ μκ°μ΄κ³Όλ₯Ό ν΄κ²° ν μ μμλ€.
- μμ μμ± ν¨μ
- for λ¬Έ λ λ 0λΆν° n+1 λκ²λ¨
- μ΄λ κ² νκ²λλ©΄ μκ°λ³΅μ‘λ O(N)
- λ²μ 2 ~ nμμ nμ μ κ³±κ·Όκ°λ³΄λ€ μμ λΆλΆλ€μ λν μ²λ¦¬κ° λλλ©΄, μ κ³±κ·Όκ°λ³΄λ€ ν° λΆλΆμ κ° λν μ²λ¦¬κ° λλ€λ λ§
- μκ°λ³΅μ‘λλ₯Ό sqrt μ κ³±κ·Όμ μ¬μ©ν΄μ μ€μ¬μ€ μ μλ€.
- μμ μμ±ν¨μ bool → Int
- μ΄λ κ² νλ κ³Όμ μμ μκ°λ³΅μ‘λκ° λ μΆκ°λλ€.
- λ°λΌμ κ·Έλ₯ Bool ννλ‘ λ°νν΄μ£Όκ³ , indexλ₯Ό νμ©ν΄λ³΄μ.
import Foundation
let n = Int(readLine()!)!
//μμ μμ± ν¨μ
func isPrimeNumber (n: Int) -> Array<Bool> {
var check = Array(repeating: true, count: n+1)
check[0] = false
check[1] = false
for i in 0..<Int(sqrt(Double(n)))+1 {
if check[i] == true {
var j = 2
while (i*j) <= n {
check[i*j] = false
j += 1
}
}
}
return check
}
//μ
λ ₯λ°κΈ°
for i in 0..<n {
let num = Int(readLine()!)! //μ
λ ₯λ°μ μ
var count = 0
let primeNums = isPrimeNumber(n: num) //μ
λ ₯λ°μ numκΉμ§ μ‘΄μ¬νλ μμ
for j in stride(from: 2, through: num/2, by: 1) {
if primeNums[j] == true { //num-jν κ²°κ³Όκ° μμλ©΄ count+1
if primeNums[num-j] == true {
count+=1
}
}
}
print(count)
}
μ΄ λ¬Έμ μ ν΅μ¬μ μμλ₯Ό ꡬν λ μλΌν μ€ν λ€μ€μ 체 λ₯Ό μ¬μ©νλ κ²μ΄μλ€.
μλΌν μ€ν λ€μ€ 체 λ?
λλμΌλ‘ λΉ λ₯΄κ² μμλ₯Ό ꡬνλ μκ³ λ¦¬μ¦μ΄λ€.
β· μλΌν μ€ν λ€μ€ 체 μ리
μλΌν μ€ν λ€μ€μ 체λ κ°μ₯ λ¨Όμ μμλ₯Ό νλ³ν λ²μλ§νΌ λ°°μ΄μ ν λΉνμ¬, ν΄λΉνλ κ°μ λ£μ΄μ£Όκ³ , μ΄νμ νλμ© μ§μλκ°λ λ°©λ²μ μ΄μ©νλ€.
- λ°°μ΄μ μμ±νμ¬ μ΄κΈ°ννλ€. (μνλ μ«μλ§νΌ true λ, 0μΌλ‘λ λ°°μ΄μ μ΄κΈ°ν)
- 2λΆν° μμν΄μ νΉμ μμ λ°°μκ° λλ μλ₯Ό λͺ¨λ μ§μ΄λ€. (μ§μΈ λ μκΈ° μμ μ μ§μ°μ§ μκ³ (μμμ΄κΈ° λλ¬Έ) μ΄λ―Έ μ§μμ§ μλ 건λλ΄λ€.)
- 2λΆν° μμνμ¬ λ¨μμλ μλ₯Ό λͺ¨λ μΆλ ₯νλ€.
μλΌν μ€ν λ€μ€μ 체λ₯Ό μ λλμΌλ‘, λΉ λ₯΄κ² ꡬν λ μ¬μ©ν κΉ? κ·Έ μ΄μ λ μλΌν μ€ν λ€μ€ 체 μκ³ λ¦¬μ¦μ μκ°λ³΅μ‘λλ κ±°μ μ νμ κ°κΉμ΄μ΄ κ΅μ₯ν λΉ λ₯Έ!! O(Nlog(logN)) μκ° λ³΅μ‘λλ₯Ό κ°μ§λ€. λ°λΌμ λΉ λ₯΄κ³ , μ ννκ², λλμ μμλ₯Ό ꡬν λ μ¬μ©ν μ μλ κ²μ΄λ€.
'Algorithm > Baekjoon' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[λ°±μ€] (Swift) 11726λ² - 2xn νμΌλ§ (DP κΈ°μ΄ λ¬Έμ , λμ κ³νλ² νμ΄) (0) | 2022.03.05 |
---|---|
[λ°±μ€] (Swift) 1463λ² - 1λ‘ λ§λ€κΈ° (μ€μννΈ, DP, λμ κ³νλ²) (0) | 2022.03.05 |
[λ°±μ€] (Swift) 11653λ² - μμΈμλΆν΄ (0) | 2022.02.28 |
[λ°±μ€] (Swift) 2089λ² - -2μ§λ² (0) | 2022.02.26 |
[λ°±μ€] (Swift) 1212λ² - 8μ§μ 2μ§μ (0) | 2022.02.20 |