-
while루프 언제 쓰나 만약 조건에 따라 변수를 내 마음대로 조절(건너뛰거나, 다시 뒤로 가거나 등)하고 싶다면,for대신 while. 어차피 for 쓰면 for문 돌 때마다 변수가 초기화 -
슬라이싱 적극 활용
p_index와shift를 일일이 계산하면 실수할 확률이 높다. 변수도 많고 인덱스도 더럽고 슬라이싱 쓰면p_index와shift아예 필요 없음 제미나이는 target (target = list_type[row][column:column+m]) 전체를 뒤집어서 봤는데 (target [ : : -1]) 나는 반만 뒤집어서 봄 (계산 아끼는 접근) 그치만 저 방식도 기억해 둬야 -
투 포인터? 근데 내가 접근한 방식이 투포인터와 유사한 방식이라고 하네? 투 포인터(Two Pointers): 리스트나 배열에서 두 인덱스 동시에 다루기 본 문제의 경우: 단어의 맨 앞 인덱스(left) & 맨 뒤 인덱스(right)가 2개의 포인터가 됨 → 비교 → left는 한 칸 뒤로, right은 한 칸 앞으로 이동 후 비교, 서로 교차 / 만날 때 까지 같다면 회문 판정 (m//2)
T = int(input())
# 여러개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
for test_case in range(1, T + 1):
n, m = map(int, input().split())
r_input = [list(input()) for _ in range (n)] #list 안에 str이 들어있는 형태
c_input = list(zip(*r_input))
#p_index = 0
#shift = 0
answer= []
target = []
for list_type in r_input, c_input:
for row in range (n):
for column in range (n-m+1):
target = list_type[row][column:column+m]
#어차피 슬라이싱이라 뒤에건 포함 x -> m 그대로 쓰기
#이렇게 잘라두고 들어가니 출력시 더 편함
i = 0
while i <= m//2:
#print (i)
if target[i] == target[m-i-1]:
if i == m//2:
# answer = str(target) -> '['도 하나 하나 문자가 되어서 저장됨
answer = "".join(target) # 다시 등장한 join메소드! 중요중요. 앞에 구분자 정할 수 있어 좋음
break
else:
i += 1
else:
i = 0
break
print (f'#{test_case}', answer) # *answer
'''
for t_index in range (n-m+1): #타겟 인덱스 (n-m)으로 범위 설정하면 길이 같을 때 안 돈다ㅠ
p_index = 0 #초기화 위치 제발...
shift = 0
while p_index <= m//2: # 패턴 인덱스
if list_type[row][p_index+shift] == list_type[row][m-p_index-1+shift]:
p_index += 1
print (p_index)
else:
p_index = 0
shift += 1
break
print (f"#{test_case} {answer}")
# 슬라이싱 좀 쓰자... 근데 이게 나중에 많이 쓰이는 투포인터 방식이라고?'''