STUDY/백준알고리즘

[1316:JAVA] 함수 > 그룹 단어 체커

bameh 2022. 2. 21. 23:30

[백준알고리즘: 함수 단계 > 10. 그룹 단어 체커] - JAVA

 

문제

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

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

 

입력

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

 

출력

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

 

[풀이방법]

Main이 아닌 다른 함수를 이용하는 방식을 생각해내지 못하여 아래의 블로그에서 힌트를 얻었다.

(※참고: https://st-lab.tistory.com/69)

 

일단 문제를 따라서 필요한 부분의 틀을 잡아주었다.

public class ch7_10 {
    static Scanner sc = new Scanner(System.in);
    public static void main(String[] args)  {
        // 입력할 단어의 개수 N을 입력한다.
        int N = sc.nextInt();
        // 그룹 단어의 개수를 셀 변수를 선언한다.
        int cnt = 0;

        // N만큼 단어를 입력한다.
        for (int i=0; i<N; i++) {
            // 단어가 그룹단어일 때 cnt를 증가 시킨다.(함수 사용)
            if (groupCheck() == true) cnt++;
        }

        // for문이 종료되면 그룹단어의 개수가 출력된다.
        System.out.println(cnt);
    }
}

 

그룹 단어는

1. 문자열에서 연속되는 알파벳의 중복 여부를 확인한 후 (ex. apple 에서 ap, pp, pl, le가 중복인지 확인)

2. 연속되는 알파벳이 중복되지 않았을 때 마지막 알파벳이 출력된 적 있는지를 확인하는 방식으로 구할 수 있다.

 

가장 먼저 그룹 단어를 구할 수 있는 함수의 틀을 작성한다.

// 그룹단어를 찾을 함수를 선언한다.
public static boolean groupCheck() {
    // 전체 알파벳 수만큼 배열을 선언하여 중복 값을 확인하도록 한다.
    boolean[] grpChk = new boolean[26];

    // 첫 번째 단어를 비교하기 위해 비교 알파벳을 입력할 n1를 선언한 후 str 단어를 입력한다.
    int n1 = 0;
    String str = sc.next();
    }
    return true;
}

 

위에서 선언한 str의 길이만큼 for문을 반복하고, str의 문자열을 n2에 하나씩 입력한다.

 for (int i=0; i<str.length(); i++){
    // str 단어의 문자열을 하나씩 n2에 입력한다.
    int n2 = str.charAt(i);
}

 

for문 내에서 첫 번째 알파벳(n1)과 두 번째 알파벳(n2)이 같은지 비교한다.

1) 두 값이 같을 때, 중복 검사를 하지 않고 n2와 다음 알파벳을 비교하기 위해 for문을 진행한다.

2) 두 값이 다를 때, grpChk 배열을 사용하여 중복되지 않은 알파벳이 이전에 출력된 적이 있는지 확인하여 중복 값을 찾는다.

2-1) 알파벳이 이전에 출력된 적 있을 때에는 값을 false를 return하여 다음 코드를 진행한다.

2-2) 알파벳이 이전에 출력된 적 없을 때에는 값을 true로 변경하고 n2의 값을 n1로 이동시켜 다음 코드를 진행할 수 있도록 한다.

 // 첫 번째 단어와 두 번째 단어가 같지 않은 경우
if (n1 != n2) {
    // grpChk 배열을 사용하여 값이 false(처음 등장)인지 확인하여 중복 값을 찾는다.
    if (grpChk[n2 - 'a'] == false){
        // 해당 값을 true로 변경하여 출력된 값임을 나타낸다.
        grpChk[n2 - 'a'] = true;
        // n2의 값을 n1로 옮겨서 다음 단어를 n2에 입력받는 형식으로 코드를 진행한다.
        n1 = n2;
    } else {
        return false;
    }
} else {
    // 중복 검사를 하지 않고 다음 for문을 진행한다.
    continue;
}

 

 

# 전체 코드

public class ch7_10 {
    static Scanner sc = new Scanner(System.in);
    public static void main(String[] args)  {

        // 입력할 단어의 개수를 입력한다.
        int N = sc.nextInt();
        // 그룹 단어의 개수를 셀 변수를 선언한다.
        int cnt = 0;


        // N만큼 단어를 입력한다.
        for (int i=0; i<N; i++) {
            // 그룹단어일 때 cnt를 증가 시킨다.
            if (groupCheck() == true) cnt++;
        }

        // for문이 종료되면 그룹단어의 개수가 출력된다.
        System.out.println(cnt);
    }

    // 그룹단어를 찾을 함수를 선언한다.
    public static boolean groupCheck() {
        // 전체 알파벳 수만큼 배열을 선언하여 중복 값을 확인하도록 한다.
        boolean[] grpChk = new boolean[26];

        // 첫 번째 단어를 비교하기 위해 n1를 선언한 후 str 단어를 입력한다.
        int n1 = 0;
        String str = sc.next();

        // str의 길이만큼 for문을 진행한다.
        for (int i=0; i<str.length(); i++){
            // str 단어의 문자열을 하나씩 n2에 입력한다.
            int n2 = str.charAt(i);

            // 첫 번째 단어와 두 번째 단어가 같지 않은 경우
            if (n1 != n2) {
                // grpChk 배열을 사용하여 값이 false(처음 등장)인지 확인하여 중복 값을 찾는다.
                if (grpChk[n2 - 'a'] == false){
                    // 해당 값을 true로 변경하여 출력된 값임을 나타낸다.
                    grpChk[n2 - 'a'] = true;
                    // n2의 값을 n1로 옮겨서 다음 단어를 n2에 입력받는 형식으로 코드를 진행한다.
                    n1 = n2;
                } else {
                    return false;
                }
            } else {
                // 중복 검사를 하지 않고 다음 for문을 진행한다.
                continue;
            }
        }
        return true;
    }
}