본문 바로가기
공부-코딩테스트/코테풀이 - 자바, 파이썬

1216. [S/W 문제해결 기본] 3일차 - 회문2 (코딩테스트, SW Expert Academy)

by 령과 2022. 5. 5.

문제

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14Rq5aABUCFAYi 

 

SW Expert Academy

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

swexpertacademy.com

 


나의 코드 : 41분23초

def check_answer(target):#내가 짠 함수, 사용시 11초안에 클리어 ->비효율적
    return list(target)==list(reversed(target))

# def check_answer(lst): #다른사람 코드보고 끌어옴 사용시 3.8초안에 클리어
#     for i in range(len(lst)//2):
#         if lst[i]!=lst[-i-1]:
#             return False
#     return True

def stop_answer(table,test_case):
    table_size= 100
    for check_len in range(table_size,0,-1): #100 ~~1 까지
        for a,b in zip(table,zip(*table)):
            b="".join(b)
            for i in range((table_size+1)-check_len):#처음에는 1이 됨 i=0
                if check_answer(a[i:i+check_len]) or check_answer(b[i:i+check_len]):
                    print("#"+str(test_case),check_len)
                    return


for test_case in range(1, 11):
    T = int(input())
    table = []
    for j in range(100):
        table.append(input())
    stop_answer(table,test_case)

제일 하단 부분에 test_case를 1~10번까지 반복하며 table을 만들어서 stop_answer을 실행시킨다.

 

zip(table,zip(*table))같이 복잡하게 for문을 실행하는데 길이가 n인 경우 두번 반복하는 것을 방지하기 위해 사용하였다.

 

길이가 100인 문자열부터 탐색한다고 가정하면 가로 100개의 문자열과 세로 100개의 문자열을 회문인지 판단해야 한다.

하지만 한번 위와같이 zip을 사용함으로써 한번 for문으로 가로, 세로 전체를 조사할 수 있게된다.

단 zip(*table)의 결과는 튜플이기 때문에 reversed()가 먹히지 않으므로 b를 문자열로 만드는 작업이 필요해진다.

나머지는 그냥 생각을 그대로 구현한 것이다.


느낀점

코딩테스트 연습하는 것을 살짝 바꿨다. 

평소 사용하는 개발툴을 사용해서 문제를 해결하였다. 

VSCODE에서 문제를 해결하고 복사해서 붙여넣기를 하면서 코딩테스트를 보는데 확실히 익숙하면서 편했다.

해결방법을 생각하는데는 오래걸리지 않으나 이를 구현할 때 아직도 리스트 인덱스를 다루는데 어려움을 겪는 중

댓글