데이터 코딩랩
백준 10809 파이썬 알파벳 찾기 본문
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 |