실습/백준

그룹 단어 체커 - 1316번 (Java 풀이)

chobyeonggyu03 2024. 7. 21. 21:54
반응형

문제

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

단어 N개를 입력으로 받아 그룹 단어의 개수를 출력하는 프로그램을 작성하시오.

 

 

입력

첫째 줄에 단어의 개수 N이 들어온다. N은 100보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 단어가 들어온다. 단어는 알파벳 소문자로만 되어있고 중복되지 않으며, 길이는 최대 100이다.

 

 

출력

첫째 줄에 그룹 단어의 개수를 출력한다.

 

 

예제 입력 1 

3
happy
new
year

예제 출력 1 

3

예제 입력 2 

4
aba
abab
abcabc
a

예제 출력 2 

1

예제 입력 3 

5
ab
aa
aca
ba
bb

예제 출력 3 

4

예제 입력 4 

2
yzyzy
zyzyz

예제 출력 4 

0

예제 입력 5 

1
z

예제 출력 5 

1

예제 입력 6 

9
aaa
aaazbz
babb
aazz
azbz
aabbaa
abacc
aba
zzaz

예제 출력 6 

2

 
 
 
나는 이 문제를 처음 봤을 때 가장 들었던 풀이 방법은 저번 풀이 때 알게 되었던 indexOf를 활용해 문자열을 입력받았을 때 각각의 문자들에 대해 자신의 index +1 부터 해당문자를 indexOf로 찾아 indexOf가 없다면 중복되는 문자가 아니기에 그룹단어에 영향을 주지 않는 것이고, 있다면 반환되는 index에서 비교하는 문자의 원래 위치를 뺏을 때 차이가 1이라면 연속되어 중복된 문자가나온 것이니 다시 index+1을하여 방금한 풀이를 반복하고 1보다 큰차이라면 바로 break하여 중복단어가 아님을 표현해주는 풀이였기에 해당 방법으로 풀이를 진행해보았다.
 

 

백준 제출용 코드

import java.util.*;

public class Main {

	public static void main(String[] args) throws Exception {
		Scanner sc = new Scanner(System.in);
		
		int n = sc.nextInt();			
		sc.nextLine();	
		int GroupCount = 0;									
		
		for(int i=0; i<n; i++) {
			String str = sc.nextLine();					
			int nonGroupCount = 0;						
			
			for(int j=0; j<str.length(); j++) {			
				char ch = str.charAt(j);
				int chLocation = str.indexOf(ch, j+1);
                
				if(chLocation == -1) {					
					continue;
				}else if(chLocation > -1) {				
					if(chLocation - j == 1) {			
						continue;
					}else if (chLocation - j > 1) {		
						nonGroupCount++;
						break;
					}
				}
			}
			if(nonGroupCount > 0 ) {				
				continue;
			}else if(nonGroupCount == 0) {			
				GroupCount++;
			}
		}
		System.out.println(GroupCount);				
	}
}

 
 
 
 

주석, 테스트 코드 포함

package BAEKJOON_1316;
/*
 날짜: 2024.07.21.일
 내용: 백준 1316번 (그룹 단어 체커)
 */

import java.util.*;

public class BAEKJOON_1316 {

	public static void main(String[] args) throws Exception {
		Scanner sc = new Scanner(System.in);
		
		int n = sc.nextInt();							// 그룹 단어 체크할 문자열의 갯수 입력받는 변수
		sc.nextLine();									// \n 제거	
		int GroupCount = 0;									// 그룹 단어 개수 체크할 변수
		
		for(int i=0; i<n; i++) {
			String str = sc.nextLine();					// 그룹 단어 체크할 문자열 입력받기
//			System.out.println();					
//			System.out.println("i: "+ i);					
			int nonGroupCount = 0;							// 그룹 문자열이 아닌걸 체크할 때 사용되는 변수
			
			for(int j=0; j<str.length(); j++) {			// 반복문을 활용하여 문자열을 순회하며 그룹 단어인지 체킹후 카운팅
				char ch = str.charAt(j);
//				System.out.println(j+"번째 ch: "+ch);					
				
				int chLocation = str.indexOf(ch, j+1);
//				System.out.println(j+"번째 chLocation: "+chLocation);					
				if(chLocation == -1) {					// indexOf의 반환값이 -1이면 해당문자가 없다는 것이므로 해당 문자는 그룹단어 성립
					continue;
				}else if(chLocation > -1) {				// indexOf의 반환값이 -1이 아니라 다른 값이라면 다른 값이 존재한다는 것이므로 연속된 것인지 아닌지 판단
					if(chLocation - j == 1) {			// 원래 위치에서 chLoaction을 뺸 값이 1이라면 연속되어 같은 문자가 나온 것이므로 그룹 단어 성립
						continue;
					}else if (chLocation - j > 1) {		// 원래 위치에서 chLocation을 뺵 값이 1보다 크다면 연속되지 않게 같은 문자가 또 있는 것이기에 그룹단어에 성립되지 않음
						nonGroupCount++;
						break;
					}
				}
			}
			if(nonGroupCount > 0 ) {					// break문으로 빠져나올 때 그룹단어가 아니라고 카운팅 되었다면 그룹단어 수를 카운팅하지 않음
				continue;
			}else if(nonGroupCount == 0) {				// nonGroupCount이 카운팅 되지 않았다면 그룹 단어로 카운팅
				GroupCount++;
			}
		}
		System.out.println(GroupCount);					// 그룹 단어 개수 출력
	}
}

 
 
 

 

 
 
 
 

 
 
 
이전에 다른 사람들의 풀이를 참고했을 때 그 문제만 풀고 휘발되는게 아니라 그 내용을 응용해서 혼자 힘으로 다른 문제를 풀게 되어 너무기쁘고,  내 것으로 제대로 체화 시켜 성장하고  있다는 것이 느껴져 기쁘다 ( 찌야아아아아스~~ )
 
 
 
 

반응형