일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- Bookmark
- join()
- Algorithm
- 북마크앱
- 알고리즘
- passport.js
- MYSQL
- python
- 독립영화플랫폼
- 장고 프로젝트
- 장고
- Node.js
- mongodb
- 프로젝트
- ART_Cinema
- 장고 개발 순서
- Django Blog
- 예술영화추천
- 자바스크립트
- 타사인증
- Exercism
- 장고 프로젝트 순서
- 북마크만들기
- 파이썬 웹프로그래밍 장고
- Blog
- til
- MyPick31
- Django
- 개발
- JavaScript
- Today
- Total
Juni_Dev_log
[탐색 및 시뮬레이션] 파이썬 알고리즘 문제 2-1 "회문 문자열 검사" 본문
[시간복잡도]
O(n)
: for문으로 코드를 돌리는 것이 제일 중요한 포인트이다.
해당 문자열을 반복해서 코드를 동작시키는 것이 핵심이다.
[공간복잡도]
O(1)
: 고정공간으로 사용하는 것은 n / 가변공간으로 사용하는 것은 string / string_cnt / check 를 사용한다.
Problem
회문 문자열 검사 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
💯 Solution ①
1
2
3
4
5
6
7
8
9
10
11
12
|
import sys
sys.stdin=open("input.txt","rt")
n=int(input())
for i in range(n):
string=input().lower()
if string == string[::-1]:
check="YES"
else:
check="NO"
print("#%d %s" %(i+1, check))
|
cs |
- for 문을 통해서 위에서 보여지는 갯수만큼 반복문을 돈다.
- 대문자/소문자 구분을 하면 안되기 때문에 다 소문자화시킨다. => lower()
- string 과 string[::-1] 이 똑같다면, 해당 문자열은 "회문 문자열"에 해당한다.
- 똑같다면, check 변수에 "YES" 를 담고, 다르다면, check 변수에 "NO"를 담는다.
- 출력양식에 맞춰서 출력을 한다.
💯 Solution ②
: Tutor님의 Code
① for 문을 사용해서 작성
: 여기서 제일 포인트는,
(1) for j in range(size//2) : size로 반복을 하는 것이 아니라, size//2로 해서 반복문을 최소화한다는 것
(2) if s[j] != s[-1-j] 를 통해서, 제일 앞부터 제일 뒤까지 비교하는 if문을 만든다.
코드를 설명해야하는 자리에세는 해당코드가 더 좋은 코드임.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
import sys
sys.stdin=open("input.txt","r")
n=int(input())
for i in range(n):
s=input()
s=s.upper()
size=len(s)
# size를 다 볼 필요가 없음 절반만 보면 된다! 5개일 경우 2번만 비교하면 됨
for j in range(size//2):
# ex) level => s[j]=l (앞쪽) , s[-1-j]=l (뒤쪽)
if s[j]!=s[-1-j]:
print("#%d NO" %(i+1))
break
# for문을 정상적으로 끝낸다면, else문을 탄다.
else:
print("#%d YES" %(i+1))
|
cs |
② 문자열 슬라이싱을 이용한 방법
: 나의 코드와 비슷한 형태
1
2
3
4
5
6
7
8
9
10
11
|
import sys
sys.stdin=open("input.txt","r")
n=int(input())
for i in range(n):
s=input()
s=s.upper()
if s==s[::-1]:
print("#%d YES" %(i+1))
else:
print("#%d NO" %(i+1))
|
cs |
📚 참고
'CodingTest > 인프런 (Algorithm)' 카테고리의 다른 글
[탐색 및 시뮬레이션] 파이썬 알고리즘 문제 2-3 "카드 역배치" (0) | 2021.02.22 |
---|---|
[탐색 및 시뮬레이션] 파이썬 알고리즘 문제 2-2 "숫자만 추출" (0) | 2021.02.22 |
(인프런) 파이썬 알고리즘 문제1-10 "점수 계산" (0) | 2021.02.21 |
(인프런) 파이썬 알고리즘 문제1-9 "주사위 게임" (0) | 2021.02.19 |
(인프런) 파이썬 알고리즘 문제1-8 "뒤집은 소수" (0) | 2021.02.18 |