[백준알고리즘] 문자열 문제 1316번 - 그룹 단어 체커
N개의 단어들을 입력받고, 그중 몇개의 단어가 그룹 단어인지를 출력하는 문제.
그룹 단어란 이름처럼 단어에 알파벳들이 그룹처럼 묶여 있는 형태이며
앞에서 등장했던 알파벳이 뒤에 동떨어져서 등장하면 그룹단어가 아님.
예를들어 aaacccbbs는 그룹단어가 맞을것이고, acbcff는 c가 묶여있지 않으므로 그룹 단어가 아니다.
어떻게 풀지 예제들을 보며 대략 상상해보았다.
흠
char형 배열을 하나 생성하고, 입력받은 단어의 문자를 하나하나 뜯어보며
최초의 문자(char 배열에 없는 알파벳)라면 배열에 추가하고
아니라면(이미 등장해서 추가한적 있는 알파벳이라면) 바로 앞의 문자와 같은지 다른지 추가적인 확인을 해서
다르면 flag = false로 하고, 같다면 통과해서
입력받은 문자를 끝까지 다 확인을 한 뒤에 flag값이 여전히 true일때 그룹 단어로 카운트하면 되지 않을까 싶다.
배열에 어떠한 문자가 원소로 들어 있는지 없는지를 확인하는 함수가 필요하겠다.
-> contains 함수 사용
아무튼 이렇게 풀면 될 것 같은데 막상 코드를 짜보면 또 어떨지 모르겠다..해보자!
package Level6;
import java.io.*;
public class GroupWord {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int wordCount = Integer.parseInt(br.readLine()); //단어 개수 입력받기
String[] words = new String[wordCount]; //입력받을 단어 개수 크기의 배열 생성
String alp;
boolean flag;
int k = 0;
int count = 0;
for (int i = 0; i < wordCount; i++) {
words[i] = br.readLine();
alp = ""; //바깥의 for문을 돌떄마다 비워줘야함!!
flag = true; //이것도 바깥for문 한번씩 돌떄마다 true로 해줘야함!!
for (int j = 0; j < words[i].length(); j++) { //각 단어의 길이만큼 끝까지 확인
if (alp.contains(Character.toString(words[i].charAt(j)))) { //alp에 해당 문자가 있는지 확인, 있다면
//여기서 뭔가 잘못한듯..
if (words[i].charAt(j) != words[i].charAt(j - 1)) { //바로 앞의 문자와 해당 문자가 다르다면!
flag = false;
}
}else{ //배열에 해당 문자가 없다면
alp += words[i].charAt(j); //해당 문자 alp배열에 저장
k++;
}
if (!flag) { //엥 ==말고 =로 첨에 비교문 잘못써놨었는데 그냥 컴파일이 되네
break; //더 볼것도없이 안쪽 for문을 빠져나가도 될듯
}
}
if (flag) { //단어 하나를 다 체크했는데 끝까지 flag가 true로 남아있었다면
count++;
}
}
bw.write(Integer.toString(count)); //다시 String으로 바꾸는거 잊지말기
bw.flush(); //비우기
bw.close(); //닫기
}
}
이리하여 제출하고 정답을 인정받았다.
원래 생각했던 방식과 크게 다른점은 없지만
단어의 문자들을 하나하나 char 배열에 원소로 추가하는 대신 String 변수를 생성해서 +=로 하나씩 추가되도록 했다.
왜냐하면 배열에 넣으려면 인덱스를 지정해줘야 하기도 하고 여러모로 걍 String이 더 편하니까..
꼭 배열을 이용할 필요는 없었다
특히 contains라는, 문자열에 특정 문자가 포함되어 있는지 없는지를 확인해주는 String의 함수를 사용하기 위함도 있다.
주석을 달아두기도 했고 크게 어려운 문제는 아니였어서 내 코드에 대한 설명은 길게 안해도 될것 같다..!
대신 다른 사람의 코드를 보면서 비교해봐야겠다. 다들 어떻게 풀었는지 궁금..
이건 내일~! 비교해보면서 얻어간점들을 덧붙여 적기로 한다.
그나저나 문자열문제는 이제야 끝났다..이제 기본 수학 파트로 넘어가게 되었다. 아좌좌