렝무식

[백준 1316번] 그룹 단어 체커 (JAVA) 본문

Algorithm/Baekjoon

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

렝9 2023. 1. 12. 18:13

BOJ - [1316] 그룹 단어 체커


image


🖍 각 문자가 연속해서 나타나는 단어인 '그룹 단어'의 개수를 출력하는 문제
(link) 1316 그룹 단어 체커


[풀이 과정]

그룹단어가 무엇인지는 문제에 잘 나와있으니 설명은 생략하겠다.

 

이 문제는 이전에 풀었던 1157번 문제인 단어 공부 문제의 풀이를 응용할 수 있다.
단어 공부 문제를 풀 때 알파벳을 아스키 코드 값으로 변환하여 배열에 넣어주는 방식을 사용했고, 여기서도 그 방식을 사용할 것이다.
(여기서는 입력 형태가 소문자로 주어지기 때문에 소문자 a의 아스키 코드 값인 97의 뺄셈 연산을 이용한다)

그룹 단어가 몇 개인지 체크하기 위해 그룹 단어가 '아닌' 단어의 개수를 저장할 정수형 변수 count를 선언한다. (연산의 편의를 위하여 그룹 단어가 아닌 단어의 개수를 저장하였다)
또한 연속되고 있는 알파벳인지, 아니면 이전에 나왔던 알파벳인지 구분하기 위해 이전 알파벳(정확히는 아스키 코드 값)을 저장할 정수형 변수 prev를 선언한다.

 

우선 단어의 개수 N이 주어지므로 N만큼 반복문을 돌린다. 처음에 알파벳 저장 배열 array를 초기화 하고 문자열 변수에 단어를 입력받는다.

다음으로 for문을 통해 다음 반복문에서 알파벳을 처리해줄 건데, 총 세가지 경우를 조건문으로 나누어준다.

  1. 처음 등장한 알파벳일 경우 : 배열에 카운팅 해준 후 알파벳을 prev에 저장.
  2. 직전에 만난 알파벳일 경우 : 그룹 단어로 처리하기 때문에 continue.
  3. 직전에 만나지 않았으며, 이전에 나온 알파벳일 경우 : 이전에 나온 알파벳인데 이후에 떨어진 위치에서 다시 등장한 경우이므로 그룹 단어가 아님. 따라서 count를 올려주며, 또한 이미 그룹 단어가 아닌 것이 되므로 반복문 종료.

N만큼 반복을 마친 후에, 전체 단어 개수인 N에서 그룹 단어가 아닌 단어의 개수를 빼주면 그룹 단어의 개수가 나온다.


[Pseudocode]

1. 단어의 개수를 입력받을 변수 N 선언
2. 그룹 단어가 아닌 단어 개수를 저장할 변수 count 선언
3. 알파벳을 저장할 배열 array 선언
4. 이전 알파벳을 저장할 변수 prev 선언
5. for i=0 부터 N까지 반복
    6. array 초기화
    7. String s에 단어 입력 받기
    8. for j=0 부터 s.length까지 반복
        9. if(array[s.charAt(j)-97] == 0)
            10. array[s.charAt(j)-97] +=  1;
            11. prev  =  s.charAt(j)-97;
        12. else  if(prev  ==  s.charAt(j)-97)
            13. continue
        14. else  if(array[s.charAt(j)-97] !=  0)
            15. count++
            16. break
17. (N-count) 출력

[Code]

import java.util.*;

/**
 * 백준 1316번
 * 그룹 단어 체커
 * 분류: 구현, 문자열
 */
public class Problem5 {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int N = input.nextInt(); // 단어의 개수
        int count = 0; // 그룹 단어가 아닌 단어 개수
        int[] array; // 알파벳 저장 배열
        int prev = 0; // 이전 알파벳 저장

        for(int i=0 ; i<N ; i++) {
            array = new int[26];
            String s = input.next();
            for(int j=0 ; j<s.length() ; j++) {
                if(array[s.charAt(j)-97] == 0) { // 1. 처음 만나는 알파벳인 경우 : 배열 카운팅 후 알파벳 저장
                    array[s.charAt(j)-97] += 1;
                    prev = s.charAt(j)-97;
                }   
                else if(prev == s.charAt(j)-97) { // 2. 직전에 만난 알파벳인 경우 : 그룹 단어로 처리
                    continue;
                }               
                else if(array[s.charAt(j)-97] != 0) { // 3. 직전이 아닌 이전에 만난 알파벳인 경우 : 그룹 단어 아님, 변수 카운팅
                    count++;
                    break; // 이미 그룹 단어가 아님이 판명되었으므로 반복문 종료
                }
            }
        }
        System.out.println(N-count); // 전체 단어 개수 - 그룹 단어가 아닌 단어 개수 = 그룹 단어 개수
        input.close();
    }
}

[Result]

image


(2021.07.18 풀이분)

🥰

Comments