minimimi

[1316] 그룹 단어 체커 본문

프로그래밍 공부/알고리즘

[1316] 그룹 단어 체커

99mini 2023. 4. 1. 11:41
반응형

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

 

1316번: 그룹 단어 체커

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

www.acmicpc.net


문제요약

문자열에서 문자가 연속하는 문자로만 이루어져있는 지 판단

풀이

ord() 와 chr() 함수의 사용

ord()는 문자를 아스키코드 정수형으로 변환해주는 파이썬 내장 함수이다.
이를 이용해서 char 형의 알파벳 혹은 숫자를 확인 가능하다.

ord('A')-ord('A') # 0
ord('B')-ord('A') # 1
ord('Z')-ord('A') # 25

ord('a')-ord('a') # 0
ord('b')-ord('a') # 1
ord('z')-ord('a') # 25


ord('0')-ord('0') # 0
ord('2')-ord('0') # 2

위 코드와 같이 알고 싶은 문자를 ord()로 아스키코드 정수형으로 변환 한 후 원하는 문자의 첫번째 값으로 빼주면 된다. 알파벳 대문자라면 'A'를 알파벳 소문자라면'a' 마지막으로 문자형 숫자라면 '0'를 빼준다.

역으로 이렇게 만든 정수를 다시 문자로 바꿀 수 있다.

이때는 chr() 함수를 사용한다. 마찬가지로 파이썬 내장 함수이며 chr()는 아스키코드 정수형을 문자로 바궈주는 함수이다.

chr(0 + ord('a'))    # a
chr(0 + ord('A'))    # A
chr(0 + ord('0'))    # 0

이때는 앞선 방법과 반대로 ord()함수에 문자의 첫 번째 값을 더해주고 바꾸고 싶은 정수를 입력해주면 된다. 단 알파벳이라면 앞에 입력하는 정수값이 26보다 크면 안된다. 26보다 큰 값이 들어오면 원하지 않는 이상한 값이 나올 수 있다. 숫자의 경우는 0~9 사이의 정수값이어야한다.

문제 해설

연속하는 문자열을 확인하기 위해서 알파벳을 체크하기 위한 alpa:list[bool]을 정의한다. 그리고 이전 인덱스와 현재 인덱스를 저장해 줄 prev_indexcurrent_index 변수를 사용할 것이다.

먼저 prev_index는 첫번째 문자를 아스키코드로 변환하고 'a'의 아스키코드 값을 빼준 값으로 초기화한다.
current_indexword를 순회하면서 (그 단어의 아스키코드 값) - ('a'의 아스키코드 값)을 계산한다.

if 문에서 prev_index != current_index and alpa[current_index]을 확인한다.
이전 값과 현재 값이 다르다면 연속적인 문자가 아님을 확인할 수 있다. 그리고 alpa의 값이 True라면 이미 체크된 알파벳이므로 아래의 조건을 수행해준다.

if prev_index != current_index and alpa[current_index]:
    result -= 1
    break

break 전에 result -= 1를 해줌으로써 for문을 빠져나와 모든 로직에서 result += 1하는 부분을 상쇄해준다.

소스코드는 Python 3으로 작성되었습니다.

t = int(input())
result = 0

for _ in range(t):
    word = input()
    alpa = [False for _ in range(26)]
    prev_index = ord(word[0]) - ord('a')

    for w in word:
        current_index = ord(w) - ord('a')
        if prev_index != current_index and alpa[current_index]:
            result -= 1
            break
        else:
            alpa[current_index] = True
            prev_index = current_index

    result += 1

print(result)

더 효율적인 코드가 있다면 댓글 부탁드립니다.

반응형