⚙️ 알고리즘/백준

[백준/Swift] 2346 - 풍선 터뜨리기

dev_zoe 2023. 3. 21. 16:22
반응형

문제 : https://www.acmicpc.net/problem/2346

 

2346번: 풍선 터뜨리기

1번부터 N번까지 N개의 풍선이 원형으로 놓여 있고. i번 풍선의 오른쪽에는 i+1번 풍선이 있고, 왼쪽에는 i-1번 풍선이 있다. 단, 1번 풍선의 왼쪽에 N번 풍선이 있고, N번 풍선의 오른쪽에 1번 풍선

www.acmicpc.net

 

내 풀이

import Foundation

let N = Int(readLine()!)!

let input = readLine()!.split(separator:" ").map { Int(String($0))!}
var q = (1...N).map { ($0, input[$0-1])}
/*
q는 아래와 같이 초기화하는 것도 가능함! (enumerated() 사용)
1) var q:[(Int, Int)] = []
input.enumerated().forEach {
  q.append(($0.0+1, $0.1))
}

2) var q = readLine()!.split(separator: " ")
            .enumerated()
            .map { ($0.0 + 1, Int(String($0.1))!) }
*/
var poped = q.removeFirst()
var answer:[Int] = [poped.0]
var index = 0 // 일단 맨 첫번째꺼 터뜨림

while !q.isEmpty {
  if poped.1 > 0 { //1을 빼는 이유 : removeFirst() 하여 q.count가 감소했으므로
    index = (index+poped.1-1) % q.count
  } else {
    index = (index+poped.1) % q.count
  }

  if index < 0 { //swift는 음수 인덱스 처리를 못하므로 현재 q의 count만큼 더해줘야함
    index += q.count
  }
  
  poped = q.remove(at: index)
  answer.append(poped.0)
}

print(answer.map { String($0) }.joined(separator: " "))

1) 우선 맨 첫번째를 무조건 터뜨리기 때문에, index를 0으로 초기화하고 배열을 첫번째 원소의 숫자를 초기값으로 가지는 배열로 초기화해주었다.

 

2) 그리고 큐가 빌때까지 반복을 하는데, swift는 인덱스를 조금만 잘못다뤄도 런타임 에러가 뜨니 반드시 유의해서 보아야한다.

만약에 터뜨린 풍선 안에 있는 쪽지(poped.1)가 양수라면 인덱스를 더하고 1을 빼주고, 음수라면 인덱스를 더해주는데

이때 유의할 점은 swift는 python과는 달리 음수 인덱스 처리를 못하기 때문에, 현재 큐의 길이만큼 반드시 더해주어야한다.

 

그리고 해당 인덱스에 위치한 원소를 제거하고 (풍선을 터뜨림) 터뜨린 풍선의 숫자를 answer 배열에 추가해준다.

 

3) 그리고 마지막에 joined()를 활용하여 문자열을 출력해주었다.

 

다른 사람 풀이

- 덱 같이 푼 풀이가 있어서 가져와봤다.

while true {
    let boom = q.removeFirst()
    print(boom.0, terminator: " ")
    
    if q.isEmpty {
        break
    }
    
    if boom.1 > 0 {
        for _ in 0..<boom.1 - 1 {
            q.append(q.removeFirst())
        }
    } else {
        for _ in 0..<boom.1 * -1 {
            q.insert(q.removeLast(), at: 0)
        }
    }
}

- 풍선에 든 쪽지가 양수일 경우 n번 이동하는것을 n번째 원소가 맨 앞에 오도록 회전하여 출력하게 했고, 음수일 경우 양수로 바꾼다음에 맨 오른쪽 원소가 앞쪽에 오도록 하여 회전해서 출력했다.

- 위에는 인덱스때문에 너무 헷갈렸는데 이건 배열 자체를 회전해서 푼 문제라서 더 이해하기 쉬운 코드인것 같다.

반응형