본문 바로가기

알고리즘 예시/백준

[Baekjoon] 백준 #1316번 파이썬 해답

320x100

 

백준 단계별로 풀어보기. 문자열의 마지막 순번입니다.
https://www.acmicpc.net/problem/1316

 

문제 자체는 길지 않지만, 그안에 들어있는 논리나 해결구조는 결코 짧지 않은 구조였습니다.

백준의 문제설명부터 천천히 읽어보겠습니다.

 

문제

 

그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다.

 

예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때문에 그룹 단어이지만, aabbbccb는 b가 떨어져서 나타나기 때문에 그룹 단어가 아니다.

 

단어 N개를 입력으로 받아 그룹 단어개수를 출력하는 프로그램을 작성하시오.

 

 

이번 문제는 예시가 중요합니다.

 

예제 입력 1

 

3
happy
new
year
3

 

예제 입력 2
4
aba
abab
abcabc
a
1

 

예제 입력 3
2
yzyzy
zyzyz
0

 

해답

 

N = int(input())
k = 0
for j in range(N):
    A = input()
    error = 0 # 에러가 0일때 출력할 error를 정의
    for i in range(len(A)-1): # 문자 수에서 1을 빼줌
        if A[i] != A[i+1]:
           new_A = A[i+1:]
           if new_A.count(A[i]) > 0:
               error = error+1
    if error == 0:
       k = k+1
print(k)

 


이번 글에서는 특이하게도 문자열의 슬라이싱을 사용합니다.

 

문자열 슬라이싱 참조

 

A가 특정한 문자열일때, A[n:m]

이때 n은 시작하는 문자 인덱스 값, m은 종료하는 문자 인덱스 값-1 입니다.

 

막상 설명하기엔 어려우니 예시로 보겠습니다.

 

<예시>

A = 'popo' 일 때입니다.

처음부터 p 의 인덱스값 0, o의 인덱스값 1, p의 인덱스값 2, o의 인덱스값 3이죠?

 

A[0:] 일 경우 "popo" 출력

A[1:] 일 경우 "opo"가 출력됩니다.

A[2:3] 일 경우 "p" 출력됩니다.

 

반대도 가능합니다. 왼쪽 값이 없으면 인덱스값이 0인 곳부터 나옵니다.

A[:3] 일 경우 "pop" 출력

A[:2] 일 경우 "po" 출력됩니다.

 

뒤의 인덱스값은 -1된 상태로 슬라이싱 된다는 점이 포인트입니다!

 

해석 부분

 

위 문제가 어려움을 느낄 부분은 한 문자가 중복되는 경우에

그룹 문자라고 여기지 않을때도 있고, 그룹 문자로 여길때도 있다는 점입니다.

 

즉 한번 등장한 문자는 연속되서 등장해야만 하고, 한칸을 넘어서 등장하게 되면

그대로 그룹문자에서 탈락하게 됩니다. 등장하는 문자가 홀수이거나, 짝수인 것도 

딱히 상관이 없습니다. 어떻게 되든 오로지 단어에서 연속되야만 그룹 문자로 합격됩니다.

 

그렇기 때문에, 사실 'new'나 'ab'같은 단순 중복 알파벳이 없는 문자열이 가장 편합니다.

한번 등장한 문자가 다시 한번 등장할 일 자체가 없기 때문이죠.

그렇지만 문자열이 1번 입력되는 것이 아니라 복수(2~이상) 입력되기때문에 모든 경우를

전부 고려해야 합니다.

 

여기서 새롭게 생각해야 하는 개념은 에러의 존재입니다.

 

error = error+1

 

이를 통해 에러라는 것을 부여하여, 이것이 없는 경우에 1을 추가하도록 선언할 수 있습니다.

 

error = error+1
if error == 0:
k = k+1 # output

 

스페이스바는 무시하고 입력해보았습니다.

 

    for i in range(len(A)-1): # 문자 수에서 1을 빼줌
        if A[i] != A[i+1]:
           new_A = A[i+1:]
           if new_A.count(A[i]) > 0:
               error = error+1
    if error == 0:
       k = k+1

 

(A는 입력을 받을 문자열)

happy를 넣는다고 가정해보겠습니다.

이렇게 작성하면 'h' 가 'a' 와 같지 않아 if 는 참으로 들어갑니다.

 

그리고 'appy'를 슬라이싱해서 새롭게 new_A에 들어가게 되고

이 안에서 if문을 시작합니다. 'appy'인 new_A에 'h' 가 다시 들어가는지

체크(count(A[i]) ) 해보고, h가 들어갈 경우 error 를 추가해줍니다.

 

이 과정은 마지막 글자에서 -1 한 범위에서 for문 으로 반복되는데요.

final 문자인 y는 그 이후에 연속되는 문자가 없기 때문입니다.

 

아래 선언도 까먹으면 안됩니다.

error가 갑자기 나오면 코드가 돌아가지 않습니다.

 

    A = input()
    error = 0 # 에러가 0일때 출력할 error를 정의

 

몇 줄을 쓸 것인가 ? = N

 

어떤 문자를 넣을 것인가? = A

 

N = int(input())
k = 0
for j in range(N):
    A = input()
    error = 0 # 에러가 0일때 출력할 error를 정의
    for i in range(len(A)-1): # 문자 수에서 1을 빼줌
        if A[i] != A[i+1]:
           new_A = A[i+1:]
           if new_A.count(A[i]) > 0:
               error = error+1
    if error == 0:
       k = k+1
print(k)

 

이렇게 정의해서 넣습니다.

 

알고리즘 풀이 종료.

728x90