반응형
1. 문제 추상화
1차 추상화
그룹단어란 연속된 문자로 이루어진 단어를 의미한다. 만약 연속되었던 문자가 한번 더 연속되면 그룹단어가 아니다.
2차 추상화
입력받은 영단어에서 문자가 중복되어 연속되지 않은 그룹단어의 개수를 구하시오.
2. 알고리즘
이 문제는 간단히 말해서 중복체크 문제이다.
첫 번째 방법
HashSet 이용하기
1. 입력받은 문자열을 한 문자씩 체크한다. (for문)
2. 문자가 변하는 횟수를 센다. (countChar)
3. 문자가 변할 때 마다 HashSet 객체에 문자를 add한다.
4. HashSet은 중복된 값은 add하지 않으므로, 만약 문자가 변하는 횟수와 HashSet의 size()가 다르면 그룹단어가 아니다.
두 번째 방법
boolean 배열 만들기
1. 알파벳 개수 크기의 boolean 배열 생성
2. 연속된 알파벳 문자와 대응되는 인덱스 위치에 true 저장
3. 이미 값이 true라면 중복이므로 그룹단어가 아니다.
3. 풀이
첫 번째 방법 (HashSet 이용하기)
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashSet;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int testcase = Integer.parseInt(br.readLine());
int nGroupWord = 0;
for(int i=0; i<testcase;i++) {
String str = br.readLine();
char previousChar =0; // 이전 문자
int countChar = 0; // 문자가 변하는 횟수 카운트
HashSet<Character> usedChar = new HashSet<Character>(); // HashSet
for(int j=0; j<str.length();j++) {
// 만약 이전 문자와 다르다면
if(previousChar != str.charAt(j)) {
previousChar = str.charAt(j);
countChar++; //변하는 횟수 카운트
usedChar.add(str.charAt(j)); // HashSet에 저장
}
}
if(countChar == usedChar.size()) nGroupWord++; // 변하는 횟수와 HashSet의 size()가 일치하면 그룹단어이다.
}
bw.write(nGroupWord+"");
bw.flush();
bw.close();
br.close();
}
}
두 번째 방법 ( boolean 배열 이용하기 )
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int testcase = Integer.parseInt(br.readLine());
int nGroup = 0;
for(int i=0;i<testcase;i++) {
String str = br.readLine();
boolean[] alphabet = new boolean['z'-'a'+1]; // 알파벳 개수 크기의 boolean 배열
char previousChar = 0; // 이전 문자
for(int j=0; j<str.length();j++) {
// 이전 문자와 현재 문자가 다르다면
if(previousChar != str.charAt(j)) {
//checkAlphabet 메소드 호출
if(checkAlphabet(str.charAt(j)-'a',alphabet)) {
// true이면 연속이 중복되므로 그룹단어가 아니다.
break;
}else { //false이면 대응되는 인덱스의 값을 true로 바꾼다.
alphabet[str.charAt(j)-'a'] = true;
}
previousChar = str.charAt(j);
}
// 반복이 다 돌면 그룹단어이다.
if(j==str.length()-1) nGroup++;
}
}
bw.write(nGroup+"");
bw.flush();
bw.close();
br.close();
}
// 대응되는 인덱스의 값이 true인지 false인지 반환
public static boolean checkAlphabet(int value, boolean[] alphabet) {
if(alphabet[value] == true) return true;
else return false;
}
}
반응형
'문제풀이' 카테고리의 다른 글
[JAVA] 백준 1193번 분수찾기 : 부등식과 반복문 2 (0) | 2021.07.15 |
---|---|
[JAVA] 백준 2292번 벌집 : 부등식과 반복문 1 (0) | 2021.07.15 |
[JAVA] 백준 5622번 다이얼 : Switch문 (0) | 2021.07.12 |
[JAVA] 백준 1157번 단어 공부 : 이해하기 쉬운 코드란? (0) | 2021.07.11 |
[JAVA] 백준 10809번 알파벳 찾기 : 아스키코드 (0) | 2021.07.11 |