gimmickbutreal

[백준/자바] 1316번 해설 - Java 본문

Algorithm/Java

[백준/자바] 1316번 해설 - Java

isshosng 2022. 2. 24. 16:02

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

 

1316번: 그룹 단어 체커

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

www.acmicpc.net

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
//문제
// 그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다.
// 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때문에 그룹 단어이지만, aabbbccb는 b가 떨어져서 나타나기 때문에 그룹 단어가 아니다.
// 단어 N개를 입력으로 받아 그룹 단어의 개수를 출력하는 프로그램을 작성하시오.
//입력
// 첫째 줄에 단어의 개수 N이 들어온다. N은 100보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 단어가 들어온다. 단어는 알파벳 소문자로만 되어있고 중복되지 않으며, 길이는 최대 100이다.
//출력
// 첫째 줄에 그룹 단어의 개수를 출력한다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main{
 
    static boolean words(String str){ // true or false의 값을 갖는 자료형 변수를 boolean이라고 함
        boolean isCheck = true// 그룹 단어일 경우를 찾아보기 위함(참값)
        int[] alphabet = new int[26]; // 알파벳 26개
        int pre = -1// 앞에 나오는 단어
        int bck = -1// 뒤에 나오는 단어
 
        for(int i = 0; i<str.length(); i++){
            bck = str.charAt(i) - 97// 소문자의 범위가 인덱스 상에서 97~122이므로 97을 빼어서 계산
            // 대문자는 65~90이므로 대문자를 입력받고자 할 때는 65를 빼면 된다
 
 
            if(bck != pre){ // 앞에 나오는 단어와 뒤에 나오는 단어가 다를 때
                if(pre != -1// 앞에 나오는 단어의 값이 -1이 아닐 때
                    alphabet[pre] = -1// 앞에 나오는 단어를 배열 -1로 바꿈
                pre =  bck; // 앞에 나오는 단어를 뒤에 나오는 단어로 변경
            }
 
            if(alphabet[bck] == -1){ // 뒤에 나오는 단어의 배열이 -1이면 변경이 된 경우이므로 그룹 단어가 아님
                isCheck = false// 그러므로 거짓값
                break;
            }
        }
        return isCheck;
    }
 
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        int N = Integer.parseInt(br.readLine()); // 첫째 줄에 필요한 변수 N
        int cnt = 0;
 
        for(int i=0; i<N; i++) { // 입력받은 단어의 수만큼 반복
            if (words(br.readLine())) // 그룹 단어일 경우에 cnt++;
                cnt++;
        }
        System.out.print(cnt); // 첫째 줄에 단어의 개수를 출력함
        }
}
cs