본문 바로가기

Algorithm/Python

021 - 격자판 회문수

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

 

 

#import sys
#sys.stdin = open('in.txt', 'rt')

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

cnt = 0
for i in range(7):
    for j in range(3):
        for k in range(2):
            if a[i][j+k] != a[i][j+4-k]:
                break
        else:
            cnt += 1
        # 하나의 for문으로 가로/세로 모두 처리 가능.
        for k in range(2):
            if a[j+k][i] != a[j+4-k][i]:
                break
        else:
            cnt += 1
print(cnt)

 

 

다른 방식으로 풀이(for문 대신에 역 슬라이스와 제너레이터를 이용하여 풀기)

 

#import sys
#sys.stdin = open('in.txt', 'rt')

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

cnt = 0
for i in range(7):
    for j in range(3):
        # for문 또는 역슬라이스 방식 비교 코딩
        tmp = a[i][j:j+5]
        if tmp == tmp[::-1]:
            cnt += 1
        # for k in range(2):
        #     if a[i][j+k] != a[i][j+4-k]:
        #         break
        # else:
        #     cnt += 1
        
        # if all & 제너레이터 또는 for문 방식 비교 코딩
        if all(a[j+k][i] == a[j+4-k][i] for k in range(2)):
            cnt += 1
        # for k in range(2):
        #     if a[j+k][i] != a[j+4-k][i]:
        #         break
        # else:
        #     cnt += 1
print(cnt)

 

 

if all 에서 사용한 for 문이 제너레이터인지 확인하는 방법

 

 

 

 

 

'Algorithm > Python' 카테고리의 다른 글

023 - 랜선자르기(결정알고리즘)  (0) 2023.08.09
022 - 이분검색  (0) 2023.08.09
020 - 스도쿠 검사  (0) 2023.08.09
019 - 봉우리  (1) 2023.08.09
018 - 곳감(모래시계) 합계  (0) 2023.08.08