Baekjoon/IM Level
[백준] 2567 색종이2 (실버4)
hellosonic
2023. 3. 7. 18:36
문제요약
나의 코드 및 설명
- graph : 전체 도화지. 모든 요소를 0으로 갖는 리스트로 초기화한다.
- 색종이가 놓아진 부분에 1을 저장한다.
- 현재 인덱스와 그 다음 인덱스에 저장된 값이 다르면 둘레라고 보며, 가로와 세로를 따로 계산한다.
- 전체 도화지의 상하좌우 끝부분을 따로 계산한다. (for문의 범위 초과를 방지하기 위해)
num = int(input())
#전체 도화지 : 0
graph = [[0] * 100 for _ in range(100)]
#색종이가 놓여진 부분에 1을 저장
for _ in range(num):
x, y = map(int, input().split())
for i in range(y,y+10):
for j in range(x,x+10):
if graph[i][j] == 0:
graph[i][j] = 1
#전체 도화지 현재 인덱스와 그 다음 인덱스에 저장된 값이 다르면 둘레라고 보며
#가로, 세로 따로 저장한다.
sero = 0
for i in range(100):
for j in range(100):
if j == 99:
continue
elif graph[i][j] != graph[i][j+1]:
sero += 1
garo = 0
for i in range(100):
for j in range(100):
if j == 99:
continue
elif graph[j][i] != graph[j+1][i]:
garo += 1
#전체 도화지의 끝 부분을 계산하게 된다면 for문의 범위를 초과하게 되므로
#전체 도화지의 끝 부분만 둘레를 따로 계산
edge_sero = 0
for k in range(100):
if graph[k][0] == 1:
edge_sero += 1
if graph[k][99] == 1:
edge_sero += 1
edge_garo = 0
for z in range(100):
if graph[0][z] == 1:
edge_garo += 1
if graph[99][z] == 1:
edge_garo += 1
print(sero + garo + edge_sero + edge_garo)
다른 코드 및 설명
- for문을 통해 각 인덱스로 접근하고 각 인덱스의 상하좌우 값의 1의 개수를 체크한다.
이 때, 1의 개수가 2개이면 색종이의 모서리, 1의 개수가 3개이면 색종이의 변이다. - 색종이의 상하좌우의 값을 체크할 때 도화지를 넘어 갈 수 있으므로, 전체 도화지의 크기를 100이 아닌 101 혹은 102로 정한다.
num = int(input())
graph = [[0] * 101 for _ in range(101)]
dx = [-1,1,0,0]
dy = [0,0,-1,1]
for _ in range(num):
x, y = map(int, input().split())
for i in range(y, y+10):
for j in range(x,x+10):
graph[i][j] = 1
result = 0
for i in range(1,101): #1 ~ 100
for j in range(1,101):
if graph[i][j] == 1:
cnt = 0
for k in range(4):
nx = j + dx[k]
ny = i + dy[k]
if graph[ny][nx] == 1:
cnt += 1
if cnt == 3: #상하좌우 중 3칸이 1로 채워져 있으면 변에 해당
result += 1
elif cnt == 2: #상하좌우 중 2칸이 1로 채워져 있으면 모서리에 해당
result += 2
print(result)
피드백
내가 생각했던 풀이 방향과는 다르게 푼 사람들이 대부분이었다. 리스트 <dx> <dy> 에 상하좌우로 이동할 때의 x값과 y값을 따로 설정하는 것은 자주 쓰이므로 꼭 숙달하도록 하자.