ν‹°μŠ€ν† λ¦¬ λ·°

Coding Test/BOJ

[BOJ] 10845번 - 큐 (Swift, C++)

Horang🐯 2024. 2. 23. 13:09

문제

μ •μˆ˜λ₯Ό μ €μž₯ν•˜λŠ” 큐λ₯Ό κ΅¬ν˜„ν•œ λ‹€μŒ, μž…λ ₯으둜 μ£Όμ–΄μ§€λŠ” λͺ…령을 μ²˜λ¦¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

λͺ…령은 총 μ—¬μ„― 가지이닀.

  • push X: μ •μˆ˜ Xλ₯Ό 큐에 λ„£λŠ” 연산이닀.
  • pop: νμ—μ„œ κ°€μž₯ μ•žμ— μžˆλŠ” μ •μˆ˜λ₯Ό λΉΌκ³ , κ·Έ 수λ₯Ό 좜λ ₯ν•œλ‹€. λ§Œμ•½ 큐에 λ“€μ–΄μžˆλŠ” μ •μˆ˜κ°€ μ—†λŠ” κ²½μš°μ—λŠ” -1을 좜λ ₯ν•œλ‹€.
  • size: 큐에 λ“€μ–΄μžˆλŠ” μ •μˆ˜μ˜ 개수λ₯Ό 좜λ ₯ν•œλ‹€.
  • empty: 큐가 λΉ„μ–΄μžˆμœΌλ©΄ 1, μ•„λ‹ˆλ©΄ 0을 좜λ ₯ν•œλ‹€.
  • front: 큐의 κ°€μž₯ μ•žμ— μžˆλŠ” μ •μˆ˜λ₯Ό 좜λ ₯ν•œλ‹€. λ§Œμ•½ 큐에 λ“€μ–΄μžˆλŠ” μ •μˆ˜κ°€ μ—†λŠ” κ²½μš°μ—λŠ” -1을 좜λ ₯ν•œλ‹€.
  • back: νμ˜ κ°€μž₯ 뒀에 μžˆλŠ” μ •μˆ˜λ₯Ό 좜λ ₯ν•œλ‹€. λ§Œμ•½ 큐에 λ“€μ–΄μžˆλŠ” μ •μˆ˜κ°€ μ—†λŠ” κ²½μš°μ—λŠ” -1을 좜λ ₯ν•œλ‹€.

<문제 링크>

 

10845번: 큐

첫째 쀄에 μ£Όμ–΄μ§€λŠ” λͺ…λ Ήμ˜ 수 N (1 ≤ N ≤ 10,000)이 주어진닀. λ‘˜μ§Έ 쀄뢀터 N개의 μ€„μ—λŠ” λͺ…령이 ν•˜λ‚˜μ”© 주어진닀. μ£Όμ–΄μ§€λŠ” μ •μˆ˜λŠ” 1보닀 ν¬κ±°λ‚˜ κ°™κ³ , 100,000보닀 μž‘κ±°λ‚˜ κ°™λ‹€. λ¬Έμ œμ— λ‚˜μ™€μžˆμ§€

www.acmicpc.net


μž…λ ₯

첫째 쀄에 μ£Όμ–΄μ§€λŠ” λͺ…λ Ήμ˜ 수 N (1 ≤ N ≤ 10,000)이 주어진닀. λ‘˜μ§Έ 쀄뢀터 N개의 μ€„μ—λŠ” λͺ…령이 ν•˜λ‚˜μ”© 주어진닀. μ£Όμ–΄μ§€λŠ” μ •μˆ˜λŠ” 1보닀 ν¬κ±°λ‚˜ κ°™κ³ , 100,000보닀 μž‘κ±°λ‚˜ κ°™λ‹€. λ¬Έμ œμ— λ‚˜μ™€μžˆμ§€ μ•Šμ€ λͺ…령이 μ£Όμ–΄μ§€λŠ” κ²½μš°λŠ” μ—†λ‹€.


좜λ ₯

좜λ ₯ν•΄μ•Όν•˜λŠ” λͺ…령이 μ£Όμ–΄μ§ˆ λ•Œλ§ˆλ‹€, ν•œ 쀄에 ν•˜λ‚˜μ”© 좜λ ₯ν•œλ‹€.


문제 풀이

λ‹¨μˆœνžˆ 큐λ₯Ό κ΅¬ν˜„ν•΄λ³΄λŠ” λ¬Έμ œμž…λ‹ˆλ‹€. νλŠ” FIFO 방식을 λ”°λ₯΄λŠ” 자료ꡬ쑰둜 μ„ μ°©μˆœ μ€„μ„œκΈ°λ₯Όλ₯Ό μƒκ°ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€!

(Queue의 κ°œλ…μ΄ν—·κ°ˆλ¦¬μ‹ λ‹€λ©΄ μ œκ°€ μ„€λͺ…ν•œ κΈ€ μ°Έκ³ ν•΄μ£Όμ„Έμš”~)

 

Swiftμ—μ„œλŠ” 자료ꡬ쑰λ₯Ό 라이브러리둜 지원해주지 μ•Šμ§€λ§Œ C++μ—μ„œλŠ” 지원을 ν•΄μ£ΌκΈ° λ•Œλ¬Έμ—Swift와 C++, 두 개의 μ–Έμ–΄λ‘œ κ΅¬ν˜„μ„ ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

 

Queue 배열은 dequeue κ³Όμ •μ—μ„œ μ˜€λ²„ν—€λ“œκ°€ λ°œμƒν•˜μ—¬ μ‹œκ°„ λ³΅μž‘λ„κ°€ O(n)이 될 수 있기 λ•Œλ¬Έμ—

처음 인덱슀λ₯Ό λ³€μˆ˜λ‘œ μ €μž₯ν•˜μ—¬ μ‹€μ œ 데이터λ₯Ό μ‚­μ œν•˜μ§€ μ•Šκ³  ν•΄λ‹Ή λ³€μˆ˜λ₯Ό 톡해 처음 데이터λ₯Ό κ΄€λ¦¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

풀이 μˆœμ„œ

1. Swift의 경우 Queue λ°°μ—΄κ³Ό 처음 인덱슀λ₯Ό μ €μž₯ν•  λ³€μˆ˜λ₯Ό λ§Œλ“€μ–΄μ£Όκ³ , C++의 경우 λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ μ§€μ›ν•΄μ£ΌλŠ” Queueλ₯Ό μ •μ˜ν•΄μ€λ‹ˆλ‹€.

2. λ¬Έμ œμ—μ„œ μš”κ΅¬ν•˜λŠ” 값을 쑰건에 맞게 μ½˜μ†”μ— 좜λ ₯ν•΄μ€λ‹ˆλ‹€.


풀이 μ½”λ“œ

< Swift>

// Swift
var queue = [Int]()
var firstIndex = 0  // 처음 데이터λ₯Ό κ°€λ¦¬ν‚€λŠ” 인덱슀
var size = 0  // 데이터 개수

let n = Int(readLine()!)!

for _ in 1...n {
    let cmd = readLine()!
    
    switch cmd {
    case "pop":
        if size != 0 {
            print(queue[firstIndex])
            firstIndex += 1
            size -= 1
        } else {
            print(-1)
        }
    case "size":
        print(size)
    case "empty":
        size == 0 ? print(1) : print(0)
    case "front":
        size == 0 ? print(-1) : print(queue[firstIndex])
    case "back":
        size == 0 ? print(-1) : print(queue.last!)  // κ°€μž₯ λ§ˆμ§€λ§‰μ— λ“€μ–΄μ˜¨ 데이터
    default:
        let arr = cmd.split(separator: " ")
        let num = Int(String(arr.last!))!
        queue.append(num)
        size += 1
    }
}

< C++>

// C++
#include <bits/stdc++.h>
using namespace std;

int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    queue<int> Q;
    
    int n;
    cin >> n;
    
    while(n--){
        string str;
        cin >> str;
        
        if(str=="push"){
            int n;
            cin >> n;
            Q.push(n);
        }
        else if(str=="pop"){
            if(Q.empty()) cout << -1 << '\n';
            else{
                cout << Q.front() << '\n';
                Q.pop();
            }
        }
        else if(str=="size") cout << Q.size() << '\n';
        else if(str=="empty") cout << Q.empty() << '\n';  // trueλŠ” 1, falseλŠ” 0
        else if(str=="front"){
            if(Q.empty()) cout << -1 << '\n';
            else{
                cout << Q.front() << '\n';
            }
        }
        else{ // back
            if(Q.empty()) cout << -1 << '\n';
            else{
                cout << Q.back() << '\n';
            }
        }
        
    }
    
}

마무리

ν•΄λ‹Ή λ¬Έμ œμ—μ„œλŠ” ꡳ이 μ˜€λ²„ν—€λ“œ 문제λ₯Ό μ²˜λ¦¬ν•΄μ£Όμ§€ μ•Šμ•„λ„ λ¬Έμ œλŠ” ν’€λ¦¬μ§€λ§Œ,
νμ—μ„œ κ°€μž₯ 큰 문제 상황이라고 μƒκ°λ˜λŠ” μ˜€λ²„ν—€λ“œλ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 인덱슀 λ³€μˆ˜λ₯Ό ν™œμš©ν•˜μ—¬ μ½”λ“œλ₯Ό μž‘μ„±ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€.