MUKER_DEV with iOS

[swift] λ°±μ€€ - 2164번: μΉ΄λ“œ2 λ³Έλ¬Έ

πŸ€– μ•Œκ³ λ¦¬μ¦˜/BAEKJOON

[swift] λ°±μ€€ - 2164번: μΉ΄λ“œ2

MUKER 2023. 2. 14. 00:26
 

2164번: μΉ΄λ“œ2

Nμž₯의 μΉ΄λ“œκ°€ μžˆλ‹€. 각각의 μΉ΄λ“œλŠ” μ°¨λ‘€λ‘œ 1λΆ€ν„° NκΉŒμ§€μ˜ λ²ˆν˜Έκ°€ λΆ™μ–΄ 있으며, 1번 μΉ΄λ“œκ°€ 제일 μœ„μ—, N번 μΉ΄λ“œκ°€ 제일 μ•„λž˜μΈ μƒνƒœλ‘œ μˆœμ„œλŒ€λ‘œ μΉ΄λ“œκ°€ 놓여 μžˆλ‹€. 이제 λ‹€μŒκ³Ό 같은 λ™μž‘μ„ μΉ΄λ“œκ°€

www.acmicpc.net

문제 ν‘ΈλŠ” 데 μžˆμ–΄ 도움이 λ˜λ„λ‘ λ‚˜μ˜ 풀이와 κ°œμ„ λœ 풀이λ₯Ό μ˜¬λ¦½λ‹ˆλ‹€.
λ˜ν•œ 풀이 ν›„ λ‹€λ₯Έ μ‚¬λžŒμ˜ 풀이λ₯Ό 보고 μ°Έκ³ ν• λ§Œν•œ 풀이도 μ˜¬λ¦½λ‹ˆλ‹€.

- λ¬Έμ œμ— 따라 λ‚˜μ˜ ν’€μ΄λ§Œ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.
- ν•΄λ‹Ή 풀이듀은 풀이 쀑 ν•˜λ‚˜μΌ 뿐 μ΅œμ„ μ˜ ν’€μ΄λŠ” 아닐 수 μžˆμŠ΅λ‹ˆλ‹€.

 


 

문제 μ„€λͺ…

 

- 첫 번째 μˆ«μžλŠ” μ§€μš°κ³ , 두 번째 μˆ«μžλŠ” 제일 λ’€λ‘œ λ³΄λƒ…λ‹ˆλ‹€.(μ•žμ—μ„œ 사라짐)

ν•΄λ‹Ή λͺ…령을 λ°˜λ³΅ν•˜μ—¬ λ§ˆμ§€λ§‰ λ‚¨λŠ” ν•˜λ‚˜μ˜ 숫자λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

 

- 기본적인 큐의 ν˜•νƒœλ‘œ ν’€λ©΄λ˜μ§€λ§Œ

숫자λ₯Ό μ§€μš°λŠ” κ³Όμ •μ—μ„œ removeν•¨μˆ˜λ₯Ό μ“°κ²Œ 되면

μ‹œκ°„ μ΄ˆκ³Όκ°€ λ‚©λ‹ˆλ‹€.

 

- μ΄μœ λŠ” 인덱슀 전체λ₯Ό μ•žμœΌλ‘œ λ‹Ήκ²¨μ˜€λŠ” κ³Όμ •μ—μ„œ

O(n)만큼 μ‹œκ°„μ΄ 걸리기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

 

- 따라 μ‹œκ°„μ œν•œμ— 톡과할 수 있게 μ½”λ“œλ₯Ό 짜면 λ˜κ² μŠ΅λ‹ˆλ‹€.

 


 

λ‚˜μ˜ 풀이

import Foundation

let N = Int(readLine()!)!

var card: [Int?] = (1...N).map { $0 }
var head = 0

while true {
    guard card.count != 1 else { print(1); break }
    card[head] = nil
    if card[card.count-2] == nil { print(card[card.count-1]!); break }
    card.append(card[head+1])
    card[head+1] = nil
    head += 2
}

 

- headλΌλŠ” 인덱슀 κΈ°μ–΅λ³€μˆ˜λ₯Ό λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€.

ν•΄λ‹Ή λ³€μˆ˜λŠ” 배열이 remove λ˜λŠ” 게 μ•„λ‹Œ

nil둜 λ³€ν•˜κΈ° λ•Œλ¬Έμ—

남아 μžˆλŠ” 배열을 κ±΄λ„ˆλ›°μ–΄μ£ΌκΈ° μœ„ν•΄ μƒμ„±ν–ˆμŠ΅λ‹ˆλ‹€.

 

- headλŠ” ν•œ 번의 λ°˜λ³΅μ—μ„œ 2개의 값을 nil둜 λ§Œλ“€κΈ° λ•Œλ¬Έμ—

λ°˜λ³΅λ§ˆλ‹€ + 2μ”© λ”ν•΄μ£Όκ²Œ λ©λ‹ˆλ‹€.

 

- λ°˜λ³΅λ¬Έμ„ λŒλ‹€ λ§ˆμ§€λ§‰μ—μ„œ 2번째인 값이 nil이 λœλ‹€λ©΄

값은 ν•˜λ‚˜κ°€ λ‚¨μ•˜λ‹€λŠ” 것이고

ν•΄λ‹Ή λ§ˆμ§€λ§‰κ°’μ„ 좜λ ₯ν•΄ μ£Όλ©΄ λ©λ‹ˆλ‹€.

 

- λ§Œμ•½ N이 1이라면 λŸ°νƒ€μž„μ˜€λ₯˜κ°€ 뜨기 λ•Œλ¬Έμ—

guard문으둜 countκ°€ 1이라면 1을 좜λ ₯ν•˜κ²Œ μ˜ˆμ™Έλ₯Ό λ’€μŠ΅λ‹ˆλ‹€.

 


 

μ°Έκ³ ν• λ§Œν•œ 풀이

var N = Int(readLine()!)!
var Q = (1...N).map{$0}

var cursor = 0
while cursor < N-1 {
    cursor += 2
    Q.append(Q[cursor-1])
    N+=1
}

print(Q[cursor])

 

- while문에 쑰건을 μ€˜μ„œ ν‘Έλ‹ˆ

더 κΉ”λ”ν•˜κ²Œ μ½”λ“œκ°€ λ‚˜μ˜¬ 수 μžˆλ„€μš”.

 


let N = Int(readLine()!)!

var i = 1
while true {
    if N >= i , N < i*2 {
        break
    }else{
        i *= 2
    }
}
let remain = N-i
if remain == 0 {
    print(i)
}else {
    print(2*remain)
}

 

- λ­”κ°€ 큐λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  ν’€ 수 μžˆμ„ κ±° κ°™μ•˜λŠ”λ°

μ•Œκ³ λ¦¬μ¦˜μ΄ μƒκ°λ‚˜μ§€ μ•Šμ•„μ„œ μ‹œλ„λ„ λͺ»ν–ˆμ—ˆμŠ΅λ‹ˆλ‹€.

 

- ν•˜μ§€λ§Œ μ—­μ‹œ λˆ„κ΅°κ°€λŠ” ν’€μ—ˆλ„€μš”..γ…Žγ…Ž