2022. 1. 6. 23:27ㆍPS (Program Solving)/BOJ (백준)
문제 설명
https://www.acmicpc.net/problem/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);
}
제출 결과
(2021.12.20 백준 1152번 제출 결과)
(규칙을 찾는 데에 꽤 많이 헤맸던 것으로 보인다. 컴파일 에러는 gets()랑 gets_s() 제출할 때마다 바꿔 쓰는 거 깜빡해서 걸린 것.)
'PS (Program Solving) > BOJ (백준)' 카테고리의 다른 글
[백준 BOJ] 1259번 팰린드롬수 (C++/cpp) (0) | 2022.01.08 |
---|---|
[백준 BOJ] 1157번 단어 공부 (C언어) (0) | 2022.01.07 |
[백준 BOJ] 1100번 하얀 칸 (C++/cpp) (0) | 2022.01.05 |
[백준 BOJ] 1085번 직사각형에서 탈출 (C++/cpp) (0) | 2022.01.05 |
[백준 BOJ] 1075번 나누기 (C언어) (0) | 2022.01.05 |