백준 1316 그룹 단어 체커 [JAVA]

Ga0·2023년 3월 20일
0

baekjoon

목록 보기
2/137
post-custom-banner

문제 개념 정리

그룹 단어란?

단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우!

  • 결론, 1316번 그룹 단어 체커문제는 소문자로만 이루어진 문자가 그룹문자 형식을 통과하면 통과한 최종 그룹 문자의 개수를 출력하면 되는 문제이다.

내가 작성한 코드

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws  Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        int count  = 0; //그룹단어를 카운트할 int 변수

        for(int  i = 0; i  < N; i++){
            if(checkStr(br.readLine())){ //한줄씩 문자열을 받아서 만약 유효성이 통과되면
                count++; //count++ => 단어가 그룹단어다!
            }
        }
        br.close(); //이제 입력받을 값이 없으니까 닫고
        System.out.println(count); //단어 개수를 출력한다.
    }

    static boolean checkStr(String str){

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

        }
    }
}
  • 위의 코드까지 어찌저찌 생각했는데 이 다음부터 어떻게해야할지 생각이 안나서 이 이후부터는 다른 분들의 코드를 참고하였다.

  • 그래서 공부할겸 참고한 것을 토대로 이 문제를 풀어 정리해보고자 한다.

  • 코드에 관한 설명은 주석으로 모두 넣어놨지만, 나중에 봤을 때 이해하기 쉽게 그림으로 정리하였다.

  • 그에 관한 설명은 아래와 같다.

    문제 해석




  • 이런식으로 쭉 가다가 true값을 마주치지 않고 반복문이 끝나게 되면, 그룹문자이라는 것이고
  • 위의 예시처럼 뒤에서 첫번째하고 앞에서 첫번째, 뒤에서 두번째와 앞에서 두번째 값이 동일한 경우, 4번째 인덱스에 있는 o에서 true값을 만나 return false; 를 반환할 것이다.
  • 즉, 예시는 count++를 수행할 수 없다.
  • 하지만,happy 등등 다른 그룹문자들의 예시에서는 count++; 을 수행할 것이다.

해답 코드

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws  Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        int count  = 0;

        for(int  i = 0; i  < N; i++){
            if(checkStr(br.readLine())){
                count++;
            }
        }
        br.close();
        System.out.println(count);
    }

    static boolean checkStr(String str){
        //boolean형 배열에 초기값을 주지 않으면 모두 false로 들어간다.

        boolean[] checkAlpha = new boolean[26]; //입력받은 값이 영어임으로 영어의 개수만큼 배열 생성
        int prev = -1; //이전 문자의 인덱스값을 저장하는 변수

        for(int i = 0; i < str.length(); i++){
            int now = str.charAt(i); //현재의 문자의 아스키 코드값을 저장

            if(prev != now){ //이전 문자와 i번째 문자가 같지 않다면
                if(checkAlpha[now-97] == false){ //false라는 것은 문자가 처음 나온 문자라는 것!
                    // 처음나왔음을 확인 했으니까 다음에 나오면 두번째로 나온 문자임으로 true로 바꿔준다.
                    checkAlpha[now-97] = true;
                    prev = now; //이전 문자와 비교 해야하므로 다음 반복문때에는 지금 문자가 이전문자가 되니까 확인

                }else{//아니라는 것은 이미 나온 적이 있는 경우 => 그룹 문자 X
                    return false; //더이상 반복문을 돌필요가 없기 때문에 반환값[false]을 준다.
                }
            }else{ //만약 이전 문자와 지금의 문자가 같다면 => 연속된 문자이므로 그냥 계속 반복문을 진행
                continue;
            }
        }
        return true; //여기까지 걸리지지 않았다는 것은 그룹문자라는 것! => true 반환
    }
}

결과


느낀점

  • 이 문제에서 끝까지 풀지 못했던 것은 문자열에서 하나의 문자들을 계속 뽑아서 문자를 비교하면서 풀려고 했기 때문이다.
  • 물론 지금 방식도 유사 그런 방식이긴 하지만, 항상 느끼는 건 단순하게 생각해도 되는 문제를 복잡하게 생각해서 풀지 못한다는 것이다.
  • 어쨌거나... 문제에 더 적응할 수 있도록... 앞으로 열심히... 해야...지
post-custom-banner

0개의 댓글