[JAVA]백준 알고리즘/단계별 - 문자열

[JAVA]백준 알고리즘 1316번 : 그룹 단어 체커

코린이J 2023. 1. 17. 03:29
728x90

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

 

1316번: 그룹 단어 체커

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

www.acmicpc.net

문제

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

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

 

풀이

문제에서 정의한 "그룹 단어"의 개수를 찾는 문제이다.

필자는 group() 함수를 만들어서 문제를 해결하였다.

 

group() 함수의 역할은 다음과 같다.

 

알파벳이 26개이므로, 크기가 26인 boolean 배열을 만든다.

charAt() 메서드를 사용하여 한 글자씩 가져오고, 해당 글자의 배열이 false일 경우 true로 변환.

true일 경우 이미 한 번 이상 나왔다는 의미이므로 그 전의 글자와 연속으로 나왔는지 확인, 그렇지 않다면 0을 return

반복문이 종료될 때까지 return 되지 않았다면, "그룹 단어"라는 뜻이므로 1을 return 하였다.


🔔 자세한 코드 설명은 더보기 란에 작성하였습니다.

더보기

1. 입력될 단어의 개수를 입력받고, count 변수를 초기화한다. 이후 반복문을 N번 돌린다.

반복문 안에서는 단어를 입력받고, group() 함수를 실행시켜 나온 결과를 count에 더한다.

int N = Integer.parseInt(br.readLine());
int count = 0;
for(int i = 0; i < N; i++) {
    String s = br.readLine();
    count += group(s);
}

 

2. group() 함수

2-1. 크기가 26인 boolean 배열을 생성한다. (알파벳이 26개 이기 때문)

boolean[] dup = new boolean[26];

2-2. 단어의 길이만큼 반복문을 돌린다.

2-2-1. j번째 문자를 int형으로 가져온다. (charAt() 메서드 사용)

2-2-2. 해당 알파벳 자리의 배열값이 false일 경우, true로 변환한다. (이번에 나왔기 때문에, 다음에 또 나오면 "그룹 단어"가 아닐 확률이 생김)

2-2-3. 해당 알파벳 자리의 배열값이 true일 경우, 바로 앞의 문자와 같은지 확인한다. 다르다면, "그룹 단어"가 아니기 때문에 0을 return 한다.

for(int j = 0; j < s.length(); j++) {
    int c = s.charAt(j);
    if(!dup[c - 'a']) dup[c - 'a'] = true;
    else if(s.charAt(j - 1) != c) return 0;
}

2-3. 반복문이 종료될 때까지 0을 return 하지 않았다면, "그룹 단어"라는 의미이므로 1을 return 한다.

return 1;

코드

BufferedReader 클래스를 이용한 코드

import java.io.*;

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 count = 0;
        for(int i = 0; i < N; i++) {
            String s = br.readLine();
            count += group(s);
        }
        System.out.println(count);
    }
    public static int group(String s) {
        boolean[] dup = new boolean[26];
        for(int j = 0; j < s.length(); j++) {
            int c = s.charAt(j);
            if(!dup[c - 'a']) dup[c - 'a'] = true;
            else if(s.charAt(j - 1) != c) return 0;
        }
        return 1;
    }
}

 

틀린 부분이 있다면 정정해 주시면 감사하겠습니다.
궁금한 부분이 있거나, 다른 아이디어가 있으시면 자유롭게 댓글 남겨주세요!

728x90