풀면서 뜬금없이 scanf에서 애 먹었던 문제이다 ㅡㅡ
코드에 대한 세부적인 설명은 코드에 주석으로 달아놨습니당~!
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | #include <stdio.h> #include <stdlib.h> typedef struct Node { char data; struct Node *left; struct Node *right; }node; //노드생성 함수 node* Create(char x) { node* newNode = (node*)malloc(sizeof(node)); newNode->left = NULL; newNode->right = NULL; newNode->data = x; return newNode; } void preorder(node* t) { if (t == NULL) return; printf("%c", t->data); preorder(t->left); preorder(t->right); } void inorder(node* t) { if (t == NULL) return; inorder(t->left); printf("%c", t->data); inorder(t->right); } void postorder(node* t) { if (t == NULL) return; postorder(t->left); postorder(t->right); printf("%c", t->data); } int main() { node * root[27]; int num; char a, b, c, arr[81][2]; scanf("%d", &num); for (int i = 0; i < num; i++) { //노드갯수와 각 노드의 자식노드를 입력받아 arr배열에 저장 scanf(" %c %c %c", &a, &b, &c); arr[i][0] = b; arr[i][1] = c; //num개의 노드 각각 생성 root[i] = Create(a); } for (int i = 0; i < num; i++) { for (int j = 0; j < num; j++) { //arr배열의 0번째 열에 저장된 값은 노드의 왼쪽 자식 노드가 된다. //배열에 저장된 값과 노드의 데이터(root->data)가 같을 때 그 노드를 왼쪽 자식노드로 저장 if (arr[i][0] == root[j]->data) root[i]->left = root[j]; //arr배열의 1번째 열에 저장된 값은 노드의 오른쪽 자식 노드가 된다. //배열에 저장된 값과 노드의 데이터(root->data)가 같을 때 그 노드를 오른쪽 자식노드로 저장 if (arr[i][1] == root[j]->data) root[i]->right = root[j]; } } preorder(root[0]); printf("\n"); inorder(root[0]); printf("\n"); postorder(root[0]); return 0; } | cs |
문제를 풀 때 57번째 줄인 scanf(" %c %c %c", &a, &b, &c);를 첫번째 %c앞에 공백 없이 scanf("%c %c %c", &a, &b, &c); 와 같은 방식으로 써주었더니 에러가 났다.
이유를 찾아보았다. 컴퓨터는 Enter값도 입력값으로 받아들여서 버퍼에 Enter값이 추가된다고 한다. 그렇기 때문에 내가 사용한 코드는 scanf를 for문으로 반복했기 때문에 Enter값이 다음 scanf의 %c에 입력이 되는 것이다. 그런데 %c앞에 공백을 주면 구분자로 간주하여 오류가 생기지 않는다고 한다.
문제 푸는 당시에 도저히 해결이 안돼서 게시판에 질문까지 올렸당 ㅠㅠ 나중에라도 또 이런식으로 갈팡질팡할 상황이 올 것 같아서 정리해 보았다... 아래는 내가 올렸던 질문에 대해 받았던 답변이다.
<<줄 바꿈 정의>>
carriage return(\r) : 현재의 위치를 나타내는 커서의 위치를 앞으로 이동한다.
line feed(\n) : 현재 위치에서 바로 아래로 이동한다.
윈도우에서 사용하는 Enter은 CR+LF가 된다.
'백준' 카테고리의 다른 글
백준 알고리즘 2750번 수 정렬하기 (0) | 2019.01.30 |
---|---|
백준 알고리즘 10845번 큐 (0) | 2019.01.26 |
백준 알고리즘 1011번 Fly me to the Alpha Centauri (0) | 2019.01.26 |
백준 알고리즘 9012번 괄호 (0) | 2019.01.15 |
백준 알고리즘 10828번 스택 (0) | 2019.01.07 |