Today, I will

[SWEA][파이썬] 회문, 파이썬에서 2차원 배열 deepcopy, .strip()을 통한 ValueError: invalid literal for int() with base 10 해결 본문

Computer Science/알고리즘

[SWEA][파이썬] 회문, 파이썬에서 2차원 배열 deepcopy, .strip()을 통한 ValueError: invalid literal for int() with base 10 해결

Lv.Forest 2023. 12. 3. 17:27

https://swexpertacademy.com/main/learn/course/subjectDetail.do?courseId=AVuPDN86AAXw5UW6&subjectId=AWOVGOEKqeoDFAWg#

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

💡 아이디어 세로 회문을 얻기 위해 행과 열을 바꿔주면 된다

  • 소요 시간: 2시간
  • 어려웠던 점: 파이썬 자체에 대한 이해도가 부족한 탓에 시간이 많이 소요됨. 슬라이싱으로 새로운 객체가 만들어지는 줄 알았으나, 2차원 배열에 대해서 deepcopy를 이용해야 함. 또한 요구한 입력값이 제대로 먹질 않아서 chat gpt에 물어보니 arr = list(input().strip())과 같이 .strip()을 써야한다 하여서 겨우 pass를 받음. 
입력
3
10 10
GOFFAKWFSM
OYECRSLDLQ
UJAJQVSYYC
JAEZNNZEAJ
WJAKCGSGCF
QKUDGATDQL
OKGPFPYRKQ
TDCXBMQTIO
UNADRPNETZ
ZATWDEKDQF
10 10
WPMACSIBIK
STWASDCOBQ
AMOUENCSOG
XTIIGBLRCZ
WXVSWXYYVU
CJVAHRZZEM
NDIEBIIMTX
UOOGPQCBIW
OWWATKUEUY
FTMERSSANL
20 13
ECFQBKSYBBOSZQSFBXKI
VBOAIDLYEXYMNGLLIOPP
AIZMTVJBZAWSJEIGAKWB
CABLQKMRFNBINNZSOGNT
NQLMHYUMBOCSZWIOBINM
QJZQPSOMNQELBPLVXNRN
RHMDWPBHDAMWROUFTPYH
FNERUGIFZNLJSSATGFHF
TUIAXPMHFKDLQLNYQBPW
OPIRADJURRDLTDKZGOGA
JHYXHBQTLMMHOOOHMMLT
XXCNJGTXXKUCVOUYNXZR
RMWTQQFHZUIGCJBASNOX
CVODFKWMJSGMFTCSLLWO
EJISQCXLNQHEIXXZSGKG
KGVFJLNNBTVXJLFXPOZA
YUNDJDSSOPRVSLLHGKGZ
OZVTWRYWRFIAIPEYRFFG
ERAPUWPSHHKSWCTBAPXR
FIKQJTQDYLGMMWMEGRUZ
출력
#1 JAEZNNZEAJ
#2 MWOIVVIOWM
#3 TLMMHOOOHMMLT

 

.strip()

오류의 원인을 찾지 못하다가 chat gpt의 대답을 통해 깨우치게 되었다.

Traceback (most recent call last):
  File "/Users/abc/Documents/study/algo/test3.py", line 4, in <module>
    n,m = map(int, input().split())
ValueError: invalid literal for int() with base 10: 'WPMACSIBIK'

Traceback (most recent call last):
  File "/Users/abc/Documents/study/algo/test3.py", line 2, in <module>
    T = int(input())
ValueError: invalid literal for int() with base 10: ''

에러 메시지인 ValueError: invalid literal for int() with base 10: 입력에서 정수로 변환할 수 없는 값이 있다. ''는 비어있는 문자열을 정수로 변환하려고 시도했을 때 발생하는 오류. 즉 나의 경우 i = int(input())로 정수를 입력받고 있는데, 입력값이 숫자가 아니거나 비어있을 경우였기에 이런 에러가 발생. 

파이썬 deepcopy

사용법은 해당 블로그에서 참고하였다.

https://velog.io/@heyoni/%EC%96%95%EC%9D%80%EB%B3%B5%EC%82%AC-%EA%B9%8A%EC%9D%80%EB%B3%B5%EC%82%AC-%EC%8A%AC%EB%9D%BC%EC%9D%B4%EC%8B%B1

 

[python] 얕은 복사, 깊은 복사 + 슬라이싱[:]

아주 최소한만 복사한다. 메모리에 생성되는 것이 아닌 '참조'만 복사한 것을 의미한다.mutable한 객체일 경우에 같은 주소를 바라보게 된다. 슬라이싱과 헷갈릴 수 있으므로 예제를 살펴보자.b = a

velog.io

 

import copy
T = int(input())
for _ in range(T):
    n,m = map(int, input().split())
    board = []
    isValid = False

    for k in range(n):
        arr = list(input().strip())
        board.append(arr)

        # 가로 회문 확인
        for kk in range(len(arr)-m+1):
            if isValid:
                break
            temp = arr[kk:m+kk]
            if temp == temp[::-1]:
                isValid = True
                answer = ''.join(temp)
                print(f'#{_+1} {answer}')
    # 세로 회문 확인
    if not isValid:
        new_board = copy.deepcopy(board)
        # new_board 생성
        for ids in range(len(board)):
            row_list = board[ids]
            for idx, g in enumerate(row_list):
                new_board[idx][ids] = board[ids][idx]
        for new_k in range(len(new_board)):
            if isValid:
                break
            new_arr = new_board[new_k]
            for new_kk in range(len(new_arr) - m + 1):
                temp = new_arr[new_kk:m + new_kk]
                if temp == temp[::-1]:
                    isValid = True
                    answer = ''.join(temp)
                    print(f'#{_+1} {answer}')
                    break