알고리즘/SWEA

[SWEA]230207 문제풀이

stubborngastropod 2023. 2. 7. 21:34
728x90

풍선팡2

T = int(input())
di = [0, 0, -1, 1]
dj = [-1, 1, 0, 0]

for i in range(T):
    N, M = map(int, input().split())
    lst = []
    ans = []
    for j in range(N):
        lst.append(list(map(int, input().split())))
    for j in range(N):
        for k in range(M):
            bls = lst[j][k]
            for l in range(2):
                if j+di[l+2] in range(N):
                    bls += lst[j+di[l+2]][k+dj[l+2]]
                if k+dj[l] in range(M):
                    bls += lst[j+di[l]][k+dj[l]]
            ans.append(bls)
    print(f'#{i+1} {max(ans)}')

델타를 이용한 2차원 배열 탐색 연습하기에 좋은 문제. 배열의 양 끝단에서 발생하는 예외처리를 조건문 등으로 잘 처리해줘야 한다.

색깔 칠하기

T = int(input())
for i in range(T):
    N = int(input())
    table1 = []
    table2 = []
    cnt = 0

    for j in range(10):
        table1.append([0] * 10)
        table2.append([0] * 10)
    for j in range(N):
        *a, b = map(int, input().split())
        if b == 1:
            for k in range(a[0], a[2]+1):
                for l in range(a[1], a[3]+1):
                    table1[k][l] = 1
        if b == 2:
            for k in range(a[0], a[2]+1):
                for l in range(a[1], a[3]+1):
                    table2[k][l] = 1

    for j in range(10):
        for k in range(10):
            if table1[j][k] == table2[j][k] == 1:
                cnt += 1

    print(f'#{i+1} {cnt}')

같은 색깔이 여러개 동시에 칠해질 때를 고려해 빨간색과 파란색이 겹치는 부분을 어떻게 처리할지가 관건인 문제. 나는 파란색이 칠해지는 배열과 빨간색이 칠해지는 배열을 따로 두고 두 배열을 비교해 중첩되는 부분을 찾았다.

ladder

for i in range(10):
    n = int(input())
    lst = []
    for j in range(100):
        lst.append(list(map(int, input().split())))
    end = lst[99].index(2)

    def side(x, y, k):
        if y+k not in range(100) or lst[x][y+k] == 0:
            return y
        else:
            return side(x, y+k, k)

    x, y = 99, end
    while True:
        if y - 1 in range(100) and lst[x][y-1]:
            y = side(x, y, -1)
            x -= 1
            if x == 0:
                print(f'#{n} {y}')
                break
            continue
        elif y + 1 in range(100) and lst[x][y+1]:
            y = side(x, y, 1)
            x -= 1
            if x == 0:
                print(f'#{n} {y}')
                break
            continue
        else:
            x -= 1
            if x == 0:
                print(f'#{n} {y}')
                break

분기를 만났을 때 함수를 이용해 코드가 간결해지도록 최대한 힘써봤다. 사실 y축으로 올라가는 것도 함수로 할까 했었는데 함수 없이 하는게 좀 더 직관적인 것 같기도 하다.

달팽이 숫자

T = int(input())
di = [0, 1, 0, -1]
dj = [1, 0, -1, 0]
for i in range(T):
    cnt = 1
    n = int(input())
    snail = [[0] * (n + 2) for j in range(n + 2)]
    for j in range(n + 2):
        snail[0][j] = 1
        snail[j][0] = 1
        snail[n+1][j] = 1
        snail[j][n+1] = 1
    k = j = 1
    x = y = 0
    while cnt < n**2 + 1:
        if snail[k][j] == 0:
            snail[k][j] = cnt
            cnt += 1
        else:
            k -= di[x]
            j -= dj[y]
            x = (x + 1) % 4
            y = (y + 1) % 4
        k += di[x]
        j += dj[y]
    print('#'+str(i+1))
    for j in range(1, n + 1):
        for k in range(1, n + 1):
            print(snail[j][k], end = ' ')
        print()

배열 탐색하는데 까다로울 수 있는 여러 조건들이 나오는 문제. 0으로 이루어진 2차원 배열에서 0이 아닌 수를 만났을 때 델타를 이용한 방향 전환이 가능하도록 전체 리스트를 1로 한 겹 감싸주는 방식을 택했다. 만약 아니었으면 끝단에서 예외처리를 해줬어야 하는데 그럼 귀찮아져서...

728x90