본문 바로가기
백준 문제 풀이/심화 1

(#1316 Java) 그룹 단어 체커

by _비니_ 2024. 2. 21.

 

문제 이해

 

이 문제를 해결하기 위해서는 '그룹 단어'라는 말을 제대로 이해할 필요가 있다.

쉽게 설명하자면, 같은 문자가 다른 문자가 나온 후 다시 나온다면, 그룹 단어라고 하지 않는 것 같다.

이를 숙지하고 위 예제 입출력을 순서대로 보면

 

  • 1번 예제 : 3개 모두가 그룹단어라고 한다.
  • 2번 예제 : 4번 째를 제외한 모든 단어들이 같은 문자가 다른 문자 사이 사이 등장하기 때문에 그룹단어가 아니다.
  • 3번 예제 : 3번째 aca가 a가 c를 사이에 두고 다시 등장하므로 그룹 단어가 아니다.

그룹 단어에 대한 이해가 됐으면 이제 문제를 풀어보자.

 

문제 해결

 

우선 그룹 단어인지 체크하는 함수를 만들어보자.

 

현재를 저장하는 변수와, 이전을 저장하는 변수를 각각 만들어줬다.

이전을 저장하는 prev에는 만약 현재 인덱스가 0보다 작거나 같을 때 인덱스가 음수가 되지 않도록 0으로 설정하는 코드로 작성해두었다.

int now = str.charAt(i);
int prev = (i > 0) ? str.char(i-1) : 0;

 

 

그리고 단어를 저장할 배열을 만들어준다. 이 배열은 각 알파벳이 이전에 등장했는지 여부를 저장하는데 사용된다.

그룹 단어인지, 아닌지 true, false로 반환되기를 원하기 때문에 boolean 타입으로 만들어주었다.

boolean words[] = new boolean[26];

 

 

이 부분이 중요하다.★

입력된 문자열이 그룹 문자열인지 여부를 판별하는 조건문을 만들어보자.

이전에 등장했는지 여부를 저장하는데 사용

if (words[now - 'a'] == false)
    words[now - 'a'] = true;
  else if (now != prev)
    return false;
}
  • 만약 현재 문자가 이전에 등장하지 않았으면 (alpha[now - 'a']가 false인 경우),  값을 true로 설정해준다.
  • 현재 문자가 이미 이전에 등장한 경우이면서 이전 문자와 다르다면, 즉 중복된 문자가 연속으로 등장하는 경우에는 false를 반환하고 종료한다.

 

그럼 그룹 단어인지 체크하는 함수의 전체 코드를 보자.

static boolean isGroupWord(String str) {

    boolean words[] = new boolean[26];
    
    for (int i = 0; i < str.length(); i++) {
    
      int now = str.charAt(i);
      
      int prev = (i > 0) ? str.charAt(i - 1) : 0;
      
      if (words[now - 'a'] == false)
        words[now - 'a'] = true;
      else if (now != prev)
        return false;
    }
    
    return true;
  }

 

 

그럼 이제 isGroupWord 함수를 이용해 isGroupWord 가 true이면 count를 증가시키는 코드를 추가해주면 끝이다.!!

 

개인적으로 조금 어려웠던 문제였다..

 

최종 코드
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);

        int count = 0;
        int N = in.nextInt();

        for(int i = 0; i < N; i++) {
            if(isGroupWord(in.next())) //isGroupWord 가 true면 count 증가
                count++;
        }

        System.out.println(count);
        in.close();
    }

    static boolean isGroupWord(String str) {

        boolean words[] = new boolean[26];

        for (int i = 0; i < str.length(); i++) {

            int now = str.charAt(i);

            //현재 인덱스가 0보다 작거나 같을 때 인덱스가 음수가 되지 않도록 0으로 설정
            int prev = (i > 0) ? str.charAt(i - 1) : 0;

            if (words[now - 'a'] == false) //현재 문자가 이전에 등장하지 않았으면
                words[now - 'a'] = true; //값을 true로 설정
            else if (now != prev) //현재 문자가 이미 이전에 등장한 경우이면서 이전 문자와 다르면
                return false; //false 반환
        }

        return true;
    }

}
반응형

'백준 문제 풀이 > 심화 1' 카테고리의 다른 글

(#25206 Java) 너의 평점은  (0) 2024.02.23
(#2941 Java) 크로아티아 알파벳  (0) 2024.02.21