반응형
// Don't place your source in a package
import java.util.*;
import java.lang.*;
import java.io.*;
// Please name your class Main
class Main {
public static void main (String[] args) throws IOException {
// 몇 개를 입력받을 지 정해져 있는 것이 아니기에 대량데이터 입력에 유리한 BufferedReader 사용
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 몇개 받을 지 저장하는 변수
int count = Integer.parseInt(br.readLine());
// 단어들 저장할 문자열 배열
String[] strArr = new String[count];
// 문자열에 단어들 저장
for(int i=0; i<count; i++){
strArr[i] = br.readLine();
}
// 그룹 단어 갯수
int num = 0;
// 입력받은 단어의 수만큼 반복
for(int i = 0; i<count; i++){
// 단어를 문자별로 배열에 저장
char[] wordArr = strArr[i].toCharArray();
// 단어에 있는 문자 중복 체크용 리스트
ArrayList<Character> chrList = new ArrayList<Character>();
boolean result = true;
// 단어의 문자 길이만큼 반복
for(int j=0;j<wordArr.length;j++){
char word = wordArr[j];
int chrListSize = chrList.size();
// 중복 체크용 리스트에 해당 단어가 있는 지 없는 지
boolean inCheck = false;
// 중복 체크용 리스트의 길이만큼 반복
for(int k=0; k<chrListSize; k++){
// 중복 체크용 리스트에 해당 단어가 있으면
if(word == chrList.get(k)){
// inCheck true로
inCheck = true;
// 마지막 리스트의 단어와 같은거라면 연속된것
if(k==chrListSize-1){
result = true;
break;
// 그게 아니라면 이전에 나왔던 단어가 다시 나온 것
}else{
result = false;
break;
}
}
}
// 중복 체크용 리스트에 해당 단어가 있었을 경우에
if(inCheck == true){
// 그게 아니라면 이전에 나왔던 단어가 다시 나온 경우 그룹단어가 아님
if(result == false){
break;
}
// 중복 체크용 리스트에 해당 단어가 없었을 경우에
}else{
// 중복 체크용 리스트에 해당 단어 추가
chrList.add(word);
}
}
if(result == true){
num++;
}
}
System.out.println(num);
}
}
중복 체크용 리스트에서 알파벳의 수만큼 배열을 선언한 것이 아닌 리스트를 사용한 이유?
배열은 크기는 고정적이기 때문이다.
예를 들어 apple과 같은 단어가 들어온다면 실질적으로는 aple만 들어가므로 크기가 가변적인 리스트 선언하였음.
하지만, 입력값이 알파벳 소문자로 고정되어 있어 26개의 공간만 사용한다면 위의 방법 대신 알파벳 소문자 길이 크기 배열로 사용하는 것이 좋을것이라고 생각한다.
좋은 지적과 지식 공유는 언제나 환영합니다^^
반응형
'Algorithm' 카테고리의 다른 글
[이것이 코딩테스트다] 2. 그리디(Greedy) 알고리즘 (0) | 2021.12.13 |
---|---|
[BAEKJOON] 1439번 : 뒤집기 (0) | 2021.12.12 |
[BAEKJOON] 2292번 : 벌집 (0) | 2021.12.09 |
[BAEKJOON] 1712번 : 손익분기점 (0) | 2021.12.06 |
[이것이 코딩테스트다] 1. 복잡도(Complexity) (0) | 2021.12.05 |