일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 자바스크립트
- 정처기 필기
- 정처기
- 게임 개발
- 게임제작
- unity3d
- 유니티
- 정보처리기사
- 퐁
- 1인 게임 개발
- 1인 게임
- 필기
- 게임 제작
- Unity
- 1인 개발
- Unity2D
- FPS
- 1인 게임 제작
- 프로그래머스 #최소힙 #우선순위 큐
- Unity #Unity2D #Portal
- 토이 프로젝트
- Vampire Survivors
- 유니티3d
- 3회차
- Pong
- 게임
- portal
- 자바스크립트 게임
- 합격
- 유니티 3D
- Today
- Total
Coding Feature.
백준) 1152번: 단어의 개수 in C 본문
1152번: 단어의 개수
첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열
www.acmicpc.net
Solution
위 문제는 특히 C언어의 경우, 먼저 문자열 전체를 입력받고 공백의 개수를 세거나, 문자열 앞 뒤에 공백이 포함된 경우를 나누는 등 굉장히 복잡한 방향으로 풀이가 흘러갈 위험성이 있다.
만약 위 문제와 같이 백준에서 어떤 원소들을 원소 개수 N 없이 입력받고 싶다면 while loop와 scanf의 특성, 특히 리턴값을 잘 이용하면 된다. 알고리즘 풀이보다는 scanf 개념 숙지를 테스팅하는 문제.
원래 scanf의 반환값은 integer 형식이며 입력 항목의 개수이다.
예를 들어 int ret = scanf("%d %d %d", &a, &b, &c) 에서
ret 값은 3이 된다.
만약 입력 실패가 일어난다면 EOF(End Of File)을 반환한다.
이를 이용해 따로 입력받을 원소 개수를 받을 필요없이 while loop으로 구현할 수 있다.
scanf 함수는 문자열이 아니라 공백으로 구분된 한 단어씩 입력받으므로, while 조건문에 scanf를 통해 한 단어씩 입력받고 return 값이 EOF가 아닌 동안 loop을 반복하면서 카운팅하면 쉽게 해답을 구할 수 있다.
while(scanf("%s", str)!=EOF)
count++;
또는 scanf가 항상 입력 항목 개수를 하나씩 입력받는 것을 이용해 다음과 같이 작성해도 된다.
while(scanf("%s", str)==1)
count++;
Code
#include <stdio.h>
int main(){
int count = 0;
char str[1000001];
while(scanf("%s", str)!=EOF)
count++;
printf("%d", count);
return 0;
}
'코딩테스트 > 백준 solved.ac' 카테고리의 다른 글
백준) 1920번: 수 찾기 in C/C++ (0) | 2023.07.30 |
---|---|
백준) strlen을 for loop 조건문에 넣어서 시간 초과가 뜨는 경우(C언어) (0) | 2023.07.29 |
백준) 16985번: Maaaaaaaaaze in C (0) | 2023.07.29 |
백준) 16236번: 아기 상어 in C (0) | 2023.07.29 |
백준) 1913번: 달팽이 in C (0) | 2023.07.28 |