본문 바로가기
SWEA 문제 풀이

SWEA[D2] 1989 python 초심자의 회문 검사 풀이

by ODEU 2022. 7. 11.
728x90

D2 : 1989 초심자의 회문 검사 풀이입니다.

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PyTLqAf4DFAUq& 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


 

처음 생각한 과정

 

T 입력받기

T번 입력받기 (반복)

입력받은 문자열 저장

받은 입력 문자열의 길이 측정

대칭성을 비교한다

만약 대칭이 아닌 경우 결괏값 0을 반환

대칭인 경우 결과값 1을 반환

 

그런데 마지막에 결과값 반환을 반대로 생각해서 (왜 그랬지..?) 뭐가 잘못된 것인지 한참 고민했었다.

이를 통해 무조건 문제의 조건에서 어떻게 결과를 출력하라고 했는지 앞으로는 더 정확하게 확인을 해야겠다고 느꼈다.


가장 먼저 테스트 케이스의 수를 받는 코드를 작성했다. 이때 입력받는 것은 개수, 즉 숫자이므로 자료형을 int형으로 바꾸어 저장한다.

T = int(input())

 

우선 회문이 되기 위해서는 중간을 기준으로 대칭성을 가져야 한다는 특성이 문제의 핵심이 될 것이라고 생각했다.

그래서 중간에 하나의 알파벳이 있는 문자열이 홀수개로 구성된 문자열인 경우와 정확히 대칭이 되는 짝수개로 구성된 문자열인 경우가 차이가 있는지 먼저 생각해보았다.


 

회문을 구성하는 알파벳의 개수

홀수개라면?

aba abcba abcdcba abcdedcba

중간에 위치하는 1개의 알파벳은 회문여부를 결정하지 않는다.

만약 3개인 경우는 1쌍, 5개인 경우는 2쌍, 7개인 경우는 3쌍, 9개인 경우는 4쌍이 대칭적으로 위치하고 있는지 확인해야 한다.

문자열이 n개의 알파벳으로 구성되어 있다고 한다면 (n - 1)/2 또는( n을 2로 나눈 몫)만큼 대칭 쌍을 가져야 한다.

 

짝수개라면?

aa abba abccba abcddcba abcdeedcba

중간에 위치하는 알파벳이 없다.

문자열이 n개의 알파벳으로 구성되어 있다고 한다면 (n / 2)쌍이 대칭적으로 위치하고 있는지 확인해야 한다.

 

그래서 python에 있는 몫 연산자 // 를 이용하기로 생각했다.

짝수와 홀수의 경우 n // 2 쌍이 대칭적이면 되어 홀수, 짝수에 대해서 따로 케이스를 생각할 필요는 없었다.


T만큼의 테스트 케이스를 입력받게 되므로 input()을 반복적으로 받아 문자열을 저장해야 한다.

그래서 for 문을 사용해서 문자열들을 리스트에 저장하고자 했다.

 

list_str = []
for i in range(T)
	str = input()
	list_str.append(str)

그런데 이렇게 짜면 안된다.

왜?

변수명을 str을 사용하면 str() 함수를 사용할 수 없다.

마지막 부분에 결괏값을 출력할 때 int 자료형을 string 자료형으로 바꾸려고 str()을 사용하는데 계속 

TypeError: 'str' object is not callable <python 오류>

경고 문구가 뜨면서 오류가 발생해서 확인해보니 위에 처럼 코드를 작성해서 오류가 생긴 것이었다.

만약 TypeError: 'str' object is not callable을 마주치게 된다면 혹시 내가 str을 변수명으로 사용했는지 코드를 다시 확인해 보면 좋을 것 같다. 이를 통해 변수 명의 중요성도 배웠다.

 

오류가 나지 않도록 코드를 수정해보면 다음과 같다.

list_str = []
for i in range 
	string = input()
	list_str.append(string)

 

받은 문자열의 길이를 측정하고 맨 앞과 맨뒤, 2번째 알파벳과 마지막에서 2번째 알파벳... 이런 식으로 문자를 비교하기 위해서는 문자열의 인덱스를 알아야 하는데 문자열의 인덱스는 문자열의 길이를 알아야 한다.

 

그래서 python 내장 함수인 len()을 사용하여 문자열의 길이를 측정하고 length라는 변수에 저장했다.

list_str = []
for i in range(T)
	string = input()
	list_str.append(string)
	length = len(string)

변수에 문자열을 저장한 후

길이를 측정하고

n = 길이 //2인 몫(n)을 구하여

문자열[0] 부터 [n-1]R까지

값을 비교

[0] [-1] 

[1] [-2]

...

[n-1] [length - n]

 

만약 [i] != [length - i - 1] 이면 for문을 멈추고  result 0 반환

for문을 돌려 모든 쌍을 비교했을 때 같으면 result 1반환

 

이렇게 만들어진 결과값들을 한번에 출력하기 위해 리스트를 만들어 저장했다.

T = int(input())
list_str = []
list_result = []
for i in range(T):
    result = 0
    string = input()
    list_str.append(string)
    length = len(string)
    n = length // 2
    for j in range(n):
        if list_str[i][length - j - 1] != list_str[i][j]:
            result = 0
            break
        else :
            result = 1
    list_result.append(result)

그리고 결과를 출력하기 위해 for문을 사용했는데, 여기에서 str함수 때문에 계속 오류가 나서 무엇이 문제인지 모르다가 변수명을 내장함수와 동일하게 사용하면 안된다는 것을 알게 되었다.

 


 

i는 int 자료형이고 result가 저장된 리스트의 인덱스로 사용되었다.

결과값으로 출력할 때의 숫자는 1부터 시작을 하므로 0부터 시작하는 값에 더하기 1을 한  i + 1 값을 출력하고자 했다.

이 값은 숫자인데 #과 함께 출력하고자 해서 처음에는 print문 안에 '#' + index를 했는데 #과 숫자 사이에 띄어쓰기가 들어가서 i + 1을 문자열로 변환한 후 더하여 띄어쓰기 없이 붙여 출력하도록 했다.

for i in range(T):
    index = str(i + 1)
    tag = '#' + index
    print("tag, list_result[i])

그래서 다 잘 만들었다고 생각했는데 코드를 제출하니 계속 fail이 떠서 무엇이 문제이지?라고 생각하며 테스트 케이스를 드래그 했더니 문자열 뒤에 스페이스가 여러개가 있는 게 아닌가????

그래서 알파벳으로만 된 문자열보다 길이가 길게 측정되었고 그 뒤에 회문 판별도 제대로 작동하지 않았다.

이를 해결하기 위해 replace(" ", "")를 이용하여 스페이스를 모두 제거했다. 그래서 성공적으로 PASS할 수 있었다.

더보기

테스트를 하면서 완성했던 코드

글을 작성하면서 생각해보니 이 length는 list로 저장 안 해도 되었다. 그래서 지우고 최종제출했다.

T = int(input())
list_str = []
list_len = []
list_result = []
for i in range(T):
    result = 0
    string = input()
    string = string.replace(" ", "")
    list_str.append(string)
    length = len(string)
    list_len.append(length)
    n = length // 2
    for j in range(n):
        if list_str[i][length - j - 1] != list_str[i][j]:
            result = 0
            break
        else :
            result = 1
    list_result.append(result)
    print(string)
    print(length)
    print(list_str)
    print(list_len)
    print(n)
    print('result', result)
print("list result: ", list_result)
for i in range(T):
    index = str(i + 1)
    tag = '#' + index
    print(tag, list_result[i])

최종 제출한 코드이다.

T = int(input())
list_str = []
list_result = []
for i in range(T):
    result = 0
    string = input()
    string = string.replace(" ", "")
    list_str.append(string)
    length = len(string)
    n = length // 2
    for j in range(n):
        if list_str[i][length - j - 1] != list_str[i][j]:
            result = 0
            break
        else :
            result = 1
    list_result.append(result)
for i in range(T):
    index = str(i + 1)
    tag = '#' + index
    print(tag, list_result[i])

 

 

728x90