[Swift] 백준 17299 - 오등큰수

sun02·2021년 11월 10일
0

알고리즘

목록 보기
13/52

문제 링크

앞전에 오큰수를 풀었어서 조금은 쉽게 해결이 가능했다!

이번엔 배열을 세 개 사용하였다.

  • numArray : readLine()으로 받은 배열
  • count : 각 원소의 개수를 저장하는 배열, 이 때 count의 위치는 numArray의 원소 값이다.
  • stack : 오드큰수를 갖지 않는 원소의 위치를 저장하는 배열

먼저 for 문을 사용해서
count[numArray[i]-1] +=1 으로 각 원소의 개수를 알아내었다.
이때 만약 numArray[i] 값이 1 이면, count[0]에 저장되어야하기 때문에 -1을 해주어야한다.

이후 오큰수와 같이 값을 비교해주는데
이번엔 count배열 값으로 비교해준다.
count[numArray[stack.last!]-1] < count[numArray[i]-1] 를 비교하여
만약 현재 원소의 개수가 더 많다면, 오등큰수이기 때문에
numArray[stack.removeLast()] = numArray[i] 를 해주면 된다.

최종 코드


import Foundation

let n = Int(readLine()!)!
var numArray = readLine()!.split(separator:" ").map{Int(String($0))!}

var count = Array(repeating: 0, count: 1000000)
var stack = [Int]()

for i in 0..<n {
    count[numArray[i]-1] += 1
}

for i in 0..<n {
    
    while !stack.isEmpty && count[numArray[stack.last!]-1] < count[numArray[i]-1] {
        numArray[stack.removeLast()] = numArray[i]
    }
    stack.append(i)
}

for i in stack {
    numArray[i] = -1
}

print(numArray.map{String($0)}.joined(separator: " "))
  • 여기서 count = Array(repeating: 0, count: n)으로 하면, 런타임에러가 난다.
    이유를 모르겠다ㅜㅜ 아시는 분 알려주세요.......

0개의 댓글