profile image

L o a d i n g . . .

https://www.acmicpc.net/problem/10807


 

import java.util.Scanner;

public class Main {
    static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        int count = 0;
        int N = sc.nextInt();

        for (int loop = 0; loop < N; loop++) {
            if (groupWordCheck() == true) {
                count++;
            }
        }
        System.out.print(count);
    }

    public static boolean groupWordCheck() {
        boolean[] groupWordCheck = new boolean[26];
        int prevWord = 0;
        String userStr = sc.next();

        for (int loop = 0; loop < userStr.length(); loop++) {
            int nowWord = userStr.charAt(loop);

            if (prevWord != nowWord) {
                if (groupWordCheck[nowWord - 'a'] == false) {
                    groupWordCheck[nowWord - 'a'] = true;
                    prevWord = nowWord;
                } else {
                    return false;
                }
            } else {
                continue;
            }
        }
        return true;
    }
}

그룹 단어: 단어를 이루는 각 문자들이 연속해서 나타나는 단어

단어 안에 불연속적으로 나타나는 문자가 하나라도 있다면 그룹 단어가 아닙니다.

  • ccaabb, aaeef, ahcfs: ccaabb는 c, a, b가 연속적으로 나타나고, ahcfs는 단어가 한 번씩만 연속적으로 나타남
  • cabcab, ararar, sjsfe: cabcab에서 c는 맨 처음 등장한 후 4번째에 다시 나타나고, a와 b도 불연속적으로 나타남

 

public class Main {
    static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        int count = 0;
        int N = sc.nextInt();

        for (int loop = 0; loop < N; loop++) {
            if (groupWordCheck() == true) {
                count++;
            }
        }
        System.out.print(count);
    }

스캐너를 이용하여 사용자로부터 입력을 받아야 하는데, static으로 선언합니다.

static은 정적 변수라서 프로그램이 실행부터 종료될 때까지 살아있는 변수이고, 계속 메모리에 상주하므로 어디서 참조를 하든 공통 된 필드를 가리키게 됩니다.

 

단어의 개수 N과 그룹 단어의 개수를 확인할 count를 선언합니다.

 

사용자가 입력한 단어의 개수만큼 그룹 단어인지 확인합니다.

만약 그룹 단어를 확인하는 메소드인 groupWordCheck()의 return 값이 true이면 입력한 단어가 그룹 단어라는 뜻이므로 그룹 단어의 개수를 1 추가합니다.

for문이 끝나면 그룹 단어의 개수를 출력하면 됩니다.

 

    public static boolean groupWordCheck() {
        boolean[] groupWordCheck = new boolean[26];
        int prevWord = 0;
        String userStr = sc.next();

        for (int loop = 0; loop < userStr.length(); loop++) {
            int nowWord = userStr.charAt(loop);

            if (prevWord != nowWord) {
                if (groupWordCheck[nowWord - 'a'] == false) {
                    groupWordCheck[nowWord - 'a'] = true;
                    prevWord = nowWord;
                } else {
                    return false;
                }
            } else {
                continue;
            }
        }
        return true;
    }

그룹 단어를 확인하기 위한 메소드 groupWordCheck()를 static boolean 으로 선언합니다.

static 메소드로 선언한 이유는 객체 인스턴스를 생성하지 않고 접근하기 위함입니다.

static으로 선언되면, main 메소드에서도 쉽게 호출이 가능합니다.

static 메소드가 아니었다면 Main 클래스의 객체 인스턴스를 먼저 생성해야만 합니다.

예) Main main = new Main()

 

알파벳의 개수는 26개이므로 길이가 26인 배열을 선언합니다.

앞의 문자를 비교하기 위해 prevWord, 사용자가 입력한 문자열을 받기 위한 userStr을 선언합니다.

 

단어의 비교를 위해 반복문을 사용하게 되는데, 횟수는 사용자가 입력한 문장 길이 만큼 입니다.

nowWord 변수는 입력한 문자열에서 loop가 0이면 첫 번째 글자를 한 글자로 만들어서 받습니다.

ahcfs를 입력했다면 a를 받게 됩니다.

 

if (prevWord != nowWord) {
	if (groupWordCheck[nowWord - 'a'] == false) {
		groupWordCheck[nowWord - 'a'] = true;
		prevWord = nowWord;
	} else {
		return false;
		}
	} else {
	continue;
	}
  }
return true;

앞에 있는 문자 (prevWord)와 현재 문자(nowWord)가 같지 않다면 중복 검사를 해야 합니다.

 

boolean 배열의 기본 초기화 값은 false이며, 현재 문자가 처음 나오는 경우면 그룹 단어입니다.

여기서 - 'a' 를 하는 이유는 charAt()은 해당 문자의 아스키 코드 값을 반환하는데 a의 경우 97을 갖고 있습니다.

nowWord = a 라면 97이라는 값을 갖고 있고 0번째 인덱스에 위치시키기 위해서 97을 빼줘야 하므로 그렇습니다.

만약 현재 단어의 인덱스 위치에서 false 라면 중복 되지 않았다는 뜻이므로 true로 바꿔주면서 앞의 단어를 현재 단어로 바꿉니다.

 

만약 현재 단어의 인덱스 위치에서 true 라면 이미 나온 적이 있다는 것이므로 (불연속적이라는 뜻) 그룹 단어가 아닙니다.

따라서 false를 반환하게 되어 main에서 count 값이 올라가지 않습니다.

연속된 문자라면 계속 이어나가게 되고, 끝까지 false를 반환하지 않았다면 그룹 단어이므로 true를 반환하게 되어 main 에서 count가 1 올라가게 됩니다.


참고

1. https://st-lab.tistory.com/69

2. https://beginnerdeveloper-lit.tistory.com/104

복사했습니다!