[Algorithm] 격자판 회문수

myeonji·2022년 1월 26일
0

Algorithm

목록 보기
15/89
post-custom-banner

1부터 9까지의 자연수로 채워진 7*7 격자판이 주어지면 격자판 위에서 가로방향 또는 세로방향으로 길이 5자리 회문수가 몇 개 있는지 구하는 프로그램을 작성하세요.
회문수란 121과 같이 앞에서부터 읽으나 뒤에서부터 읽으나 같은 수를 말합니다.

<내 답안>

cnt = 0
li = [list(map(int, input().split())) for _ in range(7)]
for a in range(7):
    for i in range(0, 3):
        row = []
        col = []
        orirow =[]
        oricol =[]
        for j in range(0, 5):
            orirow.append(li[a][j + i])  # 원본으로 쓸 리스트
            oricol.append(li[j + i][a])  # 원본
            row.append(li[a][j+i])  # 역순으로 만들 리스트
            col.append(li[j+i][a])  # 역순
        row.reverse()
        col.reverse()

        for k in range(5):
            if orirow[k] != row[k]:
                break
        else:
            cnt += 1

        for k in range(5):
            if oricol[k] != col[k]:
                break
        else:
            cnt += 1


print(cnt)

인덱스를 0~4, 1~5, 2~6 이렇게 리스트로 담아서 reverse 하는 방법을 썼다.
처음에는 for 문에서

for j in range(0, 5):
            row.append(li[a][j+i])
            col.append(li[j+i][a]) 
        orirow = row
        oricol = col
        row.reverse()
        col.reverse()

이 방식으로 구현했는데 출력해보니 orirow, row 모두 역순으로 같은 리스트가 나왔다. row 리스트에 담고 그걸 orirow 리스트에 넣어두고 row 리스트만 역순으로 변경하려고 했다. 내 의도와는 다르게 왜 같은 리스트가 나올까 생각해보니 orirow = row 까지는 orirow를 출력하면 row 역순 없이 그대로 나온다. 하지만 다음 줄에서 row.reverse()를 하면 orirow = row 때문에 orirow도 row와 같이 움직여서(?) orirow까지 바뀌는 것이다.

<모범답안>

board = [list(map(int, input().split())) for _ in range(7)]
cnt = 0

for i in range(3):
    for j in range(7):
        # 행
        tmp = board[j][i:i+5]
        if tmp == tmp[::-1]:
            cnt += 1
        # 열 -> 슬라이스 이용할 수 없음
        for k in range(2):
            if board[i+k][j] != board[i+5-k-1][j]:
                break
        else:
            cnt += 1

print(cnt)

해설은 훨씬 간단했다. [::] 슬라이싱은 문자열만 되는 줄 알았는데 tmp 타입을 출력해보니 리스트이다. 슬라이싱은 리스트에서도 가능하다. [start:end] 또는 [start:end:step]로 쓸 수 있다. 따라서 board[j][i:i+5]는 i부터 (i+5)-1까지 해당이 된다. 추가로 [::-1]은 역순으로 만드는 슬라이싱이다!
행은 슬라이싱을 이용할 수 있지만 열은 슬라이싱을 이용할 수 없다. 따라서 첫번째 인덱스와 마지막 인덱스를 비교하는 방식으로 구현되어 있다. 그러면 역순이 되는지 확인할 수 있기 때문이다. 홀수이기 때문에 정 가운데 인덱스는 비교할 필요가 없다.

profile
DBA, 경제 그리고 고냥이
post-custom-banner

0개의 댓글