백준 1316번 자바
https://www.acmicpc.net/problem/1316
문제 내용은 아래 더보기를 누르면 나온다.
알고리즘
단어에서 각 문자가 연속해서 나타나는 경우 그룹 단어라고 한다.
(e.g. 그룹 단어 : ccazzzzbb , kin, abc , 그룹 단어 아닌 것 : abca, aabbbccb. )
앞에 나왔던 문자가 뒤에도 나오면 그룹 단어가 아닌 것이다.
알파벳은 소문자로만 되어있고, 중복되지 않으며, 길이는 최대 100이다.
그룹단어의 개수를 출력하면 된다.
아래처럼 번호를 매기면서 설계하다보니 그룹 단어가 맞는지에 대한 boolean 함수를 만드는 것이 나아보인다.
1. 단어의 개수 N을 입력받는다.
2. 그룹 단어를 셀 count를 만든다.
3. N만큼 반복한다.
3-1. 그룹 단어가 맞는지에 대한 함수를 실행한다.
3-2. 맞으면 count++, 아니면 넘어간다.
4. count를 출력한다.
그룹 단어가 맞는지 확인하는 함수
1. 알파벳 길이 26만큼의 boolean 배열, 이전 문자를 기억할 prev을 만든다.
2. 단어를 입력받는다.
3. 단어의 길이만큼 반복한다.
3-1. 단어.charAt(i)로 꺼낸 문자가 prev와 다른가?
-> 이 때 단어의 문자를 꺼내는데 이 방법말고도 단어를 입력받을때 getBytes()로 byte[]로 받아서 하나씩 비교하는 방법 등이 있음.
3-2. 다르다면 그 문자에 해당하는 배열위치가 false인가?
(1) false라면 처음 나온 문자이므로 true로 바꾸고, prev에 현재 문자를 넣는다.
(2) true라면 연속적인 문자가 아니고 그 전에 나왔던 문자이므로 그룹 단어가 아니게 되므로 false를 반환하면서 함수 종료.
3-3. prev와 같다면 다음으로 넘어간다.
4. 반복이 무사히 종료됐다면 그룹 단어이므로 true를 반환하면서 함수 종료.
풀이1
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class No_1316 {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws IOException {
int N = Integer.parseInt(br.readLine());
int count = 0;
for (int i = 0; i < N; i++) {
if (isGroupString()) count++;
}
System.out.println(count);
}
public static boolean isGroupString() throws IOException {
boolean[] alphabetArr = new boolean[26];
int previousChar = 0;
String str = br.readLine();
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
if (ch != previousChar) {
if (!alphabetArr[ch - 'a']) {
alphabetArr[ch - 'a'] = true;
previousChar = ch;
} else {
return false;
}
} else {
continue;
}
}
return true;
}
}
알고리즘 풀이대로 풀었다.
그룹 단어인지 확인하는 boolean형 isGroupString() 함수를 만들었다.
알파벳 길이만큼의 alphabetArr 배열을 만들었고, 이전 문자인 previousChar, 단어를 받을 str, 현재 문자 ch를 만들었다.
그렇게 알고리즘대로의 조건을 걸어서 비교했다.
처음에는 이전문자와 같은지 아닌지 비교를 했다.
그 후 배열에서 전에 만났던 문자인지 아닌지 비교를 하는 함수이다.
public static boolean isGroupString() throws IOException {
boolean[] alphabetArr = new boolean[26];
int previousChar = 0;
String str = br.readLine();
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
if (ch != previousChar && !alphabetArr[ch - 'a']) {
alphabetArr[ch - 'a'] = true;
previousChar = ch;
} else if (ch != previousChar && alphabetArr[ch - 'a']) {
return false;
}
}
return true;
}
if문이 많아서 헷갈린다면 이렇게 합쳐서 만들 수도 있겠다.
ch != previousChar 는 현재 문자와 이전 문자가 같은지 비교하는 것이고,
alphabetArr[ch - 'a'] 은 현재 문자의 위치에 해당하는 배열값이 false인지 true인지 확인하는 것이다.
그래서 첫번째 if문 조건은 "현재 문자와 이전 문자가 같지 않고, 그 문자위치에 해당하는 배열값이 false" 라는 조건이다.
두번째 조건은 "현재 문자와 이전 문자가 같지 않고, 그 문자위치에 해당하는 배열값이 true" 라는 조건이다.
'코딩테스트 > Java - 백준' 카테고리의 다른 글
[백준] 2292번 - Java(자바) (0) | 2022.03.10 |
---|---|
[백준] 1712번 - Java(자바) (0) | 2022.03.07 |
[백준] 2941번 - Java(자바) (0) | 2022.03.02 |
[백준] 5622번 - Java(자바) (0) | 2022.02.27 |
[백준] 2908번 - Java(자바) (0) | 2022.02.23 |