파이썬 알고리즘 021 | 격자판 회문수

Yunny.Log ·2021년 1월 9일
0

Algorithm

목록 보기
21/318
post-thumbnail

21.격자판 회문수

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

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

빨간색처럼 구부러진 경우(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

<내 풀이>

a=[list(map(int, input().split())) for _ in range(7)]
cnt=0
for i in range(7) :
    for j in range(3) :
        if a[i][j]==a[i][j+4] and a[i][j+1]==a[i][j+3] :
            cnt+=1
        elif a[j][i]==a[j+4][i] and a[j+1][i]==a[j+3][i]:
            cnt+=1
print(cnt)
    

전반적으로 평이했다, 예전에 배운 개념을 적용하는 것
그런데 열끼리 비교하는 것이 헷갈렸었다. 제대로 정리하고 가자

<풀이>

a=[list(map(int, input().split())) for _ in range(7)]
cnt=0
for i in range(3) :
    for j in range(7) :
        tmp=a[j][i:i+5] #행비교
        if tmp==tmp[::-1] :
            cnt+=1
        for k in range(2) :
            if a[i+k][j] != a[i+5-k-1][j] :
                break
        else :
            cnt+=1
print(cnt)

<반성점>

  • 리스트 역순 [::-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
    에서 행은 하나의 리스트라 슬라이싱이 가능하지만
    열은 따로의 리스트기때문에 슬라이싱이 불가능하다

<배운 점>

  • 행 : a[i][j]

  • 열 : a[j][i]

  • 입력이 줄바꿈으로 여러 줄 입력되어있는 것을 리스트로 받아 정수형으로 바꿔주는 법:

import sys
lst=sys.stdin.readlines()
lst=[int(i) for i in lst]
  • sys.stdin.readlines()는 일반적인 입력 함수인 input()보다 속도가 빠르다고 한다. 그런데 문자열이 필요한 경우 입력받은 각각의 요소에 개행(\n)이 붙어있으므로 끝에 .rstrip()을 붙여준다.

0개의 댓글