1216. [S/W 문제해결 기본] 3일차 - 회문2

기록하는 용도·2022년 5월 17일
0

생각했던 방법
1. 문자열로 100줄을 받아서 board라는 리스트에 넣어주었다.
2. 가로/세로로 나누어 판별할수 있도록 for문을 각자 만들어주었다.
3. 가로중에서도 0행 100열, 0행 99열, 0행 98열 식으로 행을 앞에서 고정하는 for문과 0행 100열 1행 100열 2행 100열 식으로 열을 고정하는 for문을 각각 만들어서 회문을 발견하면 그 줄을 벗어날 수 있도록 break를 걸어주었다.
4. 세로줄에서는 가로 for문에서 사용했던 슬라이싱을 할 수 없으므로 다른 방식으로 k라는 문자열을 만들고 k를 가지고 슬라이싱 했다.

이번 문제는 시간이 넉넉해서 다행히 통과했지만, ide에서 사용할때마저 속도가 늦는다는 것을 스스로 느껴서 이에 대해서 고민해보고 다른 풀이를 보면서 공부가 필요하다.

for i in range(10):
    num = int(input())
    board = [input() for _ in range(100)]
    
    max_len = 0
    for k in range(100):
        for a in range(100):
            for b in range(100,-1,-1):
                string = board[k][a:b]
                if string[:] == string[::-1]:
                    if max_len < len(string):
                        max_len = len(string)
                    break   


    for k in range(100):
        for a in range(100,-1,-1):
            for b in range(100):
                string = board[k][b:a]
                if string[:] == string[::-1]:
                    if max_len < len(string):
                        max_len = len(string)
                    break     


    k=''
    for a in range(100):
        for b in range(100):
            k+=board[b][a]
 
        for j in range(100):
            for z in range(100,-1,-1):
                string = k[j:z]
                if string[:] == string[::-1]:
                    if max_len < len(string):
                        max_len = len(string)
                    break
        for j in range(100,-1,-1):
            for z in range(100):
                string = k[j:z]
                if string[:] == string[::-1]:
                    if max_len < len(string):
                        max_len = len(string)
                    break


        k=""

    print("#{} {}".format(i+1,max_len))

# string = 'cbabbccc'
# print(string[0:7])

다른 풀이
1. 입력을 받아 리스트 형식으로 만든다.
2. 전치 행렬을 zip을 통해 만든다.
가령 4x4 형식의 리스트를 만든다면
arr = [['a','b','c','d'], ['b','c','c','a'],['a','a','c','c'],['a','b','c','d']]
에 대한 전치 행렬은
[('a','b','a','a'),('b','c','a','b'),('c','c','c','c'),('d','a','c','d')]
가 되는 것이고 이에 대한 방법은

arr2 = list(zip(*arr))

이다.

여기서 zip의 사용법은 이렇다.

a = [1,2,3,4]
b = [1,3,5,7]
c = [2,4,6,8]

print(zip(a,b,c))

할 시에는 zip object 주소 값만 만든다. 이 때

print(list(zip(a,b,c))

로 묶어서 튜플로 보내 줄 수 있다 -> ([1,1,2], [2,3,4], [3,5,6], [4,7,8])

*(list(zip(a,b,c))

는 unpack하는 것으로 list나 tuple을 풀어준다.

때문에

board = [list(input()) for _ in range(3)]
board2 = list(zip(*board))

이고 board에
abcd
efgh
가 입력으로 들어왔을때
board = [['a','b','c','d'], ['e','f','g','h]]
가 될 것이고,
board2는 board를 unpack해 ['a','b','c','d']['e','f','g','h']로 만들고 이를 zip해서
('a','e'), ('b','f'), ('c','g'), ('d','h')를 리스트로 만들어
[('a','e'), ('b','f'), ('c','g'), ('d','h')]의 모습을 띄게 되는 것이다.

  1. zip을 사용해 두 개의 리스트를 for문 돌린다.
for a, a2 in zip(board,board2):
	#a와 a2에 한 줄 씩 들어온다.
    #처음 돌때 현재 a=['a','b','c','d']이고 a2=('a','e')
    #여기 부분에서 회문인지 확인

0개의 댓글