1216_회문2

2024. 8. 24. 23:24알고리즘 풀이

# 회문 2
# 100x100
# 가로, 세로 비교

# 음...
# 2중 for문으로 하나씩 돌면서
# li[i] == li[j]이게 같으면 팰린드롬인지 확인하는 함수호출
# 만약 맞다면 멈추는 식으로
# 그렇다면 가장 긴 문자열이 답이니까 큰수부터 점점작아지게 반복한다.
# li[i] == li[len(li)-j]


def is_palindrom(word):
    if word == word[::-1]:
        return True
    return False


for case in range(1, 11):
    cs = int(input())
    li = [list(map(str, input())) for _ in range(100)]
    ans = 0
    n_li = {}
    # 세로 만들기...
    for x in range(100):
        for y in range(100):
            if y not in n_li:
                n_li[y] = [li[x][y]]
            else:
                n_li[y] += [li[x][y]]
    # print(n_li)
    # 가로
    for ii in range(100):
        for i in range(100):
            for j in range(100 - 1, i, -1):
                # print(li[ii][i], li[ii][j])
                if li[ii][i] == li[ii][j]:
                    if is_palindrom("".join(li[ii][i : j + 1])):
                        # print("".join(li[ii][i : j + 1]))
                        ans = max(ans, len(li[ii][i : j + 1]))
                if n_li[ii][i] == n_li[ii][j]:
                    if is_palindrom("".join(n_li[ii][i : j + 1])):
                        ans = max(ans, len(n_li[ii][i : j + 1]))

    print(f"#{case} {ans}")


# ---------간단하지만 비효율적-------------------
def is_pal(arr, leng):
    for lst in arr:
        for i in range(N - leng + 1):
            if lst[i : i + leng] == lst[i : i + leng][::-1]:
                return True
    return False


for case in range(1, 11):
    cs = int(input())
    N = 100
    arr1 = [input() for _ in range(100)]
    arr2 = ["".join(x) for x in zip(*arr1)]  # 세로

    for leng in range(N, 1, -1):
        if is_pal(arr1, leng) or is_pal(arr2, leng):
            break

    print(f"#{case} {leng}")

# -----------------효율적?----------------------


def is_pal_idx(arr, leng):
    for lst in arr:
        for i in range(N - leng + 1):
            for j in range(leng // 2):
                if lst[i + j] != lst[i + leng - 1 - j]:
                    break
            else:
                return True
    return False


for case in range(1, 11):
    cs = int(input())
    N = 100
    arr1 = [input() for _ in range(100)]
    arr2 = ["".join(x) for x in zip(*arr1)]  # 세로

    for leng in range(N, 1, -1):
        if is_pal_idx(arr1, leng) or is_pal_idx(arr2, leng):
            break

    print(f"#{case} {leng}")

'알고리즘 풀이' 카테고리의 다른 글

[백준]17135_캐슬디펜스  (0) 2024.08.26
[백준]4344_평균은넘겠지  (1) 2024.08.24
1215_회문1  (1) 2024.08.24
2005_파스칼의삼각형  (0) 2024.08.24
2001_파리퇴치  (1) 2024.08.24