[Swift] νλ‘κ·Έλλ¨Έμ€ μκ° μ½λ μ±λ¦°μ§1 μ€ν μμ΄
Problem
Solution
1. aμ μλ μ«μλ€μ κ°―μλ₯Ό μΈμ€λ€.
μ«μλ€μ κ°―μλ₯Ό μΈμ£Όλ μ΄μ λ κ°―μκ° λ§μ μ«μλ‘ μ λ ¬νμ¬ μκ° μ΄κ³Όλ₯Ό λ§κΈ° μν΄μ μ λλ€.
func countNumbers(a:[Int]) -> [Int:Int] {
var countDic:[Int:Int] = [:]
for n in a {
if countDic[n] == nil {
countDic[n] = 1
}else {
countDic[n]! += 1
}
}
return countDic
}
2. κ° μ«μλ€μ κ°μ₯ κΈ΄ λΆλΆ μμ΄ κΈΈμ΄λ₯Ό ꡬν΄μ€λ€.
κ°λ¨νκ² μ€λͺ νλ©΄ κ° μ«μλ€μ μ λ€λ₯Ό λΉκ΅ν΄μ€λλ€.
λ§μ½ μκ³Ό λ€ μ€ νλλΌλ νμ¬ μ«μμ κ°μ§ μμ μ«μκ° μλ€λ©΄ +2 ν΄μ€λλ€.
κ·Έ λ€μ ν΄λΉ μ«μλ₯Ό νμ¬ μ«μλ‘ λ°κΏμ€λλ€.
func findLongSubsequence(n:Int,a:[Int]) -> Int {
var numbers = a
var length:Int = 0
if a[0] == n && a[1] != n {
length += 2
numbers[1] = n
}
for i in 1..<numbers.count-1 {
if a[i] == n {
if numbers[i-1] != n {
numbers[i-1] = n
length += 2
}else if numbers[i+1] != n {
numbers[i+1] = n
length += 2
}
}
}
if numbers[a.count-1] == n && numbers[a.count-2] != n {
length += 2
}
return length
}
3. κ° μ«μλ€μ κ°μ₯ κΈ΄ λΆλΆ μμ΄ κΈΈμ΄ μ€ κ°μ₯ κΈ΄ κ²μ λ°ννλ€.
μκ° μ΄κ³Όλ₯Ό λ§κΈ° μν΄ μ«μμ κ°―μκ° λ λ§μ κ²μΌλ‘ μ λ ¬ν λ€μ μνμ μ§νν©λλ€.
λ§μ½ answerλ³΄λ€ μ«μμ κ°―μ * 2κ° λ μλ€λ©΄ answerλ³΄λ€ λ ν΄ μκ° μμΌλ―λ‘ λ€μμΌλ‘ λμ΄κ°μ€λλ€.
func findMaxLength(a:[Int]) -> Int {
var answer:Int = 0
let sortCounts = countNumbers(a: a).sorted{$0.value > $1.value}
for dic in sortCounts {
if dic.value * 2 < answer { continue }
let length = findLongSubsequence(n:dic.key, a:a)
answer = max(answer,length)
}
return answer
}
Source Code
P.S
μ²μμ κ°μ₯ μ«μμ κ°―μκ° λ§μ κ²μ κ°μ₯ κΈ΄ λΆλΆ μμ΄μ μ°Ύμμ λ°ννλ€.
κ·Όλ° κ³μ ν μ€νΈ μΌμ΄μ€ 28λ²μ΄ νλ Έλ€...
κ·Έλμ μ§λ¬ΈνκΈ°λ₯Ό ν΅ν΄ λ΄€λλ λ§μ½ μ΄λ κ² aκ° μ£Όμ΄μ‘μκ²½μ° -> [4, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 3]
1μ΄ κ°μ₯ λ§μ§λ§ κ°μ₯ κΈ΄ λΆλΆ μμ΄μ 0μ μ΄μ©ν΄μ λ§λ€μ΄μΌ νλ€...
κ·Έλμ κ²°κ΅ λͺ¨λ μ«μλ₯Ό νμΈν΄λ΄μΌ νμλ€..