백준 알고리즘/문자열

[JAVA 자바] 백준 1316번 : 그룹 단어 체커

Sun720 2022. 6. 9. 10:07

▶ 문제

https://www.acmicpc.net/problem/1316

 

1316번: 그룹 단어 체커

그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때

www.acmicpc.net

 설명

동일한 알파벳이 연속으로 나올 경우는 pass(무시) 하고 다른 글자와 섞여서 재등장 한다면 그때 걸러내서 출력에서 카운트로 제외시키는 방식으로 문제에 접근해 보았다.

 

알파벳을 어떻게 읽어올지, 연속된 상황은 어떻게 체크할 것인지, 다시 동일한 알파벳이 다른 글자 뒤에 재등장 한다면 어떻게 또 체크해서 걸러낼 것인지를 고민해 보았다.

 

알파벳을 읽어오는 방법은 지금까지 많이 사용했었던 charAt을 사용하면 되고, 

같은 알파벳이 연속되어 있는지는 연속되지 않을 때 그 알파벳에 1씩 더해주도록 하였다.

 

이게 무슨 말이냐면, 먼저 알파벳 a~z 를 모두 담을 배열을 하나 만든다.

int 형 배열을 만들어 인덱스 값이 곧 알파벳의 아스키코드 십진법 값으로 대입하였고,

앞의 알파벳과 비교하여서 서로 다른 알파벳일 경우엔 알파벳이 위치한 자리에 값을 1 더해주도록 한 것이다.

만약 앞의 알파벳과 다른 a라는 알파벳이 있다라고 하면 첫번째 인덱스에 1을 더해주는 식이다. 마찬가지로 b라면 두 번째 인덱스에 접근해서 더해준다.

 

인덱스 값이 2 이상일 경우엔 그룹단어가 아니므로 출력 카운트에서 제외될 수 있다.

예를 들어 aaba 처럼 a 가 4번째 자리에서 한 번 더 재등장하게 된다면 결국 알파벳 배열에서 첫번째 인덱스  값이 2가 되므로 그룹단어가 아니라는 것을 알 수 있다.

 

코드로 풀면 다음과 같다.

 

 

 

 

문제 풀이

🌱 풀이1.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;

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 arr[];
		boolean result;
		int cnt = 0;
		
		for(int i=0; i<n; i++) {
			arr = new int[26];
			String s = br.readLine();
			int ch = s.charAt(0) - 'a';
			arr[ch]++;
			result = true;

			This1: for (int j = 1; j < s.length(); j++) {
				ch = s.charAt(j) - 'a';
				if (s.charAt(j - 1) != s.charAt(j)) {
					arr[ch]++;
					if (arr[ch] == 2) {
						result = false;
						break This1;
					}
				}
			}
			if (result) {
				cnt++;
			}
		}
		System.out.println(cnt);
	}
}

 

arr 배열에는 알파벳을 담는다. 정확히 말하면 알파벳의 인덱스를 담는다고 해야 할 것이다.

 

a 가 arr[0]의 인덱스가 되어야 하기 때문에 0으로 맞춰주기 위해서 a의 아스키코드로 대응되는 십진수를 빼주었다.

 

처음 등장하는 알파벳을 먼저 플러스 해 준뒤 다음에 등장하는 알파벳 부터는 반복문을 돌렸다.

앞의 알파벳과 비교하기 위해서다.

 

 

2번째로 더하기를 하게 되면 2가 되므로 이 땐 그룹단어가 아니게 되니까 가까운 반복문을 빠져나가고 count 에서 제외시킨다.

This1을 쓰지 않으면 반복문이 닫히지 않고 에러가 난다.

 

 

Log

은근히 시간이 오래 걸렸는데 그래도 해볼만한 문제였다. 

이미 알고 있던 메소드로만 사용해서 어렵지 않았지만 배열의 인덱스마저 의미를 둬야 하니까 머리속에서 많이 꼬였던 것이 쉽지 않았다.

이로써 백준의 단계별로 푸는 문제에서 문자열 단계 문제까지 풀어보았다. 여기까지는 아직 본격적인 알고리즘 문제를 마딱뜨리지 않았기 때문이라 그런지 무난히 지나온 거 같다. 앞으로 산넘어 산이지만 다음 문제도 무난히..는 아니고 무사히 문제풀이를 이어가도록 해야겠다. 

728x90
반응형