티스토리 뷰

처음에 어렵게 코드를 짜다가 결과값이 제대로 나오지 않아서 수업을 듣고 고쳤다.

이렇게 쉽게 풀 수 있다니 내가 너무 어렵게 생각했나 싶었다. 열심히 해야지!

 

처음에 생각한 로직

#가로를 계산하는 경우: 시작하는곳 왼쪽에는 0이거나 퍼즐의 첫 부분이어야한다.
#즉, 왼쪽은 1이 아님
#세로로 계산하는 경우: 위가 0이거나 퍼즐의 끝부분 이어야한다
#즉, 위쪽은 1이 아님
#가로는 오른쪽으로 갔을 때 K칸만큼 1이 갔으면 K+1칸은 1이면 안됨
#세로는 아래로 갔을 때 K칸만큼 1이 갔으면 K+1칸은 1이면 안됨

이렇게 코드를 구현했는데 원하는 값이 안나왔다.

잘못된코드

T = int(input())

for tc in range(1,T+1):
    N,K = map(int,input().split())
    arr = []
    for i in range(N):
        arr.append(list(map(int, input().split())))
    #배열 받기
    #가로를 봤을 때 행(x) 기준으로 하기
    cnt = 0
    flag = False
    for x in range(N):
        for y in range(N):
            if arr[x][y] == 1:  #글자수 1개
                if y == 0 or arr[x][y-1] == 0: #첫번째칸이거나 앞칸이 0일때
                    for k in range(1, K):  #글자수 K-1개
                        if y+k < N: #범위를 벗어나지 않을 때
                            if arr[x][y+k] == 1:
                                continue
                        else:
                            flag = True
                            break
                    if y+K < N:  #범위를 벗어나지 않을 때
                        if arr[x][y+K] == 1: #K칸 넘어서까지 1이면 배치 못함. 딱 K개만 1이어야 가능
                            flag = True
                    if flag != True: #flag가 true가 아닐때만 카운트
                        cnt += 1
                    #오른쪽으로 K-1개가 1이면 cnt+=1
#세로를 봤을때 열(y)기준으로 보기
    flag2 = False
    for x in range(N):
        for y in range(N):
            if arr[x][y] == 1:
                if x == 0 or arr[x-1][y] == 0:  # 첫번째칸이거나 앞칸이 0일때
                    for k in range(1, K):
                        if x+k < N: #범위를 벗어나지 않을 때
                            if arr[x+k][y] == 1:
                                continue
                        else:
                            flag2 = True
                            break
                    if x+K < N:  #범위를 벗어나지 않을 때
                        if arr[x+K][y] == 1: #K칸 넘어서까지 1이면 배치 못함. 딱 K개만 1이어야 가능
                            flag2 = True
                    if flag2 != True: #flag가 true가 아닐때만 카운트
                        cnt += 1
                    #아래쪽으로 K-1개가 1이면 cnt+=1









    print('#{} {}'.format(tc,cnt ))

올바르게 구현한 코드

T = int(input())

for tc in range(1,T+1):
    N,K = map(int,input().split())
    arr = []
    for i in range(N):
        arr.append(list(map(int, input().split())))
    #배열 받기
    result = 0
    cnt = 0
    #가로를 봤을 때
    for x in range(N):
        #행(x) 기준으로 하기
        for y in range(N):
            if arr[x][y] == 1:
                cnt += 1
            if arr[x][y] == 0 or y == N-1: # 0을 만났거나 벽을 만났을 때
                if cnt == K: # 이전에 계산한 카운트가 k라면 result에 카운트
                    result += 1
                cnt = 0 #카운트 초기화

#세로를 봤을때

    for y in range(N):
        #열(y)기준으로 보기
        for x in range(N):
            if arr[x][y] == 1: #1이면 카운트
                cnt += 1
            if arr[x][y] == 0 or x == N-1 :  # 0을 만났거나 벽을 만났을 때
                if cnt == K:   # 이전에 계산한 카운트가 k라면 result에 카운트
                    result += 1
                cnt = 0



    print('#{} {}'.format(tc,result ))

'알고리즘 > SWEA' 카테고리의 다른 글

[SWEA] 2001.파리퇴치  (0) 2021.02.20
[SWEA] 1210.Ladder1  (0) 2021.02.19
[SWEA] 4843. 특별한정렬  (0) 2021.02.16
[SWEA] 4839. 이진탐색  (0) 2021.02.16
[SWEA] 1204.최빈수 구하기  (0) 2021.02.16
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함