[백준 BOJ] 1152번 단어의 개수 (C언어)

2022. 1. 6. 23:27PS (Program Solving)/BOJ (백준)

문제 설명

https://www.acmicpc.net/problem/1152

 

1152번: 단어의 개수

첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열

www.acmicpc.net

백준 BOJ 1152번 단어의 개수 문제 사진

 

접근 방법 - 어절을 나누는 규칙 찾기

백준의 1152번 문제는 문자열에 있어서 어절의 개수를 찾는 문제였다. 단순 문자열에 대한 연산 문제였던 것이다.

이 문제에선 3가지의 예제가 주어지는데 이를 자세히 봐야 할 필요가 있다.

첫 번째 문자열은 평범하지만, 두 번째 문자열엔 맨 앞에 공백이 있으며 세 번째 문자열엔 맨 뒤에 공백이 있기 때문이다.

따라서 이 문제를 풀 때엔 예제 2와 예제 3을 중심으로 하여 알고리즘을 설계할 필요가 있다.

필자는 아래 규칙을 찾아내어 코드를 작성해보았다.

 

필자가 이용한 규칙

필자는 해결 방법을 탐색하면서, 문자열 가운데에 있는 공백의 양 옆으로는 항상 문자가 존재한다는 점을 찾았다.

이 점을 이용해서, 필자는 아래 2개의 방법을 생각하였다.

(여기서, 문제에서 요구하는 어절의 개수를 저장하는 변수를 count라 가정한다.)

1) 공백이 저장된 배열 값을 찾았을 때, 그 이전 배열 값이 공백이 아닌 문자라면 count에 1을 추가한다.

2) 이전 배열 값이 공백일 때, 현 위치의 배열 값이 공백이 아닌 문자라면 count에 1을 추가한다.

 

필자는 2)의 방법으로 코딩을 진행하였다.

그리고 2)의 방법을 원활히 사용하기 위해, 문자열 맨 앞부분 어절 계산 코드를 별도로 작성하였다.

(이 부분은 아래의 코드 실행 순서와 성공한 코드를 참조해보시길.)

1)의 방법을 사용해도 무관할 듯하다.

다만 이를 위해선 2)의 방법과는 반대로, 문자열 맨 뒷부분의 어절을 계산하는 코드를 따로 작성해야 하는 것으로 보인다.

 

코드의 실행 순서

1) gets() 함수로 공백을 포함해 문자열 전체 입력받기

 

2) 정답 값 저장하는 count를 0으로 초기화한 뒤 선언하기

 

3) 반복문으로 문자열 전체 탐색

문자열 첫 번째 글자 탐색 -> 공백이면 통과, 공백이 아니면 count에 1 추가

이후로, 이전 배열 값이 공백이면서 현 위치 배열 값이 공백이 아닌 문자일 시 count에 1 추가

 

4) 연산이 완료된 count 출력한 뒤 실행 종료한다.

반응형

 

성공한 코드

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <stdio.h>
#include <string.h>

//백준 1152번 코드
char arr[10000001];
int main() {
	gets(arr);
	int count = 0;
	for (int i = 0;i<strlen(arr); i++) {
		if (i == 0) {
			if (arr[i] !=' ') {
				count++;
			}
			continue;
		}
		if (arr[i] != ' ' && arr[i - 1] == ' ') {
			count++;
		}
	}
	printf("%d\n", count);
}

 

제출 결과

백준 BOJ 1152번 단어의 개수 C 제출 결과

(2021.12.20 백준 1152번 제출 결과)

(규칙을 찾는 데에 꽤 많이 헤맸던 것으로 보인다. 컴파일 에러는 gets()랑 gets_s() 제출할 때마다 바꿔 쓰는 거 깜빡해서 걸린 것.)

반응형