1. 문제 상세
https://www.acmicpc.net/problem/1316



2. 문제 접근
먼저 정수를 입력받아 변수에 저장하고, 반복문으로 그 변수에 저장된 횟수만큼 반복하도록 한다.
반복에서는 문자열을 입력받는다.
입력받은 문자열에서 반복되는 문자를 확인하기 위해 문자열 길이만큼 반복하며 맨 앞 문자부터 현재 문자의 바로 뒤 문자를 확인하여 다르다면 해당 문자를 체크해둔다.
예를 들어 aaabcc 인 경우,
인덱스 [0] : a, 인덱스 1이 a 이므로 통과한다.
인덱스 [1] : a, 인덱스 2가 a 이므로 통과.
인덱스 [2] : a, 인덱스 3이 b 이므로 a 를 체크하고 넘어간다.
인덱스 [3] : b, 인덱스 4가 c 이므로 b 를 체크하고 넘어간다.
인덱스 [4] : c, 인덱스 6이 c 이므로 통과.
인덱스 [5] : c, 인덱스 6이 끝이므로 c 를 체크하고 끝낸다.
알파벳의 체킹을 위해 알파벳과 매치되는 정수 배열을 만들어 기본값을 0으로, 체크한 경우 1로 하자.
반복에서 뒤의 문자를 확인하기 전에 현재 알파벳이 이전에 나온 적이 있었는지 먼저 확인하고 맞다면 반복을 빠져나간다.
만약 마지막 반복이라면 그룹 단어 개수에 1을 더하도록 한다.
3. 문제 풀이
#include <iostream>
using namespace std;
int main() {
int a[26], n, word = 0;
string s;
cin >> n;
for(int i = 0; i < n; i++) {
for(int k = 0; k < 26; k++) a[k] = 0;
cin >> s;
for(int j = 0; j < s.length(); j++) {
if(a[s[j] - 97] == 1) break;
if(s[j] != s[j + 1]) a[s[j] - 97] = 1;
if(j == s.length() - 1) word++;
}
}
cout << word;
}
크기가 26인 정수형 배열 a 와 정수형 변수 n, word 를 선언하고 word 를 0으로 초기화한다.
문자열 객체 s 를 생성.
cin 으로 단어의 개수를 입력받아 n 에 저장한다.
for문으로 i 가 0부터 n 보다 작을 때 1씩 더하며 반복하도록 한다.
반복 내에서 for문을 사용하여 k 가 0부터 26보다 작을 때 1씩 더하며 반복한다.
반복에서는 a 의 k 번 인덱스 값을 0으로 초기화한다.
위의 반복이 끝나면 cin 으로 문자열을 입력받아 s 에 저장한다.
for문으로 j 가 0부터 문자열 s 의 길이보다 작을 때 1씩 더하며 반복하도록 한다.
반복에서는 먼저 if문으로 배열 a 에서 문자열 s 의 j 번 인덱스 값에서 97 을 뺀 값을 인덱스로 참조하여 해당 값이 1이라면 break 로 반복을 빠져나간다.
위 조건이 거짓인 경우, if문으로 문자열 s 의 j 번 인덱스의 값과 j + 1 번 인덱스의 값이 다른지 확인한다.
다르다면 배열 a 에서 문자열 s 의 j 번 인덱스 값에서 97 을 뺀 값을 인덱스로 참조하여 해당 값을 1로 바꾼다.
위 조건을 확인한 후, j 와 문자열 s 의 길이 - 1 값이 같은 경우, 즉 마지막 반복인 경우를 확인하여 맞다면 word 에 1을 더한다.
반복이 모두 끝나면 word 를 출력한다.
4. 성능 확인

5. 마무리
.
'백준 - 단계별로 풀어보기 > 심화 1' 카테고리의 다른 글
[백준] 25206번 : 너의 평점은 | C++ (0) | 2023.10.12 |
---|---|
[백준] 2941번 : 크로아티아 알파벳 | C++ (0) | 2023.10.11 |
[백준] 1157번 : 단어 공부 | C++ (1) | 2023.10.11 |
[백준] 10988번 : 팰린드롬인지 확인하기 | C++ (0) | 2023.10.11 |
[백준] 2444번 : 별 찍기 - 7 | C++ (0) | 2023.09.26 |