문제 개념 정리
단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우!
내가 작성한 코드
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++){
}
}
}
위의 코드까지 어찌저찌 생각했는데 이 다음부터 어떻게해야할지 생각이 안나서 이 이후부터는 다른 분들의 코드를 참고하였다.
그래서 공부할겸 참고한 것을 토대로 이 문제를 풀어 정리해보고자 한다.
코드에 관한 설명은 주석으로 모두 넣어놨지만, 나중에 봤을 때 이해하기 쉽게 그림으로 정리하였다.
그에 관한 설명은 아래와 같다.
문제 해석
해답 코드
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 반환
}
}
결과
느낀점