728x90

n개의 문자열 입력에 대한 그룹 단어 체크 프로그램 작성하기

(각각의 문자열은 소문자로만 구성되고 중복되지 않으며 최대 길이는 100)

 

그룹 단어의 조건

  • 각각의 알파벳은 연속되게 하나 이상 존재할 수 있다.
  • 연속되지 않고 끊어져서 동일한 알파벳이 존재할 수는 없다.
  • "aabbaa" 같은 경우는 그룹 단어가 아니다.
  • "aabbcc" 같은 경우는 그룹 단어가 맞다.

나의 풀이

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

        int n = s.nextInt();
        int count = 0;

        for (int i = 0; i < n; i++) {
            String str = s.next();
            String[] arr = str.split("");

            Map<String, Long> abc = Arrays.stream(arr)
                    .collect(Collectors.groupingBy(Function.identity(),Collectors.counting()));

            Set<String> sets = abc.keySet();


            int size = sets.size();
            for(String set : sets) {
                int start = str.indexOf(set);
                int end = str.lastIndexOf(set) + 1;
                
                if (end - start != abc.get(set)) {
                    break;
                }
                
                size--;
                
                if(size == 0) {
                    count++;
                }
            }
        }

        System.out.println(count);
    }
}
  1. 각각의 알파벳이 몇 번 등장하는지 카운팅
  2. 알파벳을 키로 카운팅을 값으로 가지는 맵에 저장
  3. 맵의 키의 개수만큼 반복문을 시작
  4. 문자열에 해당 알파벳이 등장하는 처음과 마지막 인덱스를 계산
  5. (마지막 인덱스 - 처음 인덱스) 가 알파벳의 카운팅과 일치하지 않는지 확인
  6. 일치하지 않으면 알파벳이 끊어져서 존재한다는 것과 같기 때문에 그룹 단어가 아니므로 반복문 탈출
  7. 일치하는 경우에는 해당 알파벳은 그룹 단어의 조건을 충족하니 통과
  8. 모든 알파벳이 통과되면 그룹 단어이기 때문에 카운트 증가
  9. 위의 방법을 입력의 수만큼 반복하며 그룹 단어 카운팅
  10. 최종 결과를 출력

새롭게 알게 된 내용

  • 종류별로 무언가를 계산하고 저장하고 싶을 때는 Map 자료구조를 사용하면 편리하다.
  • Collctors의 groupingBy 메서드를 사용하여 그룹별로 연산을 수행할 수 있다.
  • Function.identity 메서드를 사용해 각 요소를 그대로 그룹화 할 수 있다.
  • 해당 문제에서는 알파벳 별로 그대로 그룹화 할 때 사용하였다.
  • Collctors의 counting 메서드를 사용하여 각 그룹의 요소 개수를 카운트 할 수 있다.
  • 해당 문제에서는 각각의 알파벳의 수를 카운팅 했다.

+ Recent posts