코딩테스트[파이썬]/알고리즘 문제풀이 입문

[탐색&시물레이션] - 격자판 회문수

softmoca__ 2024. 2. 6. 15:28
목차

격자판 회문수

1부터 9까지의 자연수로 채워진 7*7 격자판이 주어지면 격자판 위에서 가로방향 또는 세로방향으로 길이 5자리 회문수가 몇 개 있는지 구하는 프로그램을 작성하세요.

회문수란 121과 같이 앞에서부터 읽으나 뒤에서부터 읽으나 같은 수를 말합니다.

빨간색처럼 구부러진 경우(87178)는 회문수로 간주하지 않습니다.

입력설명
1부터 9까지의 자연수로 채워진 7*7격자판이 주어집니다.

출력설명

5자리 회문수의 개수를 출력합니다.

 

입력예제 1

2 4 1 5 3 2 6

3 5 1 8 7 1 7

8 3 2 7 1 3 8

6 1 2 3 2 1 1

1 3 1 3 5 3 2

1 1 2 5 6 5 2

1 2 2 2 2 1 5

출력예제 1

3

 

 

나의 코드

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


cnt=0
for i in range(7):
    for j in range(3):
        if arr[i][j]==arr[i][j+4] and arr[i][j+1]==arr[i][j+3]:
            cnt+=1
        if arr[j][i]==arr[j+4][i] and arr[j+1][i]==arr[j+3][i]:
            cnt+=1

print(cnt)

회문을 2개만 확인하면되어서 간단하게  규칙 찾아서 작성

 

 

정답코드

import sys
sys.stdin=open("input.txt", "r")
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)

#<회문의 길이가 가변적일 때 코드>
import sys
sys.stdin=open("input.txt", "r")
board=[list(map(int, input().split())) for _ in range(7)]
cnt=0
len=5
for i in range(3):
    for j in range(7):
        tmp=board[j][i:i+len]
        if tmp==tmp[::-1]:
            cnt+=1
        #tmp=board[i:i+5][j] 앞 행은 리스트가 아니라서 슬라이스가 안된다.
        for k in range(len//2):
            if board[i+k][j]!=board[len-k+i-1][j]:
                break;
        else:
            cnt+=1
        
print(cnt)

 

파이썬의 슬라이싱 연산을 사용해서 회문을 체크한 코드이다.

또한 세로 로직은 슬라이싱 연산이 안되기 때문에 나의 코드와 같은 로직으로 체크 하였다.

 

가독성이 좋고 이해하기 좋은 코드는 나의 코드인것 같다.