코딩 테스트 스터디/백준

[실버 V] 16171번. 나는 친구가 적다 (Small)

남쪽마을밤송이 2022. 2. 23. 00:51

 문제 

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

 

16171번: 나는 친구가 적다 (Small)

첫 번째 줄에는 알파벳 소문자, 대문자, 숫자로 이루어진 문자열 S가 주어진다. (1 ≤ |S| ≤ 100) 두 번째 줄에는 성민이가 찾고자 하는 알파벳 소문자, 대문자로만 이루어진 키워드 문자열 K가 주

www.acmicpc.net

 사용 언어 

Python3

 풀이 과정 

처음엔 이렇게 풀었는데 틀렸습니다가 떠서 여러 예제를 집어넣어보여 빈 구멍을 찾았다..

import sys

S = sys.stdin.readline().strip()
K = sys.stdin.readline().strip()

word_index = 0
for i in range(len(S)):
    if 48 <= ord(S[i]) <= 57: # ASCII 코드 정수 범위
        continue
    else:
        if S[i] != K[word_index]: # 다른 문자 나오면 리셋
            word_index = 0
            if i == len(S)-len(K): # 남은 문자열이 K의 길이보다 작아지면
                print(0)
                break
        else:
            if word_index == len(K)-1: # K의 마지막 문자열도 일치하면
                print(1)
                break
            word_index += 1 # 일치하면 다음 인덱스로

 

그 결과1. 숫자일 때 for문이 끝나면 13번째 줄 if문에 걸리지 않는 것2. 다른 문자가 나와서 리셋하자마자 그 문자가 찾는 문자열의 시작일 경우3. 일치했는데 마지막 문자일 때의 경우를 처리해주었고

import sys

S = sys.stdin.readline().strip()
K = sys.stdin.readline().strip()

word_index = 0
for i in range(len(S)):
    if 48 <= ord(S[i]) <= 57: # ASCII 코드 정수 범위
        if i == len(S)-1:
            print(0)
            break
        continue
    else:
        if S[i] != K[word_index]: # 다른 문자 나오면 인덱스 리셋
            word_index = 0
            if i == len(S)-1:
                print(0)
                break
            if S[i] == K[word_index]:
                word_index += 1
        else:
            if word_index == len(K)-1: # K의 마지막 문자열도 일치하면
                print(1)
                break
            if i == len(S)-1:
                print(0)
                break
            else:
                word_index += 1 # 일치하면 다음 인덱스로

이렇게 고쳤으나 계속 뜨는 틀렸습니다 ㅂㄷㅂㄷ

엄청 다양한 예제를 넣어보았는데 결과가 잘못 뜨거나 안 뜨는 경우를 찾지 못하고 결국 포기...

다른 방식으로 풀었더니 빠르게 뜬 맞았습니다!!

그래도 저 코드의 틀린점을 알고 싶다 아쉽고 찜찜해...ㅠ

 제출 답안 

import sys

S = sys.stdin.readline().strip()
K = sys.stdin.readline().strip()
str_list = []

for i in range(len(S)):
    ascii = ord(S[i])
    if 65<= ascii <= 90 or 97 <= ascii <= 122:
        str_list.append(S[i])

str = ''.join(str_list)
if K in str:
    print(1)
else:
    print(0)

 공부한 내용 

문자열에 특정 문자열이 포함되어 있는지 확인하는 방법

1. if something in string:

특정 문자열이 포함되어 있는지 확인할 수 있다.

2. find()

find()는 문자열에 인자로 전달된 문자열이 존재할 때, 문자열의 위치에 해당하는 index를 리턴한다.이 때 문자열이 존재하지 않으면 -1을 리턴한다. find가 -1이 아니니 다른값을 리턴한다면 문자열이 포함되어 있다고 판단할 수 있다.

 

출처: https://codechacha.com/ko/python-find-str-in-str/ 

아스키코드 표

출처: https://velog.io/@gndan4/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%95%84%EC%8A%A4%ED%82%A4-%EC%BD%94%EB%93%9C-%EA%B4%80%EB%A0%A8-%ED%95%A8%EC%88%98