2024. 6. 17. 22:34ㆍ개발의 흔적/코딩테스트
문제: 회문 문자열 검사
N개의 문자열 데이터를 입력받아 앞에서 읽을 때나 뒤에서 읽을 때나 같은 경우(회문 문자열) 이면 YES를 출력하고 회문 문자열이 아니면 NO를 출력하는 프로그램을 작성한다.
단 회문을 검사할 때 대소문자를 구분하지 않습니다.
<입력설명>
첫 줄에 정수 N(1<=N<=20)이 주어지고, 그 다음 줄부터 N개의 단어가 입력된다. 각 단어의 길이는 100을 넘지 않는다.
<출력설명>
각 줄에 해당 문자열의 결과를 YES 또는 NO로 출력한다.
5
level
moon
abcba
soon
gooG
출력예제
#1 YES
#2 NO
#3 YES
#4 NO
#5 YES
1. 예제의 5번째 'gooG'을 보면 회문으로 처리하므로, 각 선택쌍끼리 비교하기 전에 모두 소문자 or 대문자로 바꾸어야한다.
2. 출력시 몇번째 단어인지도 출력해야하므로 각 단어마다 for문을 돌 떄, enumerate를 사용하도록 하자.
3. python에서는 String도 iteration으로 처리 할 수 있다.
word[ i - 1] == word [ -1] 을 이용하자
이러한 아이디어로 처음 작성한 코드:
import sys
input = sys.stdin.readline
N = int(input())
word_list = [input().strip() for _ in range(N)]
for index ,word in enumerate(word_list):
word = word.lower()
flag = True
for i in range(len(word)//2):
if word[i] != word[-(i+1)]:
flag = False
break
# print(word)
print (f"#{index+1} YES") if flag else print(f"#{index+1} NO")
flag를 이용했다. True로 초기화하고, 만약 한 쌍이라도 같지 않다면, False로 바꾼다.
그러나 최근에 for else문에 대해 알게 되었으므로 이를 이용해 코드를 조금 바꾸어보았다.
for else문 : for문이 끝까지 실행되었다면 else로 빠진다
for i in range(10):
if 궁시렁궁시렁
print("for문이 if에 걸려서 break됨!")
break
else:
print("for문이 끝까지 실행됨!!")
이러한 용도이다.
그래서 이를 통해 바꾼 최종코드:
import sys
input = sys.stdin.readline
N = int(input())
word_list = [input().strip() for _ in range(N)]
for index ,word in enumerate(word_list):
word = word.lower()
for i in range(len(word)//2):
if word[i] != word[-(i+1)]:
print(f"#{index + 1} NO")
break
else:
print(f"#{index + 1} YES")
처음 for else를 접했을때 들었던 내 생각은, '이를 이용하면 기존에 flag를 사용해야 되었던 코드들을 단축 할 수 있겠다' 였는데 지금이 적절한 예시가 아닌가 싶다.
++ 추가
import sys
input = sys.stdin.readline
N = int(input())
word_list = [input().strip() for _ in range(N)]
for index ,word in enumerate(word_list):
word = word.lower()
if word == word[::-1]:
print(f"#{index + 1} YES")
else:
print(f"#{index + 1} NO")
'개발의 흔적 > 코딩테스트' 카테고리의 다른 글
| [구현] (3-3) list reverse의 마법 [:: -1] (0) | 2024.06.18 |
|---|---|
| [구현] (3-2) 숫자만 추출 (0) | 2024.06.18 |
| [구현] (3-6) 격자판의 합 : 한 iteration 최대한 써먹기 (0) | 2024.06.17 |
| [two pointer] (3-5) list의 구간을 두개의 포인터로, 시간복잡도 줄이기 (0) | 2024.06.17 |
| [구현] (2-10) 연속점수 계산 (1) | 2024.06.14 |