졍
지영이 블로그
졍
전체 방문자
오늘
어제
  • 분류 전체보기 (95)
    • 네트워크 (12)
    • 시스템설계 (6)
    • AWS (7)
    • Elasticsearch (3)
    • Python (5)
    • 자료구조, 알고리즘 (9)
    • 코딩테스트 (29)
    • NCP (8)
    • 운영체제 (7)
    • 개인 프로젝트 (8)
    • Github (1)
    • 여행 (0)
      • 2024동유럽 (0)
    • 대학원 (0)
      • 논문정리 (0)

최근 글

최근 댓글

hELLO · Designed By 정상우.
졍

지영이 블로그

[Python] 백준 18808번 - 스티커 붙이기
코딩테스트

[Python] 백준 18808번 - 스티커 붙이기

2023. 8. 4. 16:09

문제: https://www.acmicpc.net/problem/18808

 

18808번: 스티커 붙이기

혜윤이는 최근에 다양한 대회를 참여하면서 노트북에 붙일 수 있는 스티커들을 많이 받았다. 스티커는 아래와 같이 사각 모눈종이 위에 인쇄되어 있으며, 스티커의 각 칸은 상하좌우로 모두 연

www.acmicpc.net

구현 문제였는데, 내가 푼 방법은 다음과 같다.

1. notebook과 동일한 temp_notebook을 생성 후, 두 값이 같을 동안 while 문을 돌린다.
2. while 문 내에서 노트북의 왼쪽 위 (0, 0)부터 오른쪽아래 (n, m)까지 돌며 스티커를 붙일 수 있는지 확인한다.
2-1. 만약 노트북에 스티커를 붙일 수 있으면 while문을 빠져나온다.
2-2. 노트북에 스티커를 붙이지 못하는 경우, 스티커를 90도 회전시킨다.
3. 위 과정을 스티커가 0, 90, 180, 270도 만큼 도는 동안 총 4번 반복
n, m, k = map(int, input().split())
notebook = [[0]*m for _ in range(n)]

# 스티커 붙여보기
def put_sticker(sticker, x, y, notebook):
    temp_notebook = []
    for i in range(n):
        temp = []
        for j in range(m):
            temp.append(notebook[i][j])
        temp_notebook.append(temp)
    
    for s_x in range(len(sticker)):
        for s_y in range(len(sticker[0])):
            if sticker[s_x][s_y] == 1:
                if notebook[x+s_x][y+s_y] == 0:
                    temp_notebook[x+s_x][y+s_y] = 1
                else:
                    return notebook
    
    return temp_notebook

# 스티커 시계방향으로 90도 돌리기
def rotate_90(sticker):
    return list(map(list, zip(*sticker[::-1])))

for _ in range(k):
    row, col = map(int, input().split())
    sticker = []
    for _ in range(row):
        sticker.append(list(map(int, input().split())))
    
    # temp_notebook 변수에 기존 notebook 복사하기 (deepcopy)
    temp_notebook = []
    for i in range(n):
        temp = []
        for j in range(m):
            temp.append(notebook[i][j])
        temp_notebook.append(temp)
        
    rotate_num = 0
    while temp_notebook == notebook:
        if rotate_num == 4:		# 총 4번 반복
            break
        # 노트북의 왼쪽 위부터 오른쪽 아래까지 돌기
        for x in range(n):
            for y in range(m):
                if x+(len(sticker)-1) < n and y+(len(sticker[0])-1) < m:     # 칸이 맞을 때
                    temp_notebook = put_sticker(sticker, x, y, notebook)
                    if temp_notebook != notebook:
                        break
            if temp_notebook != notebook:
                break
        sticker = rotate_90(sticker)		# 노트북에 스티커를 붙이지 못한 경우, 90도 돌리기
        rotate_num += 1
        
    notebook = temp_notebook
    # print(notebook)

answer = 0
for i in range(n):
    for j in range(m):
        if notebook[i][j] == 1:
            answer += 1
            
print(answer)

'코딩테스트' 카테고리의 다른 글

[Python] 백준 2146번 - 다리 만들기 (bfs, dfs 풀이)  (0) 2023.08.23
[Python] 백준 16234번 - 인구 이동  (0) 2023.08.07
[Python] 백준 14891번 - 톱니바퀴 (재귀)  (0) 2023.08.02
[Python] 백준 14891번 - 톱니바퀴  (0) 2023.08.01
[Python] 백준 15686번 - 치킨 배달 (dfs 백트래킹)  (0) 2023.07.18
    졍
    졍

    티스토리툴바