알파벳 찾기
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
---|---|---|---|---|---|
1 초 | 256 MB | 245104 | 131758 | 108378 | 53.396% |
문제
알파벳 소문자로만 이루어진 단어 S가 주어진다. 각각의 알파벳에 대해서, 단어에 포함되어 있는 경우에는 처음 등장하는 위치를, 포함되어 있지 않은 경우에는 -1을 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 단어 S가 주어진다. 단어의 길이는 100을 넘지 않으며, 알파벳 소문자로만 이루어져 있다.
출력
각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다.
만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출력한다. 단어의 첫 번째 글자는 0번째 위치이고, 두 번째 글자는 1번째 위치이다.
예제 입력 1
baekjoon
예제 출력 1
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=input()
pos=[-1]*26
for alpha in range(26):#알파벳 하나씩 검사, pos의 인덱스 역할을 함. 97을 더하면 아스키 코드
i=0 #인덱스 관리
for c in s:#입력값에서 한 글자씩 불러옴
if ord(c)==alpha+97:# 불러온 글자가 지금 찾는 아스키 코드인가?
pos[alpha]=i #맞으면 인덱스를 알파벳 순서 인덱스에 저장
break # 현재 반복문을 탈출
i=i+1 #탈출 못하면 인덱스 하나 올림.
print(*pos) #pos의 원소를 공백으로 구분하여 모두 출력함
입력된 알파벳만 검사해서 검사횟수 줄이기
s=input()
pos=[-1]*26
s_set=set(s)#인풋된 글자 중복 제거
for alpha in s_set:#알파벳 중 인풋에 있는 것만 검사
i=0 #인덱스 관리
for c in s:#입력값에서 한 글자씩 불러옴
if c==alpha:# 불러온 글자가 지금 찾는 알파벳인가?
pos[ord(alpha)-97]=i #맞으면 pos의 알파벳-97인덱스에 인풋된 단어의 현재 인덱스를 저장
break # 현재 반복문을 탈출
i=i+1 #탈출 못하면 인덱스 하나 올림.
print(*pos) #pos의 원소를 공백으로 구분하여 모두 출력함
딕셔너리와 get메서드로 포지션 기억 메모리 줄여보기
s=input()
pos={}
s_set=set(s)#인풋된 글자 중복 제거
for alpha in s_set:#알파벳 중 인풋에 있는 것만 검사
i=0 #인덱스 관리
for c in s:#입력값에서 한 글자씩 불러옴
if c==alpha:# 불러온 글자가 지금 찾는 알파벳인가?
pos[alpha]=i #맞으면 pos에 알파벳 키와 현재 인덱스를 연결해 저장
break # 현재 반복문을 탈출
i=i+1 #탈출 못하면 인덱스 하나 올림.
print(*[pos.get(x,-1) for x in 'abcdefghijklmnopqrstuvwxyz'])
#pos 에서 알파벳 정보를 뒤져서 출력 없으면 -1출력
str.find 메서드 써 버리기 (인덱스 메서드도 됨. 인풋에 있는 것만 검사하니까)
s=input()
pos={}
s_set=set(s)#인풋된 글자 중복 제거
for alpha in s_set:#알파벳 중 인풋에 있는 것만 검사
pos[alpha]=s.find(alpha) #위치를 찾아서 딕셔너리에 매핑
print(*[pos.get(x,-1) for x in 'abcdefghijklmnopqrstuvwxyz'])
#pos 에서 알파벳 정보를 뒤져서 출력 없으면 -1출력
다시 리스트 쓰면서 find메서드도 쓰기(인덱스 메서드도 됨.)
s=input()
pos=[-1]*26
s_set=set(s)#인풋된 글자 중복 제거
for alpha in s_set:#알파벳 중 인풋에 있는 것만 검사
pos[ord(alpha)-97]=s.find(alpha) #위치를 찾아서 딕셔너리에 매핑
print(*pos)
#pos 에서 알파벳 정보 출력
지금까지 발견된 글자를 기록하는 집합을 만들어서 처음보면 인덱스 기록하기(pos로 처음 봤는지 검사할 수도 있음. -1인지 확인)
s=input()
pos=[-1]*26
found={}
for i in range(len(s)):#단어길이만큼 검사
if s[i] not in found:#i번째 글자가 처음본 글자면
pos[ord(s[i])-97]=i
#아스키 코드를 이용해 그 글자의 기록위치를 찾고 pos에 기록
print(*pos)
#pos 에서 알파벳 정보 출력
하던 대로 하기
import os
s=os.read(0,os.fstat(0).st_size).rstrip(b'\n')#버퍼에 입력된만큼 바이트로 읽어오기(마지막\n삭제)
pos=[-1]*26
s_set=set(s)#입력값의 집합으로 중복 제거
for char in s_set:#글자 종류만큼 검사
pos[char-97]=s.index(char)
#아스키 코드를 이용해 그 글자의 기록위치를 찾고 pos에 기록
print(*pos)
#pos 에서 알파벳 정보 출력
좋아하는 것 하기
import os
s=os.read(0,os.fstat(0).st_size).rstrip(b'\n')#버퍼에 입력된만큼 바이트로 읽어오기(마지막\n삭제)
print(' '.join(f"{s.index(x) if x in set(s) else -1}" for x in range(97,123)))
#97에서 122까지 x를 만들어서 s에 있으면 인덱스를 없으면 -1을 출력
그런데 그거 아세요? find메서드에서 찾는 값이 없으면 -1반환이래요...
False로 기억해서 위처럼 짰는데...
s = input()
print(*[s.find(chr(i)) for i in range(97, 123)])
s =open(0).read().rstrip()
print(" ".join(f"{s.find(chr(i))}" for i in range(97, 123)))
맞힌사람 탭에서 제일 빠른 1등 코드(다른 사람 코드)
s = input()
for i in range(97,123):
print(s.find(chr(i)), end=' ')