[알고리즘] 격자판 회문수
(문제) 격자판 회문수
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)
댓글남기기