[알고리즘] 격자판 회문수

(문제) 격자판 회문수


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

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



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

입력설명

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

출력설명

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

테스트케이스

입력예제 출력예제
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
3
4 7 9 7 7 3 9
2 8 4 8 4 4 4
6 1 2 1 8 9 4
7 7 7 5 3 6 8
5 5 7 2 4 7 7
3 2 7 7 1 7 1
3 7 2 5 9 8 4
1
5 4 8 6 4 1 2
5 4 1 1 1 4 4
4 5 4 7 4 7 4
3 2 3 7 7 4 8
4 6 2 6 4 8 5
3 1 9 6 1 5 3
4 8 7 2 8 9 2
5
4 1 6 1 2 5 8
2 2 2 5 4 5 2
9 7 8 7 7 4 8
9 9 4 9 7 5 6
2 4 9 3 6 7 4
1 5 8 7 4 8 9
8 4 6 7 4 3 5
1
9 6 3 3 3 6 8
3 8 6 6 7 6 6
7 2 2 6 3 8 1
4 2 8 2 8 9 3
7 7 6 1 9 6 1
7 3 7 2 3 5 6
4 3 6 6 4 6 6
5

해결방법

방법 1 : 행렬 뒤집기

행을 기준으로 행의 마지막 까지 반복문을 돌려서 회문인지 판단을 한다.



판단을 마치면 행과 열의 위치를 바꿔서 다시 반복문을 돌려서 회문을 판단한다.




방법 2 : 회문 판결 슬라이싱 + 회문 판결 각 인덱스


각 리스트의 열들만 따로 슬라이싱 하여 만들지 못하니(파랑색) 회문 판결의 열의 각 행의 인덱스를 직접 접근하여 활용


방법 3 : 회문 판결 각 인덱스


각 리스트의 행들 기준으로 한번 돌고 열들 기준으로도 한번 돌면서 확인을 하는 방법


코드 방법 1

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

count = 0

# 행 반복
for i in range(7):
    for j in range(7-5+1):
        if arr[i][j:j+5] == list(reversed(arr[i][j:j+5])):
            count = count + 1

# 행열 뒤집기
arr = [[arr[i][j] for i in range(7)] for j in range(7)]

# 행 반복
for i in range(7):
    for j in range(7-5+1):
        if arr[i][j:j+5] == list(reversed(arr[i][j:j+5])):
            count = count + 1

print(count)

코드 방법 2

for i in range(7-5+1):
    for j in range(7):
        # 5개
        temp = arr[j][i:i+5]
        if temp == temp[::-1]:
            count = count + 1
        for k in range(2):
            # 회문이 아닐 경우
            # i+5 -> 끝 숫자 / -k 뒤쪽에서 오기 / -1 은 +5 한 인덱스 때문에
            if arr[i+k][j] != arr[i+5-k-1][j]:
                break
        else:
            count = count + 1

print(count)

코드 방법 3

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

count = 0

for i in range(7):
    for j in range(7-5+1):
        # 앞뒤 확인
        for k in range(5//2):
            # 만약 앞에와 위에가 틀릴 경우
            # 가로
            if arr[i][j+k] != arr[i][j+5-k-1]:
                break
        else:
            count = count + 1

        for k in range(5//2):
            # 만약 앞에와 위에가 틀릴 경우
            # 세로
            if arr[j+k][i] != arr[j+5-k-1][i]:
                break
        else:
            count = count + 1

print(count)

댓글남기기