[SWEA] 1215. [S/W 문제해결 기본] 3일차 - 회문1

야금야금 공부·2023년 4월 28일
0

SWEA

목록 보기
6/43
post-thumbnail

1215. [S/W 문제해결 기본] 3일차 - 회문1


문제 풀이

직선으로만 이동해야해서 '옆으로 가는 경우'와 '아래로만 가는 경우'로 구분하였다.

import sys
from collections import deque
sys.stdin = open("input.txt", "r")

for i in range(1, 11):

    n = int(input())

    arr = [list(input()) for _ in range(8)]
    cnt = 0
    queue = deque()


    def rotation(x, y, k1, k2):
        global sen, cnt
        queue.append([x, y])

        while queue:
            a, b = queue.popleft()
            sen += arr[a][b]           # 문자열 생성
            dx, dy = a + k1, b + k2

            if len(sen) == n:          # 문자열 sen이 길이 n과 같아질 경우
                if sen == sen[::-1]:   # 문자열 sen이 회문일 경우, cnt + 1
                    cnt += 1
                return

            if 0 <= dx < 8 and 0 <= dy < 8:
                queue.append([dx, dy])
                

    for j in range(8):
        for k in range(8):
            sen = ""
            rotation(j, k, 0, 1)   # 오른쪽 옆으로 가는 경우

    for j in range(8):
        for k in range(8):
            sen = ""
            rotation(j, k, 1, 0)  # 아래로 가는 경우


    print(f"#{i} {cnt}")

다른 풀이 코드

for i in range(10):
    N = int(input())
    List = list(input() for _ in range(8))
    ans = 0
    
    # 가로 확인
    for y in range(8):
        for x in range(8-N+1):    # 가로 길이 8 - N + 1까지만 확인
            A = List[y][x:x+N]
            if A == A[::-1]:
                ans += 1
 
    # 세로 확인
    for y in range(8-N+1):        # 세로 길이 8 - N + 1까지만 확인
        for x in range(8):
            A = ''
            for z in range(N):    # 세로 길이를 N만큼만 확인
                A += List[y+z][x]
            if A == A[::-1]:
                ans += 1    
                
    print("#{} {}".format(i+1, ans))


참고 블로그

0개의 댓글