950. Reveal Cards In Increasing Order
문제 설명
- 카드 배열이 제공됨
- 카드배열 순서를 내맘대로 조절할 수 있는데,
- 주어진 일련의 행동을 따라서 수행할 때 카드 뒤집는 순서가 오름차순으로 되게끔 수행하라
주어진 행동
- 맨위 뒤집고 아웃!
- 그다음카드 맨아래로
- 이것들 반복!
문제 접근
- 그러면 이게 일단 퐁당퐁당 점점 커지면되는 것인데,
- 한바퀴돌면서 그 다음 추가된 친구를 수행하는 부분을 어떻게 잘 수행할 것인지가 쟁점인듯 보였다.
- 일단 한쪽으로 sorting을 하고 시작해야겠다는 생각정도..?
[2,3,5,7,11,13,17]은
[2,13,3,11,5,17,7] 형태지만
[2,3,5,11,13,17]은
[2,13,3,11,5,17]가 아니라, [2,11,3,13,5,17]로 꼬임업는 퐁당 배열이다
그래서 결국 알아낸 것은
라고 풀어주다가 무한한 indexOutOfBounds? 여튼 배열 밖으로 계속 인덱스가 팅겨나가는 것에서 이 방향이 아니구나를 느꼈다.
이게 1,2번에서 하라는 시뮬레이션을 반대로 할 생각을 하긴했는데, 결국엔 힌트보니까 이방향이 맞더라..근데 내가 왜 첨부터 안했냐하면...
1. 맨앞뒤집기
2. 다음 맨뒤를 맨아래로 보내기
이거를 거꾸로 한다는게
1. 맨뒤를 맨앞으로?
2. 맨앞에서 다음꺼?
아니면 거꾸로니까 아예 오름차순부터? 등등.. 잡생각이 많아서였는데,
1. 그냥 queue의 형태로 / 맨뒤(제일 큰수)를 정답배열로 옮기고, 그 다음 거기서 맨뒤를 맨앞으로 옮기고
answer.insert(item, at: 0)
2. 그 다음 그 정답배열에서 맨뒤친구를 맨앞으로 또 옮겨줬다.
answer.insert(answer.removeLast(), at: 0)
Q : 역순인데 왜 맨뒤 맨앞추가를 연속으로 ??
원래 시뮬: 맨 위에서 공개 --->> 맨 뒤로 이동
역방향시뮬: 맨 뒤에서 앞으로 이동 --->> 공개된 카드 맨 앞에 추가
최종코드
class Solution {
func deckRevealedIncreasing(_ deck: [Int]) -> [Int] {
var a = deck
a.sort(by: >)
var answer = [Int]()
for item in a {
answer.insert(item, at: 0)
answer.insert(answer.removeLast(), at: 0)
}
answer.append(answer.removeFirst())
return answer
}
}
answer.append(answer.removeFirst())
마지막의 해당 한줄은 이게 반복문 돌리는 과정에서 마지막 한 요소는 포함이 안되느라 완성된 것에서 하나를 맨 뒤로 밀어줬다.
타인의 코드
class Solution {
func deckRevealedIncreasing(_ deck: [Int]) -> [Int] {
let sortedDeck = deck.sorted() // O(nLogn)
var finalDeck = Array(repeating: 0, count: deck.count)
// Fill my queue
var queue = [Int]()
for i in 0 ..< deck.count { // O(n)
queue.append(i)
}
// Place card in the deck
for num in sortedDeck { // O(n)
let pos = queue.removeFirst()
finalDeck[pos] = num
if !queue.isEmpty {
queue.append(queue.removeFirst())
}
}
return finalDeck
}
}
이분의 코드는 정방향시뮬로 푸신 것 같다.
특이한게 정렬된 숫자(num)와 0부터 deck.count까지의 인덱스(queue)를 각각 따로 돌리며 위치를 계산해 나가는 방식이었다.
컴퓨터스럽게 짜여진 코드같았다.
솔직히 직관적으로 확 와닿지는 않았지만, 코드를 따라가다 보니 점점 이렇게도 문제를 풀 수 있구나라는 생각을 했다. 이게 단독으로 돌아가는 queue번호에 퐁당퐁당을 탑승시킨 느낌...?