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);
}
}
- 각각의 알파벳이 몇 번 등장하는지 카운팅
- 알파벳을 키로 카운팅을 값으로 가지는 맵에 저장
- 맵의 키의 개수만큼 반복문을 시작
- 문자열에 해당 알파벳이 등장하는 처음과 마지막 인덱스를 계산
- (마지막 인덱스 - 처음 인덱스) 가 알파벳의 카운팅과 일치하지 않는지 확인
- 일치하지 않으면 알파벳이 끊어져서 존재한다는 것과 같기 때문에 그룹 단어가 아니므로 반복문 탈출
- 일치하는 경우에는 해당 알파벳은 그룹 단어의 조건을 충족하니 통과
- 모든 알파벳이 통과되면 그룹 단어이기 때문에 카운트 증가
- 위의 방법을 입력의 수만큼 반복하며 그룹 단어 카운팅
- 최종 결과를 출력
새롭게 알게 된 내용
- 종류별로 무언가를 계산하고 저장하고 싶을 때는 Map 자료구조를 사용하면 편리하다.
- Collctors의 groupingBy 메서드를 사용하여 그룹별로 연산을 수행할 수 있다.
- Function.identity 메서드를 사용해 각 요소를 그대로 그룹화 할 수 있다.
- 해당 문제에서는 알파벳 별로 그대로 그룹화 할 때 사용하였다.
- Collctors의 counting 메서드를 사용하여 각 그룹의 요소 개수를 카운트 할 수 있다.
- 해당 문제에서는 각각의 알파벳의 수를 카운팅 했다.
'Java > Algorithms' 카테고리의 다른 글
[백준] 2577번 : 숫자의 개수 (0) | 2023.09.28 |
---|---|
[배열] 두 수의 합이 100인 경우 (0) | 2023.09.27 |
[백준] 2292번 : 벌집 (0) | 2023.07.30 |
[백준] 2720번 : 세탁소 사장 동혁 (0) | 2023.07.30 |
[백준] 2903번 : 중앙 이동 알고리즘 (0) | 2023.07.30 |