inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

4-I

4-1 질문입니다.

326

0508gyhun

작성한 질문수 10

0

  1. 큰돌님이 올려주신 코드가

"all 이거나 empty일때는 n 입력을 받지 말아야합니다."

이거를 충족 못하는거 아닌가요?

 

계속 문자열과 정수를 입력 받는데..

  1. 그리고 답안 코드에는

scanf(" %s~~) 이렇게 띄어쓰기가 들어갓는데 이 부분도 쓰고 안쓰고가 매우 중요하다고 알고있는데..

 

3. 실제로 돌렷을때는 정상 답안이 나오니 아마 위에 두개의 제 생각이 다 틀리겠죠..?ㅎㅎ 설명해주시면 감사하겠습니다..ㅠㅠ 항상 감사드립니다.


c++ 코딩-테스트

답변 2

2

Maruche

이건 scanf라서 그런겁니다. all이나 empty에서 숫자 입력이 없으면 기다리는게 맞습니다. 다만 all이나 empty 입력 후 들어오는 입력은 문자열입니다. %d는 정수형을 기다리는데 문자열이 들어오니까 %d를 무시하게 되고 루프를 돌아서 다음 입력을 받게 되는겁니다.

저 코드에 cout 으로 s랑 x출력해보고 예제 똑같이 입력해보면 대충 이해 갈겁니다. add 1 처럼 문자와 숫자가 동시에 입력되면 바로 cout에서 출력되지만 add나 empty만 입력하면 cout은 출력이 없을겁니다. 그 다음에 다시 명령어 add 3같은거 입력하면, 그 이후에 all과 add 명령어의 cout이 수행될겁니다. 정확히는 all 다음의 정수형 입력을 무시하고 루프 돈 다음 scanf에서 입력버퍼에 쌓인 add 3을 읽는거겠죠.

저도 공부하는 입장이라 정확하지 않은 부분이 있을 수 있지만 대략 이런 구조라고 생각되어 몇 자 남깁니다.

0

큰돌

안녕하세요 0508님 ㅎㅎ

"all 이거나 empty일때는 n 입력을 받지 말아야합니다."

>> 음.. 혹시 그 부분이 문제 지문에 있나요?

문제지문은 다음과 같습니다.

  • all: S를 {1, 2, ..., 20} 으로 바꾼다.

  • empty: S를 공집합으로 바꾼다. 

 

scanf(" %s~~) 이렇게 띄어쓰기가 들어갓는데 이 부분도 쓰고 안쓰고가 매우 중요하다고 알고있는데..

>> 네 맞습니다. ㅎㅎ 사실 이게 좀 더 정확한 표현이에요.

#include <bits/stdc++.h>
using namespace std;
int n, m, x;
char s[11];
int main() {
    scanf("%d", &m);
    for (int i = 0; i < m; i++) {
        scanf("%s %d", &s, &x); 
        if (s[0]=='a' && s[1]=='d') n |= (1 << x);
        else if (s[0] == 'r') n &= ~(1 << x);
        else if (s[0] == 'c') printf("%d\n", (n&(1 << x)) ==0? 0: 1);
        else if (s[0] == 't') n ^=(1<<x);
        else if (s[0] == 'a' && s[1] == 'l') n = (1 << 21) - 1;
        else n = 0;
    }
}

이렇게 되어야 합니다.

다만, 제가 저 띄어쓰기를 한 것은 제 습관때문인데요.

잠시 이코드를 볼까요?

#include <bits/stdc++.h>

int main() {
	int num;
	char chr;
	printf("input num : ");
	scanf("%d", &num);
	
	printf("input chr : "); 
	scanf("%c", &chr);
	
	printf("\n%d %c", num, chr); 
	
}

이코드를 보시면 num까지는 입력을 받지만 c를 입력을 받지 않고 끝내버립니다.

그 이유는 정수 다음의 엔터 = 개행문자를 입력을 대신 받아버리게 되는데요.

이를 공백을 넣으면 해결이 가능합니다. 이 습관이 녹아든 코드라고 보시면 됩니다.

#include <bits/stdc++.h>

int main() {
	int num;
	char chr;
	printf("input num : ");
	scanf("%d", &num);
	
	printf("input chr : "); 
	scanf(" %c", &chr);
	
	printf("\n%d %c", num, chr); 
	
}

 

하지만 char[] 의 경우는 굳이 그럴 필요는 없습니다.

잘 발견하셨습니다.

 

또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.

0

0508gyhun

답변 감사드립니다. 그런데 제가 이해 못한 부분이 있습니다.
all과 empty의 경우 all 입력 후 엔터를 치면 정수의 값이 입력되기를 기다리게 되는 것 아닌가요??

all, empty 의 경우 정수의 값을 입력 안하는데 scanf("%s %d"); 이렇게 놓을 수 있는 건지가 궁금합니다.

코딩살구클럽 가입이 안됩니다.

0

0

0

살구 클럽에 대한 질문있습ㄴ디ㅏ

0

22

1

교안 158페이지 문의드립니다

0

30

2

코딩살구클럽 관련 건의사항

0

67

1

코살에 19942 다이어트 문제에 N의 범위가 빠져있슴니다

0

33

1

진행 방법 질문드립니다!

0

63

2

2-I) 왜 이 문제가 그래프이론 카테고리에 있는지 잘 모르겠습니다.

0

60

2

2주차 개념#12 트리 순회

0

29

2

백준사이트가 종료된다고 합니다.

0

289

2

백준 서비스 종료

9

901

1

sk 하이닉스 코테 대비

0

372

2

3-G 최댓값 질문

0

51

1

모듈러 연산 값이 10이 아닌 경우도 있지 않나요?

0

83

2

3-I 코드 질문드립니다.

0

62

2

3-N 질문 있습니다.

0

66

2

학습방법

0

102

2

4-H 질문 있습니다 (코드 리뷰)

0

66

2

코딩테스트 어디까지 준비해야 하는지 질문이 있습니다.

0

173

2

2-O 반례가 무엇일지 어떤 부분이 틀렸는지 잘 모르겠습니다.

0

69

2

2주차 개념 #4-2. 인접행렬 질문있습니다.

0

64

2

1-A 문제풀이 후 궁금한 점이 생겨서 질문드립니다.

0

51

2

조합 재귀 풀이 확인 해주시면 감사하겠습니다.

0

68

2

함수별 시간복잡도

0

74

2

3-h 질문입니다.

0

49

1