SWE(4861)_회문

SWE 4861 회문

공부한 내용

2차원리스트로 회문을 찾으려니, 노트에 아무리 써봐도 잘 되지 않았다. 회문의 방법에 대해서 찾아보니 여러가지 방법들이 나오더라.

  1. 반복문으로 문자 검사하기
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)                 # 회문 판별값 출력
  1. 시퀀스 뒤집기로 문자 검사하기
word = input('단어를 입력하세요: ')

print(word == word[::-1])    # 원래 문자열과 반대로 뒤집은 문자열을 비교
  1. list와 reversed 사용하기
 word = 'level'
list(word) == list(reversed(word))
True
  1. 문자열의 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

0%