알고리즘/백준 풀이(문자열)
백준 1316번 - 그룹 단어 체커
공부 기록장
2024. 1. 7. 21:44
https://www.acmicpc.net/problem/1316
1316번: 그룹 단어 체커
그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때
www.acmicpc.net
▶그룹단어란 happy 처럼 알파벳이 서로 떨어져 있지 않은 경우를 말하고 aba 처럼 알파벳 a가 서로 떨어져 있을 경우 그룹단어가 아니다.
ex) alpha[26] 배열을 생성하고 aba 라는 문자열이 있을 때
먼저 a가 속하는 alpha[0] 에 true 값을 반환해주고
그 다음 b가 속하는 alpha[1] 에 true 값을 반환하고
그 다음 a가 속하는 alpha[0] 에 true 값을 반환하려고 했는데 이미 alpha[0]이 true 값이기 때문에 이 경우는 그룹단어가 아닌 걸로 판단하는 식으로 코드를 작성할 수 있다.
아래 코드에서는 a 나 ab 처럼 문자열 길이가 1이나 2인 경우 그룹단어이기 때문에 따로 빼줬고
이 외에는 이전 알파벳이 나온 경우 count 값을 증가하고 만약 count 값이 양수이면 그룹단어가 아닌 걸로 판단하여 word 변수에 1씩 더해준 다음 입력받은 N 에 word 를 빼서 그룹단어의 갯수를 출력하였다.
코드
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
String arr[] = new String[N];
boolean alpha[][] = new boolean[N][26];
int count=0;
int word=0;
for(int i=0;i<N;i++)
{
arr[i] = br.readLine();
}
for(int i=0;i<N;i++)
{
if(arr[i].length()==1||arr[i].length()==2)
{
continue;
}
else
{
count=0;
for(int j=0;j<arr[i].length();j++)
{
char s = arr[i].charAt(j);
byte num = (byte)s;
if(j==0)
alpha[i][num-97]=true;
else if(j>0)
{
if(s==arr[i].charAt(j-1)) //이전 알파벳과 같은 경우
{
alpha[i][num-97]=true;
}
else //이전 알파벳과 다른 경우
{
if(alpha[i][num-97]==true)
{
count++;
}
else
{
alpha[i][num-97]=true;
}
}
}
}
if(count>0)
word+=1;
}
}
System.out.println(N-word);
}
}