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값을 따로 설정하는 것은 자주 쓰이므로 꼭 숙달하도록 하자.