개발일기 [Python 파이썬]

[파이썬 회문] 앞뒤가 똑같은 단어 숫자 문장 python palindrome 01

neullo 2024. 3. 7. 15:00

 

앞뒤가 똑같은 "level" "토마토"과 같이 거꾸로 읽어도 제대로 읽은 것과 같은 문장이나 낱말을 회문(回文, palindrome)이라 한다.




단어를 입력 받아 회문이면 1을 출력하고, 아니라면 0을 출력하는 프로그램을 작성하는 법을 배워보자.
-문제 출처 swexpertacademy -
 

SW Expert Academy

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

swexpertacademy.com



[제약 사항]
각 단어의 길이는 3 이상 10 이하이다.

[입력]
가장 첫 줄에는 테스트 케이스의 개수 T가 주어지고, 그 아래로 각 테스트 케이스가 주어진다.
각 테스트 케이스의 첫 번째 줄에 하나의 단어가 주어진다.

[출력]
출력의 각 줄은 '#t'로 시작하고, 공백을 한 칸 둔 다음 정답을 출력한다.
(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)

 

 


1. 사용자에게 인풋 받기: input() 함수

T= int(input())

 

  • input() 함수를 사용하여 테스트 케이스의 개수를 입력받습니다. 이 값을 정수형으로 변환하여 변수 T에 저장합니다.

 

2. 범위 지정: 루프를 1부터 T까지 밑에 규칙 실행해줘- 1부터 세고 원하는 개수로 끝나도록  (1, T+1)

for i in range(1,T+1)
  • 1부터 T까지의 숫자에 대해 반복하는 반복문입니다. 이렇게 하면 각각의 테스트 케이스를 처리할 수 있습니다.

3. "토마토" 같은 단어 인풋 받으면 단어 길이가 어떻게 되는지 세보고 회문인지 확인- 맞는지 체크해줘

	word = input()
	length = len(word)
	is_palindrome = True
  • 각 테스트 케이스로 들어오는 단어를 input() 함수를 통해 입력받고, 이를 word 변수에 저장합니다.
  • 입력받은 단어의 길이를 구하여 변수 length에 저장합니다.
  • 회문 여부를 판별하는 변수 is_palindrome을 True로 초기화합니다. 이 변수는 회문인지 아닌지를 나타냅니다.

4. 절반만 반복: 앞과 뒤를 각각 비교하여 다른 문자가 나오는지 확인

    for j in range(length // 2):
        if word[j] != word[length - 1 - j]:
            is_palindrome = False
            break
  • 입력된 단어의 절반만큼 반복하는 반복문입니다. 단어의 앞뒤를 한 번에 비교하기 위해 절반만큼만 반복합니다.
  • 단어의 앞과 뒤를 각각 비교하여 다른 문자가 나오는지 확인합니다. 만약 다른 문자가 나온다면 회문이 아니므로 아래의 코드를 실행합니다.
  • 만약 다른 문자가 나온다면, is_palindrome 변수를 False로 변경하고 반복문을 종료합니다.
!=
는 두 값이 서로 다를 때 참(True)을 반환하는 비교 연산자입니다.
예를 들어, a != b 는 a 와 b 가 서로 다른 경우에 참(True)을 반환하고, 같은 경우에는 거짓(False)을 반환합니다.
word[j] != word[length - 1 - j]
예를 들어, 문자열이 "level"이라고 가정해봅시다.
이 문자열의 길이는 5이므로 length는 5가 됩니다.
첫 번째 문자는 인덱스 0에 위치하고, 다섯 번째 문자는 인덱스 4에 위치합니다. (0부터 세니까 0,1,2,3,4)

"level"
"level"
"level"
현재 위치 j 에 대칭되는 위치에 있는 문자를 가리킵니다.

따라서 word[length - 1 - j]는 현재 위치 j에 대칭되는 위치에 있는 문자를 계산합니다.
예를 들어,
- j가 0일 때[이때 0은 첫번째를 의미하니 level 에서 첫번째 L 을 의미],
- 대칭되는 위치의 인덱스는 length - 1 - j 즉, 4가 됩니다[여기서 4는 0,1,2,3,4 즉 마지막 알파벳 L 을 의미].
이렇게 함으로써 현재 위치 j에 대칭되는 위치에 있는 문자를 가져올 수 있습니다.

5. True이면 1을, False이면 0을 출력해줘

    result = 1 if is_palindrome else 0  # 회문 판별 결과
    print(f'#{i} {result}')  # 결과 출력

 

  • 회문 여부에 따라 결과를 결정합니다. is_palindrome이 True이면 1을, False이면 0을 result 변수에 저장합니다.
예를 들어, 문자열이 "level"일 때, 첫 번째 문자 'l'과 마지막 문자 'l'은 같고, 두 번째 문자 'e'와 뒤에서 두 번째 문자 'e'도 같습니다. 이어서 세 번째 문자 'v'와 뒤에서 세 번째 문자 'v'도 같습니다. 따라서 모든 문자가 대칭되는 위치에 있는 문자와 동일하므로 이 문자열은 회문입니다.

 

최종코드

T = int(input())  # 테스트 케이스의 개수 입력

for i in range(1, T+1):
    word = input()  # 각 테스트 케이스 입력
    length = len(word)
    is_palindrome = True
    for j in range(length // 2):
        if word[j] != word[length - 1 - j]:
            is_palindrome = False
            break
    result = 1 if is_palindrome else 0  # 회문 판별 결과
    print(f'#{i} {result}')  # 결과 출력

 

제 2탄!