-
PS/알고리즘 문제풀이 처음 시작하기(2) - 처음에는 모르는 PS 입력 tipProblem Solving 2019. 8. 6. 13:38
저번 글에 이어서 PS를 처음 시작하는데에 도움이 되는 팁들을 적는다
PS의 입문에는 입출력에 대해 잘 아는것이 매~~~~~~~~~~~~~우 중요하기 때문에 오늘은 입력을 받는 법에 대해서만 쓰겠다
입력 받는법에도 알아야할게 넘 많기 때문😄
개인적으로는 BOJ의 그대로 출력하기 문제를 풀 수 있다면 입력은 어느정도 숙달된 실력이라고 생각한다
알고리즘 문제의 입력방법은 크게 두 가지로 나뉜다
입력의 개수가 주어지는 경우 vs 주어지지 않는 경우
주어지지 않는 경우도 나뉘지만 일단 입력 개수가 주어지는 경우에 대해 알아보자
입력의 개수가 주어지는 경우
모든 문제를 풀 때는
1. 문제를 정확히 읽고 제대로 이해하기
2. 입력에 주어진 조건을 보고 어떤 자료형을 사용할지 정하기
이 두가지가 가장 중요하다고 봐도 되는데 예를 들면
위의 문제에서는 가변적인 정수 배열을 사용하고, 크기 제한이 따로 없기 때문에 벡터vector를 써주는 것이 좋을것이다.
실제로 나는 PS의 입력에 대한 기초가 아~~~예 없는 상황에서 이 문제를 보고 조금 당황했다.
문제에 대한 이해도 되었고 벡터도 써야하겠다는 생각은 했지만
공백 문자로 구분하여 엔터키가 입력될 때까지 한 줄로 입력 받는다
를 제대로 이해하지 못했기 때문이다. scanf("%d %d %d ... ") 이런식으로 입력을 받아야하나..?라는 생각을 했었지만
중요한건 scanf()함수는 공백/탭/개행문자의 입력을 기점으로 데이터를 입력받는다
그렇기때문에 공백과 개행문자를 섞어서 예제 데이터가 나와있는 경우가 있어도 scanf만으로 받아주면 되는 것이다!!
(이게 당연한 것 같지만 은근히 모르는 사람이 많다)
ex) 0 < r,c < 100인 정수 r과 c를 입력받고,
각각을 행과 열로 취하는 배열을 생성하여 배열값을 입력받은 뒤 출력해라
이런 문제가 있다면? 그냥 아래와 같이 입력을 받아주면 된다
공백문자와 개행문자는 큰 상관이 없는것을 유의하자 ㅎㅎ
그림1번의 문제의 풀이는 참고로 다음과 같다
이제 두 번째
입력의 개수가 정해지지 않은 경우
이 경우는 크게 세 가지로 나뉜다
1. 단일 입력일 경우 2. 특정 입력을 받을 경우(ex. -1) 입력 종료 3. 입력이 끝날때까지 입력
1번과 2번은 간단한 경우지만, 3번에서 어려움을 겪는 경우가 많다. 저게 뭔소리야.. 싶다면
킹대로 출력하기 문제를 보면 된다! 언뜻보면 매우 간단한 문제같지만 정답률은 그리 높지 않다
왜냐면 입력에는 종료에 대한 어떠한 특수 입력도 없기 때문이다
그냥 입력을 계속해서 받다가 입력이 끝나면 종료하면 된다
입력 종료의 인식을 구현 처음에는 생각보다 어려울 수 있다 하지만 파일입출력에 대한 이해가 있다면 알 수 있다
그것은 바로 EOF(End of File)을 사용해주면 된다
그대로 출력하기 문제의 정답을 보자
while문의 조건으로
⭐scanf()!=EOF⭐
를 해줌으로써 scanf()의 입력이 끝날 때 까지 테스트 케이스를 계속 실행하게 할 수 있다
그대로 출력하기 문제에서는 공백을 포함한 문장을 입력받고, 개행으로 인해 발생하는 버퍼를 없애기 위해 위의 코드와 같은 정규식을 써주었다
콘솔창에서 EOF를 입력하기 위해서는 ctrl+Z를 입력해줘야 한다는 것을 잊지 말자
입력이 종료될때까지 정수들을 입력받아 합을 출력하는 문제가 있다고 가정하자
#include <cstdio> int n, s; int main() { while (scanf("%d", &n) != EOF) s += n; printf("%d", s); return 0; }
이런식으로 EOF를 입력을 해줘야 한다
대신 이것은 입력을 파일입출력으로 할지, 콘솔로 입력할 지에 따라 조금 다른데
여기서 팁 하나 더
⭐freopen(텍스트 파일명, "r", stdin);⭐
를 사용하면 실행할 때마다 테스트 케이스를 일일히 입력해줄 필요가 없다!!!
무슨 말이냐면 위와 똑같은 문제에 똑같은 코드에서, 저 문장만 추가해 준다면
input.txt 파일 생성법
...더보기input.txt파일은 솔루션 탐색기 - 리소스 파일 디렉터리에서 input.txt 파일을 생성해준 뒤
입력 예제 데이터를 넣어주면 된다
#include <cstdio> int main() { freopen("input.txt", "r", stdin); char arr[100]; while (scanf(" %[^\n]s", arr) != EOF) printf("%s\n", arr); return 0; }
그리고 실행을 해주면
결과만 확인해줄 수 있다!!
이 꿀팁은 테스트 케이스의 양이 많다던가, 조건을 바꿔주면서 디버깅을 해줄 때 매우매우매우 중요한데 써봐야 안다
그리고 마지막으로 추가적인 입력 팁이 있다면
형식지정자 알아두기
타입 형식지정자 %d int (2^32) %u unsigned int (2^32) %lld long long (2^64) %c char (2^8) %s string (문자열) %f float %lf double 숫자/문자 같이 입력받을 때 버퍼 지우기
ex. 한줄에는 정수형 숫자, 그 다음 줄에는 문자를 입력받아라
하지만 왼쪽과 같은 코드로 작성하면 원하는 결과가 나오지 않는다
이유는 정수를 입력받고 엔터를 누를 때 정수는 int형 변수 i에 저장되지만 버퍼에 개행문자 \n이 남아있기 때문에 char형 변수 c에 개행문자가 들어가는 것!
그래서 위의 두개와 같은 형식으로 1. scanf앞에 공백을 추가해주거나 2. 새로운 scanf문을 추가해주면
버퍼에 저장된 \n을 무시하고 입력받을 수 있다
'Problem Solving' 카테고리의 다른 글
윤이진의 알고리즘 챌린지(완) (0) 2021.06.06 PS/알고리즘 문제풀이 처음 시작하기(3) - freopen 함수를 활용한 입출력 간소화 (2) 2020.03.18 PS/알고리즘 문제풀이 처음 시작하기(1) - 알고리즘 사이트 입문 (435) 2019.08.04