백준 1316 - 그룹 단어 체커

Updated:

Java

1316 번 - 그룹 단어 체커

문제

그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다.
예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때문에 그룹 단어이지만, aabbbccb는 b가 떨어져서 나타나기 때문에 그룹 단어가 아니다.
단어 N개를 입력으로 받아 그룹 단어의 개수를 출력하는 프로그램을 작성하시오.
문제 출처

접근 방법

결국 그룹 단어란 각 종류의 알파벳이 연속되게 나와야 한다는 것이다.
즉, 이전에 나온 알파벳이 새롭게 나온다면 이는 그룹단어가 아니다.
문제의 조건대로 알파벳의 위치를 인덱스로 하는 배열을 만들어, 직전에 나온 알파벳이 현재 알파벳이랑 다른 상황에서 그 알파벳이 이전에도 나왔다고 확인되면 종료하고 그룹 단어 개수를 줄인다.

구현

단어 하나를 받을 때 마다 단어 길이 - 1 만큼 반복을 한다.
현재 알파벳과 이전 알파벳이 다르며 visited에 0과 다른 수가 있어 이미 방문했으면, 그룹 단어가 아니므로 반복문을 종료한다.

코드

/*
1316번 - 그룹 단어 체커
https://www.acmicpc.net/problem/1316
*/

import java.util.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String []args) throws IOException {        
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	
    	int n = Integer.parseInt(br.readLine());
    	int cnt = n;
    	int visited[];
    	boolean isGroup = true;
    	for(int i = 0; i < n; i++) {
    		visited = new int[26];
    		String str = br.readLine();
    		char lastC = str.charAt(0);		// 시작 알파벳 세팅
    		visited[lastC - 'a'] = 1;		// 시작 알파벳 위치
    		for(int j = 1; j < str.length(); j++) {
    			char curC = str.charAt(j);
    			if(lastC != curC && visited[curC - 'a'] != 0) {		// 현재 알파벳과 이전 알파벳이 다르며, 한번 방문한 알파벳일 시
    				isGroup = false;
					break;
    			}
    			else {		//처음 방문한 알파벳이거나, 이전 알파벳이랑 연속 될 시
    				visited[curC - 'a']++;
    			}
    			lastC = curC;
    		}
    		if(!isGroup) {
    			cnt--;
    			isGroup = true;
    		}
    	}
    	
    	System.out.println(cnt);
    	br.close();
    }
}

접근 방법

자바 String 메소드 중 indexOf를 이용하여 더 간단하게, 코드를 줄여서 다시 해결해보았다.

구현

indexOf는는 String에서 한 문자가 처음 나오는 위치를 반환하는 메소드이다.
따라서 같은 문자가 여러개 있더라도, 그 문자의 처음만 반환하므로 만약 한 String에서 한 문자의 indexOf가 이전 문자의 indexOf보다 더 작으면,
그 알파벳이 이전에도 나왔으며, 중간에 다른 문자가 껴있는 즉 그룹단어가 아닌 문자열인 것으로 판별 된다.
예를 들어, aabbbac라는 String이 판별 대기 중이라고 한다.
위의 문자열의 각 알파벳의 indexOf로 변환하면, 0022206이다.
6번째의 a가 처음 위치의 a와 같으므로, 6번째 위치에 있다 하더라도 처음 나타난 위치인 0이 반환되는 것이다.
따라서 2인 b보다 뒤에 위치하는데 0으로 더 작으면 그룹 단어가 아니라고 판별 할 수 있는 것이다.

코드




총평

난이도

⭐★★★★

후기

마찬가지로 해결방법이 눈에 바로 보인문제

개선할 점

indexOf로 더 간단하고 효율적인 코드를 구현해 보았다.