풀이
입력부터 애먹은 문제다. "[ , , ]"를 문자열로 입력받아서 해결해도 되지만, 정수만 입력받기 위해 ' [ ', ' ] '가 입력될 때는 getchar()로 buffer를 비워 다음 입력에 영향이 안가도록 했다.
getchar();
for (int i = 0; i < n; i++) scanf("%d,", &x[i]);
getchar();
error가 뜨는 경우는 다음과 같다.
- n = 0일 때
- n = 0이 아니지만, p에 입력받은 D의 개수보다 n이 작을 때
2번째 조건을 확인하기 위해 n을 감소시켜 반복문이 끝나기 전에 1번째 조건으로 유도하는 방법으로 구현했다.
for (int i = 0; p[i] != '\0'; i++){
if (p[i] == 'R') reverse = reverse ? 0 : 1;
else {
if (!n){
error++;
break;
}
!reverse ? (front++) : (rear--);
n--;
}
}
명령을 끝낸 후 남은 정수들이 전부 0인지(비어있는지) 확인해야 한다는 점에 유의하자.
소스코드
#include <stdio.h>
char p[100001], x[100001];
int all_zero(int front, int rear){
for (int i = front; i <= rear; i++)
if (x[i]) return 0;
return 1;
}
int main(){
int T, n;
scanf("%d", &T);
while (T--){
int error = 0, reverse = 0;
scanf("%s %d ", p, &n);
int front = 0, rear = n-1;
getchar();
for (int i = 0; i < n; i++) scanf("%d,", &x[i]);
getchar();
for (int i = 0; p[i] != '\0'; i++){
if (p[i] == 'R') reverse = reverse ? 0 : 1;
else {
if (!n){
error++;
break;
}
!reverse ? (front++) : (rear--);
n--;
}
}
if (error) puts("error");
else if (all_zero(front, rear)) puts("[]");
else {
putchar('[');
if (!reverse)
for (int i = front; i <= rear; i++)
printf("%d%c", x[i], i == rear ? ']' : ',');
else
for (int i = rear; i >= front; i--)
printf("%d%c", x[i], i == front ? ']' : ',');
putchar(10);
}
}
}
출처
'PS > Baekjoon Online Judge' 카테고리의 다른 글
[백준 15652] N과 M (4) [C] (0) | 2021.08.10 |
---|---|
[백준 1788] 피보나치 수의 확장 [C] (0) | 2021.08.10 |
[백준 15650] N과 M (2) [C] (0) | 2021.08.09 |
[백준 9461] 파도반 수열 [C] (0) | 2021.08.09 |
[백준 1780] 종이의 개수 [C] (0) | 2021.08.09 |