문제 바로가기
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
나의 코드 및 설명
for test_case in range(1, 11):
t = int(input())
board = []
for _ in range(100):
board.append(list(input()))
garo_max_length = 0
for i in range(100): #세로 줄 만큼 반복
for j in range(100): #가로 줄 시작점
for k in range(j, 100): #가로 줄 끝나는점
garo_temp_list = board[i][j:k+1] #가로 줄 시작점 부터 끝나는점까지 리스트로 만든다
if garo_temp_list == garo_temp_list[::-1]: #뒤집어서 일치한다면
if garo_max_length < len(garo_temp_list): #회문의 길이를 저장한다.
garo_max_length = len(garo_temp_list)
for i in range(100): #가로 줄 만큼 반복
for j in range(100): #세로 줄 시작점
sero_temp_list = []
for k in range(j,100): #세로 줄 끝나는점
sero_temp_list += board[k][i] #세로 줄 시작점 부터 끝나는점까지 리스트로 만든다.
if sero_temp_list == sero_temp_list[::-1]: #뒤집어서 일치한다면
if sero_max_length < len(sero_temp_list): #회문의 길이를 저장한다.
sero_max_length = len(sero_temp_list)
print("#{} {}".format(test_case, max(garo_max_length,sero_max_length)))
다른 코드 및 설명
#2차원 리스트 가로, 세로 변환
def rotated(a):
n = len(a)
m = len(a[0])
result = [[""]*n for _ in range(m)]
for i in range(n):
for j in range(m):
result[j][i] = a[i][j]
return result
def palindrome(word, m):
for i in range(m//2):
if word[i] != word[-1-i]:
return False
return True
for test_case in range(1,11):
t = int(input())
board_garo = []
for _ in range(100):
board_garo.append(list(input()))
board_sero = rotated(board_garo)
ans = 1
flag = False
for m in range(100,1,-1):
for i in range(100):
for j in range(100-m+1):
if palindrome(board_garo[i][j:j+m], m) \
or palindrome(board_sero[i][j:j+m], m):
ans, flag = m, True
break
if flag:
break
if flag:
break
print("#{} {}".format(test_case, ans))
피드백
클린코드로 작성하도록 노력해야겠다. 나는 문자열을 일일이 만들어 뒤집은 후 비교하여 같다면 팰린드롬이고, 그 길이를 저장하는 코드를 작성했는데, 다른 사람의 코드는 문자열의 길이가 100일 때부터 시작하여 거꾸로 내려가면서, 팰린드롬을 찾는다면 flag를 True로 바꿔주고, 이것이 최대값이므로 나머지 반복은 break를 통해 탈출하는 식으로 문제를 해결하였다.이렇게 문제를 해결할 경우 시간복잡도를 상당히 줄일 수 있다.
또한 나의 경우엔 가로, 세로를 두 개의 for문을 만들어서 가로, 세로 줄의 팰린드롬 문자열 길이를 일일이 찾아내었는데, 2차원 리스트의 가로 세로를 바꾸는 함수를 이용하여 한 쌍의 for문으로도 가로, 세로 줄의 팰린드롬 문자열을 찾을 수 있는 것을 학습할 수 있었다.
2차원 리스트 가로, 세로 변환하기 01 - 함수 생성
#문자열 변환
def rotated(a):
n = len(a) #리스트 길이
m = len(a[0]) #리스트 안의 리스트 길이
result = [[""]*n for _ in range(m)] #결과 리스트 초기화
for i in range(n):
for j in range(m):
result[j][i] = a[i][j]
return result
#숫자열 변환
def rotated(a):
n = len(a) #2
m = len(a[0]) #4
result = [[0]*n for _ in range(m)]
for i in range(n): #0,1
for j in range(m): #0,1,2,3
result[j][i] = a[i][j]
return result
2차원 리스트 가로, 세로 변환하기 02 - zip 내장함수
a = []
for _ in range(3):
a.append(list(map(int,str(input()))))
print(a)
print(list(zip(*a)))
'SWEA (SW Expert Academy) > D3' 카테고리의 다른 글
[SWEA/D3] 1244 최대 상금 / 백트래킹 (0) | 2023.04.26 |
---|---|
[SWEA/D3] 2814 최장 경로 / DFS (0) | 2023.04.25 |
[SWEA/D3] 2817 부분 수열의 합 / 백트래킹 (0) | 2023.04.17 |
[SWEA/D3] 5215 햄버거 다이어트 / 백트래킹 (0) | 2023.04.13 |
[SWEA/D3] 1206 [S/W 문제해결 기본] 1일차 - View (0) | 2023.04.10 |