SWEA (SW Expert Academy)/D2

[SWEA/D2] 1979 어디에 단어가 들어갈 수 있을까

hellosonic 2023. 4. 21. 18:33

문제 바로가기

 

SW Expert Academy

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

swexpertacademy.com

나의 코드 및 설명 01

  • 두 번째로 풀이한 소스이다. 이게 더 깔끔하고 좋은 것 같다.
t = int(input())
for test_case in range(1, t+1):
    n, k = map(int, input().split()) #퍼즐 가로 세로 : n  단어 길이 : k
    board = []
    for _ in range(n):
        board.append(list(map(int, input().split())))
    
    garo_zip = []
    sero_zip = []

    for i in range(n):

        garo_count = 0
        sero_count = 0

        for j in range(n):
            #가로 분석
            if board[i][j] == 1: #좌표의 값이 1이면 
                garo_count += 1 #가로 카운트 1 증가
            elif board[i][j] == 0: #좌표의 값이 0이면
                garo_zip.append(garo_count) #현재까지 저장된 가로 카운트 garo_zip에 저장
                garo_count = 0 #가로 카운트 0으로 초기화

            #세로 분석
            if board[j][i] == 1: #좌표의 값이 1이면
                sero_count += 1 #세로 카운트 1 증가
            elif board[j][i] == 0: #좌표의 값이 0이면
                sero_zip.append(sero_count) #현재까지 저장된 세로 카운트 sero_zip에 저장
                sero_count = 0 #세로 카운트 0으로 초기화

        garo_zip.append(garo_count) #가로 한 줄 for문을 다 돌면 현재 가로 카운트 garo_zip에 저장
        sero_zip.append(sero_count) #세로 한 줄 for문을 다 돌면 현재 세로 카운트 seor_zip에 저장
            
    print("#{} {}".format(test_case, garo_zip.count(k) + sero_zip.count(k)))

나의 코드 및 설명 02

  • 첫 번째로 풀이한 소스이다. visited 리스트에 연속된 1의 개수를 저장받고, k가 넘어갈 시에는 다시 1을 저장하는 방법으로 풀이하였다. 
t = int(input())
for test_case in range(1, t+1):
    n, k = map(int, input().split())
    board = []
    for _ in range(n):
        board.append(list(map(int, input().split())))
    garo_visited = [[0] * n for _ in range(n)] 
    for i in range(n):
        garo_check = 1
        for j in range(n):
            if board[i][j] == 1:
                if garo_check > k:
                    garo_check = 1
                    garo_visited[i][j-1] -= 1
                    continue
                else:
                    garo_visited[i][j] = garo_check
                    garo_check += 1
            if board[i][j] == 0:
                garo_check = 1
                
    sero_visited = [[0] * n for _ in range(n)]
    for i in range(n):
        sero_check = 1
        for j in range(n):
            if board[j][i] == 1:
                if sero_check > k:
                    sero_check = 1
                    sero_visited[j-1][i] -= 1
                    continue
                else:
                    sero_visited[j][i] = sero_check
                    sero_check += 1
            if board[j][i] == 0:
                sero_check = 1
    ans = 0
    for i in range(n):
        ans += garo_visited[i].count(k)
    for i in range(n):
        ans += sero_visited[i].count(k)
    print("#{} {}".format(test_case, ans))

피드백

첫 번째로 풀이했을 때는 어찌하다가 맞은 것 같다. 두 번째로 풀이할 때 좀 헤맸는데, 고민 끝에 작성한 두 번째 소스 코드가 더 만족스럽다.