데이터 코딩랩

백준 10809 파이썬 알파벳 찾기 본문

Algorithm/백준

백준 10809 파이썬 알파벳 찾기

researcher 틴틴 2025. 4. 15. 22:26

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

 

📄 실전 문제 접근 체크리스트


1초, 256MB


1단계: 문제 파악

☑️ 문제 요구사항 한 줄로 정리    

:  알파벳 소문자 단어 S, 알파벳 순서로 번호를 매기는 느낌인데 없는 알파벳 자리에는 -1을 적어준다

 

☑️ 예제 입력/출력 확인

: 입력  알파벳 소문자

: 출력 → 알파벳 갯수 만큼 나열 되어있는데 단어에서 몇번째 나온 문자인지에 따라 숫자가 매겨짐

등장하지 않은 알파벳에는 -1을 써준다.

+ 중복인 경우 무시한다.

 

 

추가)  추가사항없음

 

✔️ 출력은 총 26개의 숫자

✔️ 각 숫자는 알파벳 'a'부터 'z'까지의 첫 등장 위치(index)

✔️ 없는 문자는 -1 출력

✔️ 중복 등장 시, 가장 먼저 등장한 위치만 저장

✔️ ord('a') = 97을 기준으로 알파벳 인덱스 계산

 

 


   
2단계: 입력 범위 → 시간복잡도 판단
입력 크기 (N) 적정 알고리즘 복잡도

 

 

 

☑️ 입력 크기 체크 후 -> 내가 쓸 수 있는 알고리즘 선별

받을 수 있는 소문자의 개수는 1<= S <=100, 공백없음

 

추가)  

✔️ 최대 문자열 길이 100

✔️ 알파벳 개수는 고정(26개) → O(N) 시간복잡도면 충분

✔️ ord()와 리스트 인덱스 접근은 모두 O(1)

✔️ 최악의 경우에도 O(N) 이라 시간 초과 가능성은 없음

 

 



3단계: 알고리즘 유형 선택
☑️  문자열 처리,

입력받은 문자를 리스트로 받아서 요소별 숫자를 적는식인데, 중복인 경우가 문자가 됨

 

추가) 

✔️ 문자열 처리 + 인덱싱

✔️  ord()를 통해 알파벳 → 숫자(0~25)로 매핑

✔️  중복 방지를 위해 -1일 때만 값을 저장

 

 



4단계: 자료구조 & 흐름 정리
☑️  어떤 자료구조를 쓸까?
    → 문자열 인듯
☑️  함수 나눌 필요 있는가?  

    → 없음
☑️ 조건 분기 많을까? 시뮬레이션 필요한가?  

  → 없음
☑️ 흐름 : 리스트 두개를 만들어서 알파벳 위치에 번호로 치환하는 느낌

 

추가) 

✔️  box = [-1] * 26: 알파벳 a~z 각각의 첫 등장 인덱스를 저장

✔️  문자열을 순회하며 → 알파벳 인덱스(ord(c)-97) 계산 → box에 저장

      단, box[알파벳 인덱스]가 -1일 때만 저장 (중복 방지)

 

 



5단계: 구현 전 체크 
☑️  입출력 방식은?

    → 한개 리스트는 단어를 입력받고, 다른 한개는 -1 이 26개 배치된 리스트를 받는다. 반복문을 써야할 것 같다

 

☑️ 예외 상황은 어떤 게 있을까? (빈 입력, 중복 등)

    → 중복 알파벳이 나오면 pass 해야한다. 
☑️ 시간 초과 가능성은?
    → 없는듯

 

 

추가) 

✔️ input() 한 줄로 문자열 입력받음

✔️ ord(char) - ord('a')는 알파벳 인덱스 0~25를 얻는 공식

✔️ print(*box)를 쓰면 리스트를 공백으로 구분하여 출력 가능

✔️ 예외: 없음 (문자열은 반드시 1글자 이상, 알파벳 소문자만 주어짐)

 


6단계: 제출 전 체크리스트
✔️ 중복 알파벳 무시 로직이 잘 작동하는가?

 

✔️ 출력 길이가 26개가 맞는가?

✔️ print()에 불필요한 줄바꿈/공백이 없는가?

✔️ 리스트 초기값 [-1]*26이 잘 유지되는가?

 

 

추가) 

 

 

내 답

S = list(input())
box = [-1] * 26

for i in S:
   box[i] == ord(i)-97
for i in S:
    print(ord(S[i])-97)
newS=[]
for i in S:
    a = ord(i)-97
    newS.append(a)
print(newS)
newS = [1, 0, 4, 10, 9, 14, 14, 13]
box =  [-1,-1,-1,-1,-1...]

# newS 가 가리키는 건 box의 인덱스 위치
# box에 newS 의 인덱스 자리 숫자를 넣어야한다.
# 4의 경우
# newS의 인덱스 번호인 2를 box[] 의 4번째 위치에 넣어라
# 근데 그 자리가 -1일때만 바꿔주고 -1이 아니면 패스해라



for j in range(len(newS)):  # i = 0
    k = newS[j]  # k = 1
    if box[k] == -1:
        box[k] =  j



print(*box)

 

최적화 된 답

S = input()
box = [-1] * 26

for i in range(len(S)):
    idx = ord(S[i]) - ord('a')
    if box[idx] == -1:
        box[idx] = i

print(*box)

 

멋진 풀이

S = list(input())
box = [-1] * 26


for idx, value in enumerate(S):
    temp = ord(value)-97
    if box[temp] == -1:
        box[temp] = idx
print(*box)

'Algorithm > 백준' 카테고리의 다른 글

백준 1152 파이썬 단어의 개수  (0) 2025.04.16
백준 2675 파이썬 문자열 반복  (0) 2025.04.15
백준 11720 파이썬 숫자의 합  (0) 2025.04.15
백준 11654 파이 아스키코드  (0) 2025.04.15
백준 9086 파이썬 문자  (0) 2025.04.15