알고리즘/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