일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- C++ 1937
- 백트래킹
- 조합
- Backtracking
- 가장 긴 증가하는 부분 수열
- 인덱스 트리
- 투포인터
- 백준 숨바꼭질5
- 다익스트라
- 순열
- 프로그래머스
- 백준 17071
- C++1967
- C++ 17071
- DFS
- C++ 1918
- C++1167
- C++
- c언어
- LIS
- 소트 게임
- 백준
- 문자열
- 16933
- BFS
- 조합론
- 위상정렬
- strtok
- 알고리즘
- DP
- Today
- Total
블로그
[C++] 백준 5430 : AC 본문
골드 Ⅴ
우선 이문제를 더 쉽게 풀기 위해서는 연속된 R들을 모두 하나의 R로 생각하면 더 쉽게 풀 수 있다는 걸 알수있다
근데 그로인해 얻는 오버헤드 없앰이 그렇게 많지 않을거같아서.. 난 그렇게 안함!

아무튼 이 문제 까다로웠던 부분은 벡터(또는 배열)의 인덱스에 접근하는 부분이다.
나는 R과 D를 실제로 수행하는 건 비효율적이라고 생각해서,
입력으로 들어오는 array는 일단 저장해놓고 건드리지 않는다.
그 다음, left idx와 right idx, go_right 이라는 변수를 설정해두고
cmd(R과 D로 이루어짐) 이 어떻게 들어오냐에 따라서 li, ri, go_right의 값을 바꿔주고
그에 따라서 array의 값을 출력해 주도록 하였다.
더 자세히 말하면, R이 들어온 경우 go_right는 값을 flip 한다 (true -> false / false -> true)
D가 들어온 경우 go_right 인 경우 left index를 ++해주고,
go_right이 거짓인 경우 right index를 --해준다.
ex)
go_right = true
1 3 5 7 9
li ri
D 실행
go_right = true
1 3 5 7 9
li ri
D 실행
go_right = true
1 3 5 7 9
li ri
R 실행
go_right = false
1 3 5 7 9
li ri
D 실행
go_right = false
1 3 5 7 9
li ri
모든 cmd 연산이 끝난 후 go_right이 true냐 false냐에 따라서 배열을 읽어준다.
위의 예시의 경우 go_right가 false이므로 li <- ri 순으로 읽어준다.
[7, 5] 가 정답이 된다.
근데 이게.. li 와 ri 의 값이 배열이 empty 하게 되면 li > ri 가 된다. (정확하게는 li = ri + 1)
이 경우 li -> ri / li <- ri 순으로 읽게 하는 코드를 실행시킬 수 없으므로 이 부분은 따로 처리를 해준다
이걸 찾는게 어려웠고 다른건 평범했던 문제
근데 역시 C언어로 문자열 다루는건 힘들다..
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
int main() {
int TC;
scanf("%d", &TC);
while (TC--) {
char cmd[100001];
scanf("%s", cmd);
int N;
scanf("%d", &N);
char row[500000];
scanf("%s", row);
row[0] = ',';
row[strlen(row) - 1] = ',';
vector<int> arr;
char *ptr = strtok(row, ",");
while (ptr != NULL) {
arr.push_back(atoi(ptr));
ptr = strtok(NULL, ",");
}
int li = 0;
int ri = N - 1;
bool go_right = true;
vector<int> ans;
bool has_error = false;
for (int i = 0; cmd[i] != '\0'; i++) {
if (cmd[i] == 'R') {
go_right = !go_right;
}
else {
if (li > ri) {
has_error = true;
break;
}
if (go_right) li++;
else ri--;
}
}
if (has_error) printf("error\n");
else {
if (arr.empty() || li > ri) {
printf("[]\n");
continue;
}
printf("[");
if (go_right) {
for (int i = li; i < ri; i++) {
printf("%d,", arr[i]);
}
printf("%d", arr[ri]);
}
else {
for (int i = ri; i > li; i--) {
printf("%d,", arr[i]);
}
printf("%d", arr[li]);
}
printf("]\n");
}
}
}
'PS' 카테고리의 다른 글
[C++] 백준 11052: 카드 구매하기 (0) | 2023.02.26 |
---|---|
[C, C++] strlen의 시간복잡도 (백준 3986: 좋은 단어) (0) | 2023.02.19 |
[C++] 백준 7662 : 이중 우선순위 큐 (0) | 2023.02.12 |
[C++] 백준 1107: 리모컨 (0) | 2023.02.11 |
Codeforces Round #849 (Div. 4) - E번 (0) | 2023.02.05 |