본문 바로가기
Problem Solving/SWEA

[SWEA|파이썬] 1215. [S/W 문제해결 기본] 3일차 - 회문1 (D3)

by 청량리 물냉면 2023. 5. 8.
반응형
문제

https://tinyurl.com/2zua4dgn

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

 

🐍파이썬
T = 10
for test_case in range(1, T+1):
    letter = int(input())
    pan = [list(input()) for _ in range(8)]
    cnt = 0
    #가로(행이동)
    for r in range(8):
        #회문 생성 횟수
        for c in range(8-letter+1):
            #회문 길이만큼 슬라이싱
            if pan[r][c:c+letter] == pan[r][c:c+letter][::-1]:
                cnt += 1
    #세로(열이동)
    for c in range(8):
        for r in range(8-letter+1):
            char = ''
            #r번째 행부터 회문의 길이에 해당하는 회문을 char에 넣기
            for r2 in range(r, r+letter):
                char += pan[r2][c]
            if char == char[::-1]:
                cnt += 1
    print("#{} {}".format(test_case, cnt))

행과 열을 바꾸어 새로운 배열을 만들어 내어 풀이 진행

import math

for test_case in range(1, 11):
    answer = 0
    hoi = int(input())
    pan = []
    
    for i in range(8):
        pan.append(list(input().rstrip()))
    pan2 = list(zip(*pan))	#pan의 행과 열을 바꾼 배열
    
    for i in range(8):
        for j in range(9-hoi):
            p_list = pan[i][j:hoi + j]	#pan1의 hoi개 글자 선택(가로 확인)
            p_list2 = pan2[i][j:hoi + j]	#pan1의 hoi개 글자 선택(세로 확인)
            start = 0	#글자를 가리킬 포인터(시작)
            end = hoi - 1	#글자를 가리킬 포인터(마지막 글자)
            
            #비교횟수
            #홀수면 hoi//2+1이고 짝수면 hoi//2번 확인해야 하므로 
            #hoi/2를 반올림한 만큼 비교하도록 처리
            for _ in range(int(math.ceil(hoi/2))):	
                if p_list[start] != p_list[end]:	#동일한 글자가 아니면 회문이 아님
                    break
                start += 1
                end -= 1	#포인터를 옮겨가며 확인
            else:	#for문을 진행하는 동안 break되지 않은 경우 해당 문자열은 회문
                answer += 1

            start2 = 0
            end2 = hoi - 1
            for _ in range(int(math.ceil(hoi/2))):
                if p_list2[start2] != p_list2[end2]:
                    break
                start2 += 1
                end2 -= 1
            else:
                answer += 1

    print("#{} {}".format(test_case, answer))

 

💡 행과 열 바꾸기

pan2 = list(zip(*pan))

 

pan = [['C', 'B', 'B', 'C', 'B', 'A', 'A', 'B'], 

['C', 'C', 'C', 'B', 'A', 'B', 'C', 'B'], 

['C', 'A', 'A', 'A', 'A', 'C', 'A', 'B'], 

['B', 'A', 'C', 'C', 'C', 'C', 'A', 'C'], 

['A', 'A', 'B', 'C', 'B', 'B', 'A', 'C'], 

['A', 'C', 'A', 'A', 'C', 'A', 'B', 'C'], 

['B', 'C', 'C', 'B', 'A', 'A', 'B', 'C'], 

['A', 'B', 'B', 'B', 'C', 'C', 'A', 'A']]

 

pan2 =  [('C', 'C', 'C', 'B', 'A', 'A', 'B', 'A'), 

('B', 'C', 'A', 'A', 'A', 'C', 'C', 'B'), 

('B', 'C', 'A', 'C', 'B', 'A', 'C', 'B'), 

('C', 'B', 'A', 'C', 'C', 'A', 'B', 'B'), 

('B', 'A', 'A', 'C', 'B', 'C', 'A', 'C'), 

('A', 'B', 'C', 'C', 'B', 'A', 'A', 'C'), 

('A', 'C', 'A', 'A', 'A', 'B', 'B', 'A'), 

('B', 'B', 'B', 'C', 'C', 'C', 'C', 'A')]

 

👇 리스트 조작법 더 알아보기

https://tinyurl.com/2nhrr6nn

 

python__[2차원 리스트 90도 회전, 행과 열 바꾸기]

가끔 코딩테스트 문제를 풀다보면, 약간의 트릭? 기술?을 쓰면 편한 부분들이 있다.오늘 작성하는 부분들이 바로 그런 것들이다. 알면 너무 편하고, 모르면 쌉고생하는 것들...바로 ㄱㄱ해보자lis

velog.io

 

반응형