백준 - 그룹 단어 체커[java]

스브코·2021년 11월 12일
0

문제 출처: https://www.acmicpc.net/problem/1316

문제 설명

그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때문에 그룹 단어이지만, aabbbccb는 b가 떨어져서 나타나기 때문에 그룹 단어가 아니다.

입력

5
ab
aa
aca
ba
bb

출력

4

그룹단어: ab, aa, ba, bb

문제 풀이

import java.io.*;

public class Main {
    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 a = Integer.parseInt(br.readLine());
        int num = 0;
        for (int i = 0; i < a; i++) {
            String s = br.readLine();
            boolean[] alphabets = new boolean[26];
            boolean count = true;
            char c = '-';
            for (int j = 0; j < s.length(); j++) {
                if (c == '-') {
                    c = s.charAt(j);
                    alphabets[c - 'a'] = true;
                } else {
                    if (c != s.charAt(j)) {
                        if (!alphabets[s.charAt(j) - 'a']) {
                            c = s.charAt(j);
                            alphabets[c - 'a'] = true;
                        } else {
                            count = false;
                            break;
                        }
                    }
                }
            }
            if (count)
                num++;
        }
        bw.write(num + "");
        br.close();
        bw.flush();
        bw.close();
    }
}

boolean 배열을 만들어 놓고 처음 나타나면 true로 바꾼후

이전 알파벳은 로컬 변수로 저장 해놓으면서 확인해 나갔다.

다른 풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		int cnt = N;
		ArrayList<Character> arr = new ArrayList<Character>();
		for (int i = 0; i < N; i++) {
			String s = br.readLine();
			arr.clear();
			for (int j = 1; j <= s.length(); j++) {
				if (arr.contains(s.charAt(j-1))) {
					cnt--;
					break;
				}
				else {
					if (j == s.length()) {
						arr.add(s.charAt(j-1));
					}
					else {
						if (s.charAt(j-1) != s.charAt(j)) {
							arr.add(s.charAt(j-1));
						}
						
					}
				}
			}
		}
		System.out.println(cnt);
	} // 메인 끝
}

뭐 사실 똑같은 방식이다. 이 풀이는 ArrayList(O(N))를 사용했다. 하지만 배열을 사용한 내 방식(O(1))이 조금 더 빠르지 않을까 싶다.

profile
익히는 속도가 까먹는 속도를 추월하는 그날까지...

0개의 댓글