[Silver III] queuestack - 24511
성능 요약
메모리: 80628 KB, 시간: 164 ms
분류
자료 구조, 덱, 큐, 스택
제출 일자
2024년 1월 2일 22:02:41
문제 설명
한가롭게 방학에 놀고 있던 도현이는 갑자기 재밌는 자료구조를 생각해냈다. 그 자료구조의 이름은 queuestack이다.
queuestack의 구조는 다음과 같다. 1
번, 2 번, ... , N 번의 자료구조(queue 혹은 stack)가 나열되어있으며, 각각의 자료구조에는 한 개의 원소가 들어있다.queuestack의 작동은 다음과 같다.
- x0 을 입력받는다.
- x0 을 1 번 자료구조에 삽입한 뒤 1 번 자료구조에서 원소를 pop한다. 그때 pop된 원소를 x1 이라 한다.
- x1 을 2 번 자료구조에 삽입한 뒤 2 번 자료구조에서 원소를 pop한다. 그때 pop된 원소를 x2 이라 한다.
- ...
- xN−1 을 N 번 자료구조에 삽입한 뒤 N 번 자료구조에서 원소를 pop한다. 그때 pop된 원소를 xN 이라 한다.
- xN 을 리턴한다.
도현이는 길이 M
의 수열 C 를 가져와서 수열의 원소를 앞에서부터 차례대로 queuestack에 삽입할 것이다. 이전에 삽입한 결과는 남아 있다. (예제 1 참고)queuestack에 넣을 원소들이 주어졌을 때, 해당 원소를 넣은 리턴값을 출력하는 프로그램을 작성해보자.
입력
첫째 줄에 queuestack을 구성하는 자료구조의 개수 N
이 주어진다. (1≤N≤100000 )둘째 줄에 길이 N
의 수열 A 가 주어진다. i 번 자료구조가 큐라면 Ai=0 , 스택이라면 Ai=1 이다.셋째 줄에 길이 N
의 수열 B 가 주어진다. Bi 는 i 번 자료구조에 들어 있는 원소이다. (1≤Bi≤1000000000 )넷째 줄에 삽입할 수열의 길이 M
이 주어진다. (1≤M≤100000 )다섯째 줄에 queuestack에 삽입할 원소를 담고 있는 길이 M
의 수열 C 가 주어진다. (1≤Ci≤1000000000 )입력으로 주어지는 모든 수는 정수이다.
출력
수열 C
의 원소를 차례대로 queuestack에 삽입했을 때의 리턴값을 공백으로 구분하여 출력한다.
풀이
우선 해당 문제의 예시를 풀어보았습니다.

풀이를 보았을 때, 사실 스택은 아무 의미가 없고, 큐에 따라 정해짐을 알 수 있었습니다.
따라서 큐인 것들만 배열에 추가하고, 다시 만들어보았습니다.

이러한 규칙이 발견되었습니다.
따라서 queuestack에 삽입할 원소는 위의 순서대로 진행하면 됨을 알 수 있습니다.
만약 m(삽입할 원소의 개수)이 큐보다 크다면, 큐에 있는 값을 reverse해준 뒤 출력해주고,
남은 만큼 들어온 순서에 대한 값을 출력해주면 됩니다.
다음은 코드입니다.
let n = Int(readLine()!)!
let a = readLine()!.split(separator: " ").map{ Int(String($0))! }
let b = readLine()!.split(separator: " ").map{ Int(String($0))! }
var m = Int(readLine()!)!
let c = readLine()!.split(separator: " ").map{ Int(String($0))! }
var queue = [Int]()
var ans = ""
for i in 0..<a.count {
if a[i] == 0 { // 큐 일때만 추가 (스택은 의미가 없음)
queue.append(b[i])
}
}
// m이 queue에 있는 개수보다 많거나 같을 때 -> queue에 있는 것들 + 삽입된 원소들 추가
if m >= queue.count {
for i in queue.reversed() {
ans += "\(i) "
}
for i in 0..<m - queue.count {
ans += "\(c[i]) "
}
} else { // m이 더 queue에 있는 개수보다 더 적을 때 -> queue에 있는 것들만 해도 충분
for i in stride(from: queue.count - 1, to: queue.count - m - 1, by: -1) {
ans += "\(queue[i]) "
}
}
print(ans)
'PS > BOJ' 카테고리의 다른 글
[백준(BOJ)] 2110 공유기 설치 - 스위프트 (Swift) (0) | 2024.01.16 |
---|---|
[백준(BOJ)] 3078 좋은 친구 - 스위프트 (Swift) (2) | 2024.01.03 |
[백준(BOJ)] 1427 소트인사이드 - 스위프트 (Swift) (2) | 2024.01.03 |
[백준(BOJ)] 5397 키로거 - 스위프트 (Swift) (0) | 2024.01.03 |
[백준(BOJ) 1966 프린터 큐 - 스위프트 (Swift) (0) | 2024.01.02 |
[Silver III] queuestack - 24511
성능 요약
메모리: 80628 KB, 시간: 164 ms
분류
자료 구조, 덱, 큐, 스택
제출 일자
2024년 1월 2일 22:02:41
문제 설명
한가롭게 방학에 놀고 있던 도현이는 갑자기 재밌는 자료구조를 생각해냈다. 그 자료구조의 이름은 queuestack이다.
queuestack의 구조는 다음과 같다. 1
번, 2 번, ... , N 번의 자료구조(queue 혹은 stack)가 나열되어있으며, 각각의 자료구조에는 한 개의 원소가 들어있다.queuestack의 작동은 다음과 같다.
- x0 을 입력받는다.
- x0 을 1 번 자료구조에 삽입한 뒤 1 번 자료구조에서 원소를 pop한다. 그때 pop된 원소를 x1 이라 한다.
- x1 을 2 번 자료구조에 삽입한 뒤 2 번 자료구조에서 원소를 pop한다. 그때 pop된 원소를 x2 이라 한다.
- ...
- xN−1 을 N 번 자료구조에 삽입한 뒤 N 번 자료구조에서 원소를 pop한다. 그때 pop된 원소를 xN 이라 한다.
- xN 을 리턴한다.
도현이는 길이 M
의 수열 C 를 가져와서 수열의 원소를 앞에서부터 차례대로 queuestack에 삽입할 것이다. 이전에 삽입한 결과는 남아 있다. (예제 1 참고)queuestack에 넣을 원소들이 주어졌을 때, 해당 원소를 넣은 리턴값을 출력하는 프로그램을 작성해보자.
입력
첫째 줄에 queuestack을 구성하는 자료구조의 개수 N
이 주어진다. (1≤N≤100000 )둘째 줄에 길이 N
의 수열 A 가 주어진다. i 번 자료구조가 큐라면 Ai=0 , 스택이라면 Ai=1 이다.셋째 줄에 길이 N
의 수열 B 가 주어진다. Bi 는 i 번 자료구조에 들어 있는 원소이다. (1≤Bi≤1000000000 )넷째 줄에 삽입할 수열의 길이 M
이 주어진다. (1≤M≤100000 )다섯째 줄에 queuestack에 삽입할 원소를 담고 있는 길이 M
의 수열 C 가 주어진다. (1≤Ci≤1000000000 )입력으로 주어지는 모든 수는 정수이다.
출력
수열 C
의 원소를 차례대로 queuestack에 삽입했을 때의 리턴값을 공백으로 구분하여 출력한다.
풀이
우선 해당 문제의 예시를 풀어보았습니다.

풀이를 보았을 때, 사실 스택은 아무 의미가 없고, 큐에 따라 정해짐을 알 수 있었습니다.
따라서 큐인 것들만 배열에 추가하고, 다시 만들어보았습니다.

이러한 규칙이 발견되었습니다.
따라서 queuestack에 삽입할 원소는 위의 순서대로 진행하면 됨을 알 수 있습니다.
만약 m(삽입할 원소의 개수)이 큐보다 크다면, 큐에 있는 값을 reverse해준 뒤 출력해주고,
남은 만큼 들어온 순서에 대한 값을 출력해주면 됩니다.
다음은 코드입니다.
let n = Int(readLine()!)!
let a = readLine()!.split(separator: " ").map{ Int(String($0))! }
let b = readLine()!.split(separator: " ").map{ Int(String($0))! }
var m = Int(readLine()!)!
let c = readLine()!.split(separator: " ").map{ Int(String($0))! }
var queue = [Int]()
var ans = ""
for i in 0..<a.count {
if a[i] == 0 { // 큐 일때만 추가 (스택은 의미가 없음)
queue.append(b[i])
}
}
// m이 queue에 있는 개수보다 많거나 같을 때 -> queue에 있는 것들 + 삽입된 원소들 추가
if m >= queue.count {
for i in queue.reversed() {
ans += "\(i) "
}
for i in 0..<m - queue.count {
ans += "\(c[i]) "
}
} else { // m이 더 queue에 있는 개수보다 더 적을 때 -> queue에 있는 것들만 해도 충분
for i in stride(from: queue.count - 1, to: queue.count - m - 1, by: -1) {
ans += "\(queue[i]) "
}
}
print(ans)
'PS > BOJ' 카테고리의 다른 글
[백준(BOJ)] 2110 공유기 설치 - 스위프트 (Swift) (0) | 2024.01.16 |
---|---|
[백준(BOJ)] 3078 좋은 친구 - 스위프트 (Swift) (2) | 2024.01.03 |
[백준(BOJ)] 1427 소트인사이드 - 스위프트 (Swift) (2) | 2024.01.03 |
[백준(BOJ)] 5397 키로거 - 스위프트 (Swift) (0) | 2024.01.03 |
[백준(BOJ) 1966 프린터 큐 - 스위프트 (Swift) (0) | 2024.01.02 |