일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- python
- dataframe
- Join
- 프로그래머스
- Algorithm
- 알고리즘스터디
- openCV
- String Method
- 백준
- 알고리즘 스터디
- 선그래프
- aws jupyter notebook
- javascript
- 알고리즘
- 가상환경
- 파이썬
- 코딩테스트
- Stack
- NumPy
- 데이터시각화
- pandas
- MySQL
- Matplotlib
- Selenium
- 노마드코딩
- programmers
- queue
- type hint
- 정보처리기사 c언어
- 자료구조
- Today
- Total
조금씩 꾸준히 완성을 향해
[Algorithm] 기초 문제 / 회문 문자열 검사 본문
▶ 문제
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
▷ 내가 짠 코드
회문 문자열은 아주 기초적인 구현이면서 또 여러가지 방법들이 존재한다.
그 내가 짤 수 있는 방법들로 코드를 짜보았다.
import sys
sys.stdin = open('input.txt', 'rt')
n = int(input())
for i in range(n):
a = input().upper()
if a == a[::-1] :
print(f'#{i+1} YES')
else:
print(f'#{i+1} NO')
가장 짧고 간단하게 비교할 수 있는 게 슬라이싱을 이용한 a == a[::-1] 이다.
a[::-1] 이란 a 문자열 전체를 뒤에서부터 거꾸로 출력하는 코드이다.
for i in range(n):
a = input().upper()
reversed_a = ''.join(reversed(a))
if a == reversed_a :
print(f'#{i+1} YES')
else:
print(f'#{i+1} NO')
그 다음으로 생각해 볼 수 있는 게 reversed() 함수이다.
reversed() 함수를 사용하면 'reversed' 객체가 반환되기 때문에 문자열로 사용하기 위해선 join() 함수로 변환해 줘야 한다.
for i in range(n):
s = input().upper()
reversed_s =''
for j in s:
reversed_s = j + reversed_s
if s == reversed_s:
print(f'#{i+1} YES')
else:
print(f'#{i+1} N0')
이건 간편한 함수들을 사용하지 않고 짜 본 코드다.
for 문을 돌려 글자를 하나씩 떼서 왼쪽 끝으로 붙이면 완성된다.
▷ 예시 코드
import sys
sys.stdin = open('input.txt', 'rt')
n = int(input())
for i in range(n):
s = input().upper()
size = len(s)
for j in range(size//2) :
if s[j] != s[-1-j]:
print(f'#{i+1} NO')
break
else:
print(f'#{i+1} YES')
예시 코드 중에 내가 생각해 보지 못한 코드가 있어서 가져와 보았다.
회문 문자열은 가운데를 기준으로 좌우 대칭이 되는 문자열이다. 그래서 대칭이 되는 위치의 문자들이 같은지 확인하는 방식으로 문제를 풀 수 있다.
문자열 길이를 2로 나눈 몫까지만 for 문을 돌리는 이유는 좌를 기준으로 좌우를 비교하는 코드를 작성하기 위해서이다.
앞에서 시작하는 index를 뒤에서 시작하는 마이너스 index와 짝을 맞추어 비교를 하고, 같지 않다면 NO를 출력 한 후 멈춘다. 살아 남은 문자들은 대칭이 맞는 문자라는 뜻이기 때문에, for 문이 끝난 후 Yes로 출력한다.
for - else 문은 많이 사용해 보지 않아서 조금 낯선 감이 있다. 이번에 잘 기억해 놨다가 다음 번엔 응용할 수 있게 노력해야 겠다.
마지막으로, 이 문제와 비슷한 방법으로 해결할 수 있는 문제가 있어 첨부한다.
https://allsound.tistory.com/42
'DataStructure & Algorithm > 문제풀이' 카테고리의 다른 글
[Algorithm] 기초 문제 / 카드 역배치 (0) | 2022.09.06 |
---|---|
[Algorithm] 기초 문제 / 숫자만 추출 (0) | 2022.09.06 |
[Algorithm] 백준 2480번 주사위 세 개 with Python (0) | 2022.09.05 |
[Algorithm] 기초 문제 / 점수 계산 (0) | 2022.09.05 |
[Algorithm] 기초 문제 / 뒤집은 소수 (0) | 2022.09.05 |