[Swift]BOJ-17298

BOJ-17298, 오큰수

문제 📑

https://www.acmicpc.net/problem/17298

 

17298번: 오큰수

첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에 수열 A의 원소 A1, A2, ..., AN (1 ≤ Ai ≤ 1,000,000)이 주어진다.

www.acmicpc.net

문제 정리 ▾

BOJ-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