ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [구름톤 챌린지] 2주차 7.구름 찾기 깃발
    코딩 챌린지 2023. 8. 23. 23:33

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    import numpy as np
    N, K = map(int, input().split())
    
    # create empty array
    arr_count = np.zeros((N+2, N+2), dtype=int)
    # create array to count flag
    arr_extended = np.zeros((N+2, N+2), dtype=int)
    
    for i in range(N):
        in_row = input().split()
        for j in range(N):
            arr_extended[i+1][j+1] = int(in_row[j])
    # print(arr_extended)
    
    for i in range(N):
        for j in range(N):
            if arr_extended[i+1][j+1] == 1:
                arr_count[(i+1)-1][(j+1)] += 1
                arr_count[(i+1)-1][(j+1)-1] += 1
                arr_count[(i+1)-1][(j+1)+1] += 1
                arr_count[(i+1)][(j+1)-1] += 1
                arr_count[(i+1)][(j+1)] += 1
                arr_count[(i+1)][(j+1)+1] += 1
                arr_count[(i+1)+1][(j+1)-1] += 1
                arr_count[(i+1)+1][(j+1)] += 1
                arr_count[(i+1)+1][(j+1)+1] += 1
    # print(arr_count)
    
    for i in range(N):
        for j in range(N):
            if arr_extended[i+1][j+1] == 1:
                arr_count[i+1][j+1] = 0
    # print(arr_count)
    
    for i in range(N+2):
        if i == 0 or i == N+1:
            for j in range(N+2):
                arr_count[i][j] = 0
                arr_count[i][0] = 0
                arr_count[i][N+1] = 0
    # print(arr_count)
    
    count = 0
    for i in range(N+2):
        for j in range(N+2):
            if arr_count[i][j] == K:
                count += 1
    print(count)

    이번 문제는 격자를 확장해서 푸는 방법을 생각해 냈기 때문에 한번 기록해 보고 싶다. 

    4x4의 배열이 있다고 하자.

    0 0 0 1
    0 0 1 0
    0 0 1 0
    0 1 1 1
               
      0 0 0 1  
      0 0 1 0  
      0 0 1 0  
      0 1 1 1  
               

    그리고 각 칸 주변에 깃발이 몇 개 인접해 있는지 기록하는데 이 기록하는 칸을 확장해서 기록해 버렸다.

    1. 처음에 깃발을 확장된 칸 중심으로 배치하고

    2. 6x6배열 중간의 4x4영역에 있는 칸들을 for loop로 이동해 가며 각 구름칸 주변 8칸에 각 칸 주변에 인접구름 개수를 +1 시켜주었다.

    3. 그리고 4x4영역 밖의 깃발을 다 0으로 만들어주어 4x4영역 밖의 깃발은 세지 않도록 해 주었다.

    4. 그리고 구름이 있던 칸 역시 0으로 만들어주어 구름이 있던 자리의 깃발은 세지 않도록 해 주었다.

    5. 그리고 for loop로 원하는 깃발값의 수를 세었다.

     

    신경 썼던 부분은 내게 익숙한 numpy를 사용해 2nd array를 만들었고, 구름에 인접한 칸의 깃발값을 1씩 올려줄 때 헷갈리지 않도록 (i+1)-1 이런 식으로 계산식을 간단히 표현하지 않고 놔두었다. 

     

    개인적으로는 for loop를 덜 사용할 수도 있었다고 생각하지만 헷갈릴까 봐 각 스텝별로 잘 보여주려고 for loop를 여러 번 사용하였다. 

     

Designed by Tistory.