1장 알고리즘과 입출력 - (3) 입/출력
1. 테스트 케이스 입력 팁
-테스트 케이스 형식으로 주어지는 경우에는
-각각을 독립적인 문제로 생각하고 풀면 된다
-즉, 전체 테스트 케이스를 한꺼번에 입력 받은 다음에 푸는 것이 아니라,
-첫번째 테스트 케이스 입력 받고 풀고, 그 다음 입력 받고 풀고 이런식으로 해라
-그 이유는 만약 테스트 케이스 갯수 T를 알지 못하면 한꺼번에 입력 받기 위한 배열의 크기를 정하기 어렵고
-전체 입력이 매우 큰 경우에 매우 큰 크기의 배열이 필요하게 되기 때문이다
2. A+B 의 문제를 푸는 예
1) 테스트 케이스의 갯수 T 가 주어지는 경우
int t;
int a, b;
scanf("%d", &t); // 테스트 케이스 갯수를 t에 저장
while(t--){
scanf("%d %d",&a, &b);
printf("%d\n",a+b);
}
2) 테스트 케이스의 갯수가 주어지지 않는 경우
-입력을 EOF(파일의 끝) 까지 받으면 된다
C : while(scanf("%d %d", &a, &b) == 2) => scanf의 경우 리턴값은 성공적으로 입력받은 변수의 개수이기 때문
C++ : while(cin >> a >> b)
Java : while(sc.hasNextInt())
3. 한 줄 입력 받기(Line)
1) 잘못된 방법
-scanf("%s",s);
-cin >> s;
=>위의 두 방법은 한 줄을 입력 받을 수 없다.
2) 옳은 방법
-fgets(s, 100, stdin); => 줄바꿈 \n 까지 입력 받으므로 조심!
-scanf("%[^\n]\n",s); => %[^X]\n => X를 제외하고 모두 입력 받아라, 즉 엔터가 쳐질때(한줄이 넘어갈때)까지 받기 때문에 한 줄 입력
-getline(cin,s); // 여기서 s는 string 위 두가지는 char 배열
#include <iostream>
#include <string>
using namespace std;
int main(){
int N;
char s1[100];
char s2[100];
string s3;
fgets(s1, 100, stdin);
scanf("%[^\n]\n", s2);
getline(cin, s3);
cout << s1;
cout << s2;
cout << s3;
return 0;
}
=> 위의 세 방법은 모두 한 줄을 전체로 입력받을 수 있다.
-자바의 경우 Scanner.nextLine() 메서드 사용
4. scanf("%[^\n]\n",s);
-줄바꿈을 입력받지 않기 때문에 편리하지만 각 줄의 앞 뒤에 있는 공백은 무시하고 입력을 받게 된다
-따라서 빈 줄을 입력받을 수 없다
-또 공백으로 시작하는 경우 공백을 무시하고 문자부터 입력받게 된다
-그래서 11718의 경우에는 scanf("%[^\n]\n",s) 사용 가능하지만
11719의 경우에는 scanf("%[^\n]\n",s) 사용 불가능
-문제 11718, 11719
5. 문자열 "12345" 에서 각 각 한자리씩 따로 입력을 받는 방법
-scanf("%1d",&x);
=>%d 사이에 수를 넣으면 그 길이 만큼 입력을 받게 된다.
-또는 문자열로 받아서 각 각의 index 값에 아스키 '0'을 빼서 사용한다.
-문제 11720
6. %s의 경우도 개수를 지정해서 입력받을 수 있다.
-scanf("%10s",s);
-만약 입력받을 수 있는 것의 개수가 지정ㅈ한 개수 봐 적으면 그만큼만 입력을 받게 된다.
-문제 11721
[문제 목록]
-Hello World 출력 : 2557
-A+B : 1000,2558,10950,10951,10952,10953,11021,11022
-11718,11719,11720,11721
-연습문제 1장 강의자료(p.38~39 참고)