SWE 4861 회문
공부한 내용
2차원리스트로 회문을 찾으려니, 노트에 아무리 써봐도 잘 되지 않았다. 회문의 방법에 대해서 찾아보니 여러가지 방법들이 나오더라.
- 반복문으로 문자 검사하기
word = input('단어를 입력하세요: ')
is_palindrome = True # 회문 판별값을 저장할 변수, 초깃값은 True
for i in range(len(word) // 2): # 0부터 문자열 길이의 절반만큼 반복
if word[i] != word[-1 - i]: # 왼쪽 문자와 오른쪽 문자를 비교하여 문자가 다르면
is_palindrome = False # 회문이 아님
break
print(is_palindrome) # 회문 판별값 출력
- 시퀀스 뒤집기로 문자 검사하기
word = input('단어를 입력하세요: ')
print(word == word[::-1]) # 원래 문자열과 반대로 뒤집은 문자열을 비교
- list와 reversed 사용하기
word = 'level'
list(word) == list(reversed(word))
True
- 문자열의 join 메서드와 reversed 사용하기
word = 'level'
word == ''.join(reversed(word))
True
알게된 내용
print(sorted(newList, reverse=True))
이렇게 사용하면, 역순으로 정렬된 채 정렬이 된다. 즉 뒤집는게 아니다.
그래서 reversed() 주의해야할 건
list(reversed(newList))
이와 같이 list로 다시 만들어줘야 한다.
reversed는 reversed 객체를 반환하기 때문이다.
따라서 list로 다시 만들어줘야한다.
코드
T = int(input())
for tc in range(1, T + 1):
# 입력 받기
N, M = map(int, input().split())
list1 = [[0]*N for i in range(N)]
for i in range(N):
str1 = input()
for j in range(N):
list1[i][j] = str1[j]
# 회문 계산 - 가로
# 인덱스 계산이 헷갈려서 N이 5고 M이 3이라고 가정하고 생각했다
for i in range(N):
result1 = []
flag = False # 이중 반복문 나갈려고 만들었다
for j in range(N-M+1): # N이 5고 M이 3일 때, 반복은 3번 일어난다, (123,234,345)
newList = []
for k in range(M):
newList.append(list1[i][j+k]) # 새로운 검사할 리스트에 더해서 새로운 리스트 만들고
if len(newList) == M and newList == list(reversed(newList)): # 뒤집은 것과 일치하는지. 즉 회문인지 검사
result1 += newList
flag = True
break
if(flag == True):
break
# 회문 계산 세로
for i in range(N):
flag = False
result2 = []
for j in range(N-M+1):
newList = []
for k in range(M):
newList.append(list1[j+k][i])
if len(newList) == M and newList == list(reversed(newList)):
result2 += newList
flag = True
break
if(flag == True):
break
if(result1 == []):
result = result2
else:
result = result1
print("#%s" % tc, end=" ")
for i in range(M):
print(result[i], end="")
print()
완료 후
여러가지 방법이 있을 수 있다. 애초에 이차원 리스트로 만들지 않고 문자열을 입력받은 걸 리스트에 저장한 뒤, 할 수는 없었을까? -> 세로로 할 때, 방향만 잘 잡았으면 가능했을 지도 모른다.
참고자료 [코딩도장 회문]https://dojang.io/mod/page/view.php?id=2331 [이중for문 빠져나가기]http://www.gamecodi.com/board/zboard.php?id=GAMECODI_Talkdev&no=2126