STUDY/Algorithm

[SWEA] 2105. [모의 SW 역량테스트] 디저트 카페

sinawi95 2021. 7. 29. 21:45
728x90

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5VwAr6APYDFAWu

 

SW Expert Academy

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

swexpertacademy.com

import sys
sys.stdin = open("swea_2105.txt", "r")
T = int(input())
for tc in range(1, 1 + T):
    N = int(input())
    matrix = [list(map(int,input().split())) for _ in range(N)]
    answer = -1
    # [1,1], [1,2],[2,1], ~, [1,19], ~ ,[19,1] 2~ 20
    boundery = []
    for k in range(2, 21):
        for i in range(k):
            if i and k - i:
                boundery.append((i,k-i))

    for l, r in boundery:
        for i in range(N):
            for j in range(N):
                def check(i, j, l, r):
                    pos_r, pos_c_l, pos_c_r = i, j, j
                    l_dir, r_dir = -1, 1
                    loop_set = set()
                    loop_set.add(matrix[i][j])
                    while True:
                        pos_r += 1
                        pos_c_l += l_dir
                        pos_c_r += r_dir
                        if not (0 <= pos_c_l< N and 0 <= pos_c_r < N and 0<=pos_r<N):
                            return -1
                        l -= 1
                        r -= 1
                        if not l:
                            l_dir = -l_dir
                        if not r:
                            r_dir = -r_dir

                        if pos_c_l == pos_c_r:
                            if matrix[pos_r][pos_c_l] not in loop_set:
                                loop_set.add(matrix[pos_r][pos_c_l])
                                break


                        if matrix[pos_r][pos_c_l] in loop_set:
                            return -1
                        loop_set.add(matrix[pos_r][pos_c_l])

                        if matrix[pos_r][pos_c_r] in loop_set:
                            return -1
                        loop_set.add(matrix[pos_r][pos_c_r])
                    return len(loop_set)
                tmp = check(i, j, l, r)
                if answer < tmp:
                    answer = tmp

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

N = 20이고 python이 15초 이므로 반복문을 중첩해서 사용해도 될것같았고, 디저트 카페 투어하는 것을 구현하기 위해 boundery라는 배열을 만들어서 모든 바운더리를 순회하는 방식으로 만들었다.

투어는 중첩 반복문을 사용하여 크기별로 진행했고, 시계방향, 반시계방향이 아니라 각각 왼쪽 오른쪽을 확인하면서 내려갔고 범위를 벗어나거나 중복값이 있는 경우 -1을 반환하는 식으로 만들었다.

 

'STUDY > Algorithm' 카테고리의 다른 글

[백준] 3055 탈출 python  (0) 2021.08.10
[백준] 2573 빙산, python  (0) 2021.08.03
[백준] 1912 연속합, python, C  (0) 2021.07.27
[백준] 18352 특정 거리의 도시 찾기 python  (0) 2021.07.27
[백준] 16236 아기 상어, python  (0) 2021.07.22