일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 계획
- python
- it
- 라즈베리파이
- 알고리즘
- 프로그래밍
- mmcv
- 슬픔
- 철학
- 라즈베리파이3
- 파이썬 강좌
- python 강좌
- 2020
- 강좌
- mmdetection
- 파이썬
- 다이나믹프로그래밍
- 공부
- 2021
- 파이썬 강의
- BOJ
- 자작시
- 라즈베리파이 모니터
- 백준
- 강의
- 머신러닝
- dp
- C++
- python 강의
- dynamic programming
Archives
- Today
- Total
Stargazer
[백준] 5430번 : AC (deque (or vector)) 본문
Undergraudate basics(학부생 기초)/자료구조, 알고리즘
[백준] 5430번 : AC (deque (or vector))
COM2IT 2022. 7. 9. 14:45반응형
얼떨결에 두 번 풀어가지고, 해답을 두번 올리겠다.
접근:
뒤집기 - 순서만 바꿔서 출력하면 됨
삭제 - 뒤집은 상태에 따라 앞뒤 판단만 잘해서 하나씩 삭제 하면됨
전략:
먼저 주어진 데이터를 split해서 실제 배열 변수로 저장한다.
1. deque를 이용한 방법
- 현재 상태에 따라 앞뒤 구분해서 pop_front, pop_back을 방향에 맞게 제거하고, 출력할 때 방향에 맞게 출력 하면 된다.
2. vector를 이용한 방법
- 실제 제거는 하지 않고, 주어진 배열 양 끝 인덱스(left, right) 를 지정하고, 범위를 명령에 맞게 앞 또는 뒤를 하나씩 좁힌다. 출력은 위와 같이 방향에 맞게 출력하면 된다.
코드:
*두 코드 작성 시점이 거리가 있어서 스킬이 조금씩 다르니 각각 참고하는 것도 좋을 것 같다.
1. deque 이용하기
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <deque>
using namespace std;
//vector<int> list;
deque<int> dq;
bool r = false;
bool ending = false;
// R: 뒤집기, D: 버리기
void R() {
r = !r;
}
void D() {
if (dq.empty()) {
cout << "error" << '\n';
ending = true;
}
else if (r) {
dq.pop_back();
}
else {
dq.pop_front();
}
}
void command(string& cmd) {
for (char& c : cmd) {
switch (c) {
case 'R':
R();
break;
case 'D':
D();
break;
}
if (ending) return;
}
}
void seplist(string& input) {
dq.clear();
string temp ="";
for (auto& i : input) {
if (i == '[') continue;
if (i == ',' || i==']') {
if(!temp.empty())
dq.push_back(stoi(temp));
temp.clear();
}
else {
temp += i;
}
}
}
int main() {
int t;
int size;
string cmd, input;
cin.tie(NULL);
ios::sync_with_stdio(false);
cin >> t;
for (int i = 0; i < t; i++) {
cin >> cmd;
cin >> size;
cin >> input;
ending = false;
r = false;
seplist(input);
command(cmd);
if (ending) continue;
cout << '[';
for (int j = 0; j < dq.size();j++) {
if (r) {
cout << dq[dq.size() - j -1];
}
else {
cout << dq[j];
}
if (j == dq.size() - 1) {
break;
}
else
{
cout << ',';
}
}
cout << ']' << '\n';
}
return 0;
}
2. vector를 이용한 방법
#include <iostream>
#include <vector>
using namespace std;
int t;
int main(){
cin >> t;
for(int test=0;test<t;test++){
string oper;
cin >> oper;
int n;
cin >> n;
string arr;
cin >> arr;
vector<int> array;
int i = 1;
int sum = 0;
while(i<arr.size()){
if(arr[i] == ','){
array.push_back(sum);
sum=0;
i++;
}
else if(arr[i] == ']'){
if(arr[i-1] == '[') break;
array.push_back(sum);
break;
}
else{
sum *= 10;
sum += (arr[i] - '0');
i++;
}
}
int dir = 1; // 1: right, -1 : left
int left = 0;
int right = array.size() - 1;
bool flag = false;
for(auto op : oper){
if(op == 'R'){
dir *= -1;
}else{ //
if(n==0){
cout << "error" << '\n';
flag=true;
break;
}
if(dir == 1){
left++;
}else{
right--;
}
n--;
}
}
if(flag) continue;
else if (n == 0) {
cout << "[]"<<'\n';
continue;
}
cout << '[';
if(dir == 1){
for(int i = left; i < right; i++)
cout << array[i] << ',';
}else{
for(int i = right; i > left; i--)
cout << array[i] << ',';
}
if(dir == 1){
cout << array[right];
}else{
cout << array[left];
}
cout << ']' <<'\n';
}
return 0;
}
반응형
'Undergraudate basics(학부생 기초) > 자료구조, 알고리즘' 카테고리의 다른 글
[백준] 9019번 : DSLR (BFS - Queue) (0) | 2022.07.11 |
---|---|
[백준] 7579번 : 앱 c++ (DP) (0) | 2022.07.10 |
[백준] 2473번 : 세 용액 C++ (두 포인터) (0) | 2022.07.09 |
[백준] 2252번 : 줄 세우기 C++ (위상정렬) (0) | 2022.07.05 |
[백준] 2239번: 스도쿠 C++ (백트래킹) (0) | 2022.07.04 |
Comments