문제

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

걸린 시간

00 : 21 : 19

풀이

Python3

def overlap(history, cnt):
    for i in history:
        if cnt == i:
            return True 
    return False 

if __name__ == "__main__":
    # 단어의 개수
    N = int(input())    

    # 단어 저장 리스트
    word = []

    # 출현한 문자 저장 리스트
    history = []

    # 단어 입력
    for i in range(0, N):
        word.append(input())

    # 결과 단어 개수        
    result = 0    

    # 그룹 단어 체크     
    for i in word:
        last = ''
        history.clear()
        flag = True
        for j in i:
            cnt = j
            # 이전에 단어와 같은 단어인가 비교
            if last != cnt:
                # 중복되는지 체크
                if overlap(history, cnt):
                    flag = False
                else:
                    history.append(cnt)
            last = cnt
        if flag == True:
            result += 1        

    print(result)

C++

#include <stdio.h>
#include <iostream>
#include <string>
#include <string.h> // memset
using namespace std;

int alphabet[26];

bool groupWord(string word){
    char s = word[0];
    alphabet[(int)s%97] = 1;
    for(int i = 1; i < word.size(); i++){
        if(s != word[i]){
            s = word[i];
            // 이미 등장했던 알파벳이면
            if(alphabet[(int)s%97])
                return false;
            alphabet[(int)s%97] = 1;
        }
    }
    return true;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    int N, count = 0;
    cin >> N;
    for(int i = 0; i < N; i++){
        memset(alphabet, 0, sizeof(alphabet));
        string word;
        cin >> word;
        if(groupWord(word))        
            count++;
    }
    cout << count << "\n";
    return 0;
}

등장한 알파벳을 배열에 저장해두고 새로운 값이 나올 때 마다 모두 꺼내어 비교했던 Python 풀이와는 다르게 0, 1로 등장 여부를 체크할 수 있는 26크기의 배열을 두어 그룹 단어인지를 체크한다.

'Baekjoon' 카테고리의 다른 글

Baekjoon 7568번 덩치  (0) 2020.07.22
Baekjoon 2941번 크로아티아 알파벳  (0) 2020.07.21
Baekjoon 4949번 균형잡힌 세상  (0) 2020.07.21
Baekjoon 11866번 요세푸스 문제 0  (0) 2020.07.21
Baekjoon 1966번 프린터 큐  (0) 2020.07.20

댓글