알파벳 찾기
문제
알파벳 소문자로만 이루어진 단어 S가 주어진다. 각각의 알파벳에 대해서, 단어에 포함되어 있는 경우에는 처음 등장하는 위치를, 포함되어 있지 않은 경우에는 -1을 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 단어 S가 주어진다. 단어의 길이는 100을 넘지 않으며, 알파벳 소문자로만 이루어져 있다.
출력
각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다.
만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출력한다. 단어의 첫 번째 글자는 0번째 위치이고, 두 번째 글자는 1번째 위치이다.
예제 입력
baekjoon
예제 출력
1 0 -1 -1 2 -1 -1 -1 -1 4 3 -1 -1 7 5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
알고리즘 분류
- 구현
- 문자열
코드 풀이
난이도가 쉬운 문제이니 만큼 다양한 방식으로 해결할 수 있을 것이다.
나의 경우 문자열을 짜깁기가 용이하고 자주 쓰는 언어인 Python을 써서 문제를 해결하였다.
# 초기 설정
idxs = [-1] * 26
# 입력
chars = list(input())
먼저 위와 같이 결과 정보를 담을 배열인 idxs를 생성하고, 데이터 입력을 chars에다가 담았다.
chars의 경우 여기선 list로 변환해서 코드를 짰지만, 나중에 나올 코드에선 그냥 input()만 써서 해도 상관없다.
그냥 가시적으로 list로 형변환했다.
for i, c in enumerate(chars): # 단어에서 각 문자별로
idx = ord(c) - ord('a') # 0에서 25 사이로 값 변환
if idxs[idx] == -1: # 맨 처음인 경우만
idxs[idx] = i # 정보 저장
앞서 입력받은 단어의 각 문자별로 이제 정보를 저장할 생각이다.
따라서, enumerate 구문을 써서 chars의 각 배열 원소(혹은 문자)마다 검사를 수행하게 된다.
idx는 숫자 값이 담기며, ord를 써서 알파벳 소문자를 숫자값으로 변환하여 계산한다.
결과적으로, a=0, b=1, ... z=25라는 값으로 변환된다.
참고로, ord() 함수의 경우 문자의 유니코드 숫자 값을 리턴해주는 역할을 수행한다.
이후 앞서 결과를 담을 배열의 idx번째 원소에 접근해서,
초기값이 있는 경우에만 값을 현재 i로 바꿔주는 기능을 수행한다.
따라서, 그 이후에 중복된 문자가 나오면 무시되고 값이 바뀌지 않게 된다.
# 최종 출력
print(str(idxs)[1:-1].replace(',', ''))
최종 출력 구문은 위와 같이 한 줄로 짰다.
먼저, idx배열을 str 형태로 바꾸게 되면, '[-1, -1, -1, .... , -1]' 이런 형태로 결과가 출력된다.
여기서 양쪽 괄호는 필요없으니 [1:-1]을 추가하여 슬라이싱 했다.
이 과정을 거치면 '-1, -1, ..., -1'의 형태의 문자열을 얻어낼 수 있다.
최종 출력은 그냥 숫자 값과 빈칸만으로 되어 있어야 하므로, 쉼표(,)를 제거해야 한다.
따라서 .replace()를 써서 쉼표를 없는 값으로 바꿔주는 기능을 추가했다.
전체 코드는 아래와 같다.
# 초기 설정
idxs = [-1] * 26
# 입력
chars = input()
for i, c in enumerate(chars): # 단어에서 각 문자별로
idx = ord(c) - ord('a') # 0에서 25 사이로 값 변환
if idxs[idx] == -1: # 맨 처음인 경우만
idxs[idx] = i # 정보 저장
# 최종 출력
print(str(idxs)[1:-1].replace(',', ''))
간단한 구현 문제이니만큼 다양한 형태로 구현할 수 있을 것이다.
입력된 단어 기준으로 for문을 돌지 않고, 26개 알파벳 데이터를 기준으로 for문을 돌아도 될 것이며,
출력도 그냥 for문을 사용해서 출력하는 방법도 있을 것이다.
이는 각자 개인의 성향에 따라서 자유롭게 구현하기만 하면 된다.
딱히 메모리 제한도 문제될 게 없고 입력->출력만 만족하면 되는 문제라서 위 코드로도 충분히 통과하였다.
'프로그램 관련 > 알고리즘' 카테고리의 다른 글
[백준 2609] 최대공약수와 최소공배수 (0) | 2023.04.28 |
---|---|
[백준] 별 찍기 - 1번부터 9번까지 (0) | 2023.04.23 |
댓글