minimimi
[1316] 그룹 단어 체커 본문
문제출처] https://www.acmicpc.net/problem/1316
문제요약
문자열에서 문자가 연속하는 문자로만 이루어져있는 지 판단
풀이
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_index
와 current_index
변수를 사용할 것이다.
먼저 prev_index
는 첫번째 문자를 아스키코드로 변환하고 'a'의 아스키코드 값을 빼준 값으로 초기화한다.current_index
는 word
를 순회하면서 (그 단어의 아스키코드 값) - ('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)
더 효율적인 코드가 있다면 댓글 부탁드립니다.
'프로그래밍 공부 > 알고리즘' 카테고리의 다른 글
[백준] 8979 올림픽 (0) | 2021.11.04 |
---|---|
[백준] 11659 구간 합 구하기 4 (0) | 2021.10.15 |
[백준] 9184 신나는 함수 실행 (0) | 2021.10.04 |
[백준] 11725 트리의 부모 찾기 (0) | 2021.10.03 |
[백준] 14888 연산자 끼워넣기 (0) | 2021.10.02 |