[백준] 1871번: 스택 수열 - Kotlin[코틀린]

2023. 10. 26. 18:37·알고리즘/Baekjoon

문제

 

 

1874번: 스택 수열

1부터 n까지에 수에 대해 차례로 [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 수행하면 수열 [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 있다.

www.acmicpc.net

 


풀이

 

 주여진 수열을 만들기 위해 스택의 push와 pop 과정을 통해 구현하는 문제이다. 먼저 예제 입력 1을 예시로 수열을 만드는 방법을 살펴보자. 4를 수열에 배치하기 위해서 스택에 1, 2, 3, 4를 넣어 {1, 2, 3, 4}인 상태를 만들고 4를 빼주면 된다. 수열은 [4]이 되고 스택은 {1, 2, 3}인 상태가 된다. 다음 3을 배치하기 위해 스택에서 3을 빼준다. 스택은 {1, 2}가 되고 수열은 [4 3]이된다. 모든 입력을 차례대로 표현하면 다음과 같다.

입력 스택 수열
4 1, 2, 3 4
3 1, 2 4 3
6 1, 2, 5 4 3 6
8 1, 2, 5, 7 4 3 6 8
7 1, 2, 5 4 3 6 8 7
5 1, 2 4 3 6 8 7 5
2 1 4 3 6 8 7 5 2
1   4 3 6 8 7 5 2 1

 

 현재 수열에 출력을 나타대는 변수 cur를 선언한다. 수열의 원소를 입력받은 후, 이 값이 cur보다 크다면 두 값의 차이만큼 스택에 push 연산을 해준다. push 연산이 끝난 후, 스택의 가장 상단에는 수열에 배치해야 할 수가 된다. 따라서 pop 연산을 수행하여 스택의 가장 위에 있는 수가 원래의 수열의 순서와 일치하는지 확인하고, 일치하지 않는 경우 불가능한 수열로 판단하여 'NO'를 출력한다.

 


코드

 

import java.util.*

fun main() {
    val br = System.`in`.bufferedReader()
    val bw = System.out.bufferedWriter()

    val sb = StringBuilder()

    val num = br.readLine().toInt()
    val stack = Stack<Int>()
    var cur = 0 // 수열에 출력한 수를 나타내는 변수
    var check = false

    repeat(num) {
        val tmp = br.readLine().toInt()
        if(!check) {
            if(cur<tmp) { // 스택에 출력할 수를 담을때 까지 push
                for(j in cur+1 .. tmp) {
                    stack.push(j)
                    sb.append("+\n")
                }
            }
            if(stack.pop()!=tmp) { // 수열이 불가능한 경우
                sb.clear()
                sb.append("NO")
                check = true
            } else {
            	sb.append("-\n")
            	cur = tmp
            }
        }
    }

    bw.write("$sb")
    bw.flush()
    bw.close()
    br.close()
}

 

'알고리즘 > Baekjoon' 카테고리의 다른 글

[백준] 1717번: 집합의 표현 - Kotlin[코틀린]  (0) 2023.10.31
[백준] 2636번: 치즈 - Kotlin[코틀린]  (0) 2023.10.27
[백준] 2164번: 카드2 - Kotlin[코틀린]  (0) 2023.10.25
[백준] 2161번: 카드1 - Kotlin[코틀린]  (0) 2023.10.24
[백준] 12015번: 가장 긴 증가하는 부분 수열 2 - Kotlin[코틀린]  (0) 2023.10.16
'알고리즘/Baekjoon' 카테고리의 다른 글
  • [백준] 1717번: 집합의 표현 - Kotlin[코틀린]
  • [백준] 2636번: 치즈 - Kotlin[코틀린]
  • [백준] 2164번: 카드2 - Kotlin[코틀린]
  • [백준] 2161번: 카드1 - Kotlin[코틀린]
junghoooooon
junghoooooon
  • junghoooooon
    코드팁스
    junghoooooon
  • 전체
    오늘
    어제
    • 전체 (120)
      • 안드로이드 (0)
        • 코드팁스 (0)
      • 유니티 (0)
        • 코드팁스 (0)
      • 알고리즘 (118)
        • 알고리즘 (0)
        • Baekjoon (118)
      • GitHub (0)
      • 티스토리 (2)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      모듈러 곱셈 역원
      그래프이론
      수학
      스택
      프림
      이분 탐색
      큐
      티스토리
      정렬
      분리집합
      DP
      BFS
      소수 판정
      누적 합
      브루트포스
      투 포인터
      그리디
      재귀
      그래프 탐색
      유니온파인드
      구현
      에라토스테네스의 체
      크루스칼
      백트래킹
      피보나치
      dfs
      분할 정복
      MST
      우선순위 큐
      문자열
    • hELLO· Designed By정상우.v4.10.2
    junghoooooon
    [백준] 1871번: 스택 수열 - Kotlin[코틀린]
    상단으로

    티스토리툴바