백준 알고리즘 기초 강좌

1장 알고리즘과 입출력 - (3) 입/출력

살구르 2017. 7. 12. 18:46

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 참고)