BOJ-17298, 오큰수
문제 📑
https://www.acmicpc.net/problem/17298
문제 정리 ▾
- 수열의 개수를 입력받는다.
- 수열은 현재 인덱스 값보다 오른쪽 인덱스 값이 크면 현재 인덱스 값은 오른쪽 인덱스 값으로 변경시킨다.
- 오른쪽에 더 큰 수가 없을 경우 -1을 현재 인덱스 값으로 변경시켜준다.
접근 🚶🏻
나의 생각 ▾
- 문제를 보자마자 이중 for문으로 현재 값보다 다음 인덱스 값이 크면 변경을 해주려고 했다.
- 문제는!!
- 더 큰 수가 없을 경우, -1을 찍어야 하는 경우였다.
- 일단 아래 풀었던 코드를 보자
내 코드 ▾
func solution() {
let cnt = Int(readLine()!)!
let data = readLine()!.split(separator: " ").map{ Int($0)! }
var result = data
for i in 0..<cnt {
for j in i..<cnt {
if result[i] < data[j] {
result[i] = data[j]
break
}
}
if result[i] == data[i] {
result[i] = -1
}
}
print(result, terminator: " ")
}
solution()
- 일단 틀린 코드이다.
- 이유는 잘 모르겠다. 추 후에 시간을 가지고 다시 풀어보려고 한다.
다른 사람의 풀이 ▾
func solution() {
let cnt = Int(readLine()!)!
let data = readLine()!.split(separator: " ").map { Int(String($0))! }
var result = [String](repeating: "-1", count: cnt)
var tc = [Int]()
for i in 0..<cnt {
while !tc.isEmpty, data[tc.last!] < data[i] {
let index = tc.popLast()!
result[index] = "\(data[i])"
}
tc.append(i)
}
print(result.joined(separator: " "))
}
solution()
- while문과 index를 이용해서 풀었다.
- 나름 쉽게 봤던 문제였는데, 아직 생각을 코드로 구현하기엔 부족한 것 같다.
- while문을 아래서 다시 살펴보자
코드 리뷰 ▾
for i in 0..<cnt {
while !tc.isEmpty, data[tc.last!] < data[i] {
let index = tc.popLast()!
result[index] = "\(data[i])"
}
tc.append(i)
}
- tc라는 임의의 배열 변수가 비어있거나 안에 데이터가 현재 data[i]보다 작을 경우 값을 꺼내 줌과 동시에 해당 index에 data[i]값을 넣어준다.
Additional 📂
- 진짜 엄청 부족하다는 것을 느낀다.
- 해당 문제는 골드4 밖에 되지 않는데, 막힌다는 것 == 더 공부하자 🥲
'Algorithm.zip' 카테고리의 다른 글
[Swift]BOJ-1026 (0) | 2022.04.04 |
---|---|
[Swift]BOJ-11726 (0) | 2022.02.07 |
[Swift]BOJ-10799 (0) | 2022.02.04 |
[Swift]BOJ-17413 (0) | 2022.02.03 |
[Swift]BOJ-10845 (0) | 2022.02.02 |