문제
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14QpAaAAwCFAYi
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
풀이
단순 무식하게 전체를 검사하면 된다.
하나의 행에 회문이 몇개인지, 하나의 열에 회문의 몇개인지 3중 for문을 사용해 가로 한번 세로 한번 카운트해서 풀었다.
리팩터링은 다음과 같이 진행했다.
- list(zip(*wordBoard))를 사용해 전치한 행렬을 생성하여 사용하기
- 문자가 회문인지 검사할때는 절반만 검사하기
- isPalindrome 플래그 대신 all()을 사용하여 모두 만족하는지 검사하기
최초 정답 코드
T = 10
for i in range(T):
palindromeLen = int(input())
wordBoard = list(list(input()) for _ in range(8))
answer = 0
for y in range(8):
for startIdx in range(8-palindromeLen+1):
isPalindrome = True
for x in range(palindromeLen):
if wordBoard[y][startIdx+x] != wordBoard[y][startIdx+(palindromeLen-1-x)]:
isPalindrome = False
break
if isPalindrome:
answer+=1
for x in range(8):
for startIdx in range(8-palindromeLen+1):
isPalindrome = True
for y in range(palindromeLen):
if wordBoard[startIdx+y][x] != wordBoard[startIdx+(palindromeLen-1-y)][x]:
isPalindrome = False
break
if isPalindrome:
answer+=1
print(f"#{i+1} {answer}")
리팩터링 정답 코드
T = 10
for i in range(T):
palindromeLen = int(input())
wordBoard = list(list(input()) for _ in range(8))
wordBoardT = list(zip(*wordBoard))
answer = 0
for line in (wordBoardT + wordBoard):
for start in range(8 - palindromeLen + 1):
if all(line[start + i] == line[start + (palindromeLen - 1 - i)] for i in range(palindromeLen // 2 + 1)):
answer += 1
print(f"#{i+1} {answer}")
'알고리즘 > SWEA' 카테고리의 다른 글
[SWEA/Python] 1289번. 원재의 메모리 복구하기 (D3) (0) | 2024.11.13 |
---|---|
[SWEA/Python] 21425번. += (D2) (0) | 2024.11.12 |
[SWEA/Python] 1954번. 달팽이 숫자 (D2) (0) | 2024.11.12 |