코딩테스트 & 문제 풀이

[Python]백준_25643 : 문자열 탑 쌓기

Hicecream 2023. 11. 7. 00:28

2022년 12월 23일에 작성됨

 

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

 

25643번: 문자열 탑 쌓기

인경이는 $N$개의 문자열을 쌓아서 문자열 탑을 완성하려고 한다. 탑을 완성하기 위해서는 모든 문자열을 한 층에 하나씩 아래에서부터 순서대로 쌓아 올려야 한다. 인경이는 문자열 탑의 꼭대

www.acmicpc.net

 

 

 

 

소스 코드 (⭕)

n, m = map(int, input().split())

str = []

for _ in range(n):
    str.append(input())

for i in range(n-1):
    str1 = str[i]
    str2 = str[i+1]

    check = False

    for j in range(1, m+1):
        if str1[m-j:] == str2[:j]:
            check = True
            break

        if str1[:j] == str2[m-j:]:
            check = True
            break

    if check == False:
        print(0)
        exit(0)

print(1)

 

코드 분석

1. 문자열의 개수 n과 문자열의 길이 m을 입력받는다.

2. str 리스트에 n개의 문자열을 입력받아 넣어준다.

3. i는 0부터 n-2까지 반복하여 str1에는 str의 첫 번째 요소, str2에는 str의 두 번째 요소 … 을 각각 넣어준다.

4. 문자열 탑을 쌓을 수 있는지 체크하는 check 변수의 초깃값을 False로 설정한다.

5. 그 다음 for문은 str1과 str2의 요소를 각각 끝과 처음부터 비교한 후 모든 문자열을 비교했으면 다시 각각 처음과 끝부터 비교하는 과정이다.

6. 문자열의 길이만큼 반복하고 난 뒤의 check가 여전히 False라면 현재의 str1과 str2는 겹치는 부분이 없다는 것이므로 0을 출력하고 프로그램을 종료한다.

7. 모든 str1과 str2의 check가 False가 된 적이 없다면 1을 출력한다.


 

<코드 분석 5번에 대한 설명>


j는 1부터 m까지 반복하는데,
예를 들어, m=3이고 str1 = ’acb’와 str2 = ’bac’를 비교하려고 한다.

그럼 j=1일 때,

str1[3-1:] == str2[:1] → ‘b’ == ‘b’로 str1의 끝 문자와 str2의 처음 문자를 비교한다.

str1[:1] == str2[3-1:] → ‘a’ == ‘c’로 str1의 처음 문자와 str의 끝 문자를 비교한다.

j=2일 때,

str1[3-2:] == str2[:2] → ‘cb’ == ‘ba’로 str1의 끝 두 문자와 str2의 처음 두 문자를 비교한다.

str1[:2] == str2[3-2:] → ‘ac’ == ‘ac’로 str1의 처음 두 문자와 str2의 끝 두 문자를 비교한다.

j=3일 때,

str1[3-3:] == str2[:3] → ‘acb’ == ‘bac’로 str1과 str2의 모든 문자를 비교한다.

밑의 if문도 마찬가지로 모든 문자를 비교한다.

 

 

따라서 식을 만들어보면,

끝에서 부터 시작해서 처음 문자까지 하나씩 늘려가며 비교해 주려면

배열[배열 길이 - (1부터 배열 길이까지):]

str1[3-(1, 2, 3):] → b / cb / acb

str2[3-(1, 2, 3):] → c / ac / bac
처음부터 끝 문자까지 하나씩 늘려가며 비교해 주려면

배열[:(1부터 배열 길이까지)]

str2[:(1, 2, 3)] → b / ba / bac

str1[:(1, 2, 3)] → a / ac / acb

 

 

end

코드는 검색을 통해 다른 분의 것을 참고하였다. 처음에 이해가 안되서 코드 분석을 열심히 하다보니 정말 힘들었지만 완전히 이해가 되었다!