Baekjoon/IM Level

[백준] 2567 색종이2 (실버4)

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

 

'Baekjoon > IM Level' 카테고리의 다른 글

[백준] 10158 개미 (실버4)  (0) 2023.03.09
[백준] 3985 롤케이크 (브론즈1)  (0) 2023.03.08
[백준] 3052 나머지 (브론즈2)  (0) 2023.03.07
[백준] 2941 크로아티아 알파벳 (실버5) / replace()  (0) 2023.03.07
[백준] 2798 블랙잭 (브론즈2)  (0) 2023.03.07
'Baekjoon/IM Level' 카테고리의 다른 글
  • [백준] 10158 개미 (실버4)
  • [백준] 3985 롤케이크 (브론즈1)
  • [백준] 3052 나머지 (브론즈2)
  • [백준] 2941 크로아티아 알파벳 (실버5) / replace()
hellosonic
hellosonic
꾸준함hellosonic 님의 블로그입니다.
hellosonic
꾸준함
hellosonic
전체
오늘
어제
  • 분류 전체보기 (285)
    • SSAFY (4)
    • 프로그래머스 데브코스 (26)
    • Diary (1)
    • JavaScript (20)
    • ToyPJ (13)
      • Python-Django (13)
    • CS지식 (11)
      • 자료구조 (5)
      • 개발 상식 (2)
      • 네트워크 (4)
    • Baekjoon (141)
      • IM Level (57)
      • DFS와 BFS (21)
      • 백트래킹 (21)
      • DP (3)
      • 이분탐색 (4)
      • 구현 (14)
    • Programmers (13)
      • Lv1 (4)
      • Lv2 (9)
    • SWEA (SW Expert Academy) (52)
      • D1 (5)
      • D2 (7)
      • D3 (40)
    • 이코테 (4)
    • Grammar (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 글쓰기
  • 관리자

공지사항

인기 글

태그

  • 코딩부트캠프
  • javascript ux
  • 국비지원교육
  • 프로그래머스
  • SWEA D2
  • 백준
  • 백준 14891
  • 파이썬 1269
  • 프론트엔드 데브코스
  • SWEA
  • SWEA 파이썬
  • 파이썬 1436
  • 자바스크립트
  • 리액트 todolist
  • 파이썬
  • 백준 2999
  • 파이썬 1946
  • 백준 5212
  • 백준 1157
  • SWEA D3
  • 백준 18870
  • 파이썬 11478
  • SWEA/D3
  • 프로그래머스 데브코스
  • 파이썬 2529
  • 자바스크립트 기본기
  • 그리디
  • 이코테
  • 구현
  • JS

최근 댓글

최근 글

hELLO · Designed By 정상우.
hellosonic
[백준] 2567 색종이2 (실버4)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.