본문 바로가기
프로그래밍/백준 알고리즘 코드

백준 1316번 자바 JAVA 그룹 단어 체커 [문자열]

by 졸린이 2020. 10. 14.
반응형

블라 블라 블라~~

처음은 테스트케이스를 입력한다. 2를 입력하면 문자열을 두 번 입력하는 것. 한 줄에 하나씩

그것을 한 단어로 본다. 이 단어의 문자가 연속되어서 나타나면 그룹단어로 본다.

즉 aaa도 그룹단어 aabb도 ab도 그룹단어지만 aba 이것은 그룹 단어가 아니다.

같은 문자가 전부 붙어 있지 않고 사이에 다른 문자가 끼게 되면 그룹 단어가 아니게 된다.

코드는 아래에 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.util.Scanner;
 
//baekjoon_1316_그룹 단어 체커
public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int test = sc.nextInt();
        int result=0;
        for(int i=0; i<test; i++) {
            String str = sc.next();
            if(wordcheck(str))
                result++;
        }
        
        System.out.println(result);
    }
    public static boolean wordcheck(String word) {
        boolean check[] = new boolean[26];
        int len = word.length();
        
        for(int i=0; i<len; i++) {
            char tmp = word.charAt(i);
            if(check[tmp-'a']) //이미 체크한 알파벳
                return false;
            else {
                if(i<len-1 && tmp != word.charAt(i+1))
                    check[tmp-'a'= true;
            }
        }
        return true;
    }
}
cs

line 7 : 테스트케이스 몇개의 문자열을 입력할 지 입력받는다.

line 8 : result 변수는 출력할 결과값이다.

line 9 : 입력받은 test 값만큼 반복해서 문자열을 입력하고 검사한다.

line 10 : 문자열 입력

line 11 : 입력받은 문자열을 검사하고 그것이 참이면(그룹 단어이면) 12행에서 result를 증가시킨다.

 

line 17 : return 타입이 bool값인 함수 wordcheck()함수를 정의한다. 문자열을 매개변수로 받는다.

line 18 : 알파벳은 26개 이므로 bool로 된 배열을 26크기로 잡는다.

line 19 : 문자열의 요소 전부를 검사하기 위해 문자열의 길이를 len에 저장한다.

line 21 : len길이만큼 반복 검사

line 22 : charAt(i)로 문자열의 문자를 앞에서 부터 하나씩 꺼내서 tmp에 저장한다.

line 23 : check[tmp - 'a']이 배열 위치는 알파벳의 포지션을 뜻한다. tmp가 알파벳 a 라면 -'a'를 하여 check[0]에 접근한다. tmp가 b라면 check[1]이 true인지 검사한다. 만약 여기서 true값을 만나면 false를 리턴한다.

 

line 26 : 앞에 if문에 걸치치 않고 여기로 온 것은 체크를 안 한 문자다.

if(i<len-1 && tmp != word.charAt(i+1)

아주 간단한 조건문이다. && 이 앤드연산자 양 옆이 만족해야 참이 되어 if문 안으로 들어간다.

오른쪽먼저 보자면 word.charAt(i+1) 위에 if 문에서 검사한 문자(tmp)와 다르면 연속된 문자와 다른 문자가 온 것을 확인하고 check[tmp - 'a'] 자리를 true값으로 바꾼다.

다음에 또 이 문자를 검사하면 즉 abba 이렇게 다시 나오게 되면 그룹 문자가 아니게 된 걸로 확인되어 23행에서 false로 리턴한다.

26행에 if문에 왼쪽에서 (i<len-1) 은 word에서 charAt()로 접근할 수 있는 index는 0~len-1이다.

즉 charAt(len-1)까지 접근 가능하지만 i를 그보다 1아래까지만 접근하게 하는 것이다.

i를 len-1까지 가게 하면 우측에서 charAt(i+1)에서 charAt(len)이 되어 배열 인덱스 뭐시기 오류가 뜨게 된다.

 

뭐 아무튼... 그렇게 for문 돌고 true를 리턴하면 result를 증가시킨다.

 

와 이게 진짜 어려운 내용도 아닌데 이게 참 아아주 쉽게 표현하려 작성하단다고 생각하고 자세하고 쉽게 이해할 수 있게 한건데도 오히려 복잡하고 어려워 보인다.

어후... 몰라 어려워.

반응형

댓글