본문 바로가기

알고리즘 공부/알고리즘 구현 기초

백준)알파벳 찾기-파이썬

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

(브론즈 2 문제)

 

10809번: 알파벳 찾기

각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다. 만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출

www.acmicpc.net

입력

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

내 코드

S=list(input().split())
for i in range(len(S)):
    k=ord("a")
    if(S[i]==k):
        print(S[i],end=" ")
        k+=1
    else:
        print(-1,end=" ")

풀이(생각 과정)

처음에 문자열을 받는 과정을 정의하고 배열의 길이에 따라 아스키 코드 문자를 이용해서 일일이 비교하는 형태로 구현을 해보았다.

이런 형태로 구현시 다음 문자열을 다시 a부터 비교해야하는데 그러한 과정이 k+=1이라는 형태 때문에 비교하지 못하게 되면서 출력이 내가 원하는 형태의 출력이 되지 못한다는 사실을 알았다.

다른 풀이

S=input()
for i in 'abcdefghijklmnopqrstuvwxyz':
    print(S.find(i),end=' ')

파이썬에서 가장 강력한 기능은 내장 함수가 많다는 점이다. find 함수를 사용시 입력값에서 순서를 출력해주는 기능을 가지고 있으며 없을 경우 -1을 출력하는 기능을 가지고 있다.

문제 조건에서 a부터 z까지만 등장한다고 하였으므로 a부터 z까지의 문자열 내에서 find 함수를 이용해서 비교하여 출력하는 방식으로 구현했다.

배운 점

이번 문제에서는 반복문을 통해서 해결해보려고 하였으나 2개의 수치, S를 리스트화 해서 S의 순서를 만들고 a부터 z까지의 문자열의 순서를 아스키 코드를 이용해서 만들어 두고 일일이 비교하면서 수치를 높이는 그러한 발상으로 문제를 접근하였으나 'abc...'와 같이 a부터 z의 문자열을 만들고 그 안에서 비교하는 방법을 생각하지 못했다. 앞으로 문제를 많이 풀면서 유연하게 사고할 필요가 있을 것 같다.

그리고 알고리즘 문제의 경우 다른 시험을 준비한다고 오랫동안 놓으니 감각이 떨어졌다는 느낌을 받았다. 아무래도 꾸준하게 1문제라도 푸는 습관을 들일 필요성을 느꼈다.