티스토리 뷰
반응형
1. 문제
https://www.acmicpc.net/problem/1316
1316번 그룹 단어 체커
2. 해결방안
그룹 단어란 각 문자가 연속해서 나타나야만 한다.
예를 들어, aabbccc 는 a도 연속으로 나타나고 b도 연속으로 나타나고 c도 연속으로 나타나기 때문에
그룹단어라고 할 수 있다.
하지만 aabbcca 같이 b와 c는 연속으로 나타나지만 a알파벳은 맨 끝에 동떨어진 a가 있기 때문에
이 케이스는 그룹단어가 아니라고 할 수 있다.
문제 이해가 끝났으니 이제 구현을 해보자.
단어를 입력받아 처음 알파벳부터 끝 알파벳까지 순회하며 검사를 진행할것인데
순회를 하면서 a~z까지의 알파벳의 최신위치(인덱스)를 계속 갱신할 것이다.
그러다가 이전에 갱신한 알파벳과 현재의 알파벳 위치가 2칸이상 차이나게 되면
그 즉시 반복문을 빠져나와 boolean 값을 false로 바꾸고 카운팅을 하지 않게 만들 것이다.
그림으로 요약하자면 다음과 같다.
물론 인덱스배열의 초기값을 -1로 초기화 할 것이기 때문에
순회를하면서 이전 인덱스가 -1값이 아닐 때만 조건을 확인할 것이다.
여기까지를 바탕으로 코드를 짜보도록 한다.
3. 풀이
/**
* Written by 0xc0de1dea
* Email : 0xc0de1dea@gmail.com
*/
public class Main {
public static void main(String[] args) throws Exception {
//System.setIn(new java.io.FileInputStream("input.in"));
Reader in = new Reader();
int n = in.nextInt();
int counting = 0;
for (int i = 0; i < n; i++){
char[] word = in.nextString().toCharArray();
int[] prevIdx = new int[26];
for (int j = 0; j < 26; j++){
prevIdx[j] = -1;
}
boolean flag = true;
for (int j = 0; j < word.length; j++){
int prev = prevIdx[word[j] - 'a'];
if (prev != -1 && j - prev > 1){
flag = false;
break;
}
prevIdx[word[j] - 'a'] = j;
}
if (flag){
counting++;
}
}
System.out.print(counting);
}
}
class Reader {
final int SIZE = 1 << 13;
byte[] buffer = new byte[SIZE];
int index, size;
String nextString() throws Exception {
StringBuilder sb = new StringBuilder();
byte c;
while ((c = read()) < 32) { if (size < 0) return "endLine"; }
do sb.appendCodePoint(c);
while ((c = read()) >= 32); // SPACE 분리라면 >로, 줄당 분리라면 >=로
return sb.toString();
}
char nextChar() throws Exception {
byte c;
while ((c = read()) < 32); // SPACE 분리라면 <=로, SPACE 무시라면 <로
return (char)c;
}
int nextInt() throws Exception {
int n = 0;
byte c;
boolean isMinus = false;
while ((c = read()) <= 32) { if (size < 0) return -1; }
if (c == 45) { c = read(); isMinus = true; }
do n = (n << 3) + (n << 1) + (c & 15);
while (isNumber(c = read()));
return isMinus ? ~n + 1 : n;
}
long nextLong() throws Exception {
long n = 0;
byte c;
boolean isMinus = false;
while ((c = read()) <= 32);
if (c == 45) { c = read(); isMinus = true; }
do n = (n << 3) + (n << 1) + (c & 15);
while (isNumber(c = read()));
return isMinus ? ~n + 1 : n;
}
double nextDouble() throws Exception {
double n = 0, div = 1;
byte c;
boolean isMinus = false;
while ((c = read()) <= 32) { if (size < 0) return -12345; }
if (c == 45) { c = read(); isMinus = true; }
else if (c == 46) { c = read(); }
do n = (n * 10) + (c & 15);
while (isNumber(c = read()));
if (c == 46) { while (isNumber(c = read())){ n += (c - 48) / (div *= 10); }}
return isMinus ? -n : n;
}
boolean isNumber(byte c) {
return 47 < c && c < 58;
}
boolean isAlphabet(byte c){
return (64 < c && c < 91) || (96 < c && c < 123);
}
byte read() throws Exception {
if (index == size) {
size = System.in.read(buffer, index = 0, SIZE);
if (size < 0) buffer[0] = -1;
}
return buffer[index++];
}
}
반응형
최근에 올라온 글