문제는 여기서 확인할 수 있다. BaekJoon #5430. AC
평소에 백준 풀이글은 풀이과정이 메인이고 시행착오는 기록일 뿐이었지만 5430번 만큼은 시행착오가 메인 내용이다.
멍청한 실수를 하고 두 시간 동안 삽질하다가 마지막에 틀린 것을 발견했을 때의 허무함이란...
암튼 요약하자면 문제는 제대로 읽자
입력을 받을 때 100,000개의 수가 들어온다는 것만 읽고 input[100,010]
를 사용했다. 여유도 있게 받았겠다, 이게 문제가 될 줄은 몰랐지만 하지만 [,]을 토큰으로 strtok
함수로 나누려했기 때문에 input
배열은 char
형이었다.
그리고 각 수는 100보다 작거나 같은 수... 각 수의 길이가 최대 3, 쉼표 한자리 숫자 하나에 약 4개의 문자가 쓰인다.
따라서 input[400010]
사이즈의 문자열 배열이 필요하다.
문제는 제대로 읽자
위와 같은 실수만 하지 않는다면 풀이과정은 간단하다.
- 입력을 받고 배열은
strktok
으로 나눠서 저장해준다.- R 명령은
swap
함수로front
와end
를 바꿔준다.- D 명령은 값을 하나씩 이동해준다.
- 정방향/역방향을 구분해서 출력한다.
하나씩 보자.
void get_input(string &order, int &arr_size){
cin >> order;
scanf("%d", &arr_size);
int index = 0;
scanf("%s", arr_str);
// 숫자 하나씩 strtok
char *ptr = strtok(arr_str, "[, ");
while(ptr != NULL){
arr[index++] = atoi(ptr);
ptr = strtok(NULL, "[,] ");
}
return;
}
2, 3. R, D 명령
int front = 0, end = arr_size - 1;
int isFront = -1; // 정방향이면 -1, 역방향이면 1
int order_len = order.length();
for(int i=0; i<order_len; i++){
if(order[i] == 'R'){
swap(front, end);
isFront = -isFront;
}
else {
front = front - isFront;
}
}
// 정방향
if(isFront < 0 && front <= end+1) {
// 빈 결과
if(front == end + 1) printf("[]\n");
else{
printf("[");
for(int i=front; i<end; i++){
printf("%d,", arr[i]);
}
printf("%d]\n", arr[end]);
}
}
// 역방향
else if(isFront > 0 && front >= end - 1){
// 빈 결과
if(front == end -1) printf("[]\n");
else{
printf("[");
for(int i=front; i>end; i--){
printf("%d,", arr[i]);
}
printf("%d]\n", arr[end]);
}
}
else printf("error\n");
1학년 때부터 지금까지 항상 잔실수가 많다.
언제쯤이면 잘못 읽거나, 잘못 입력하는 실수가 줄어들까😥