본문 바로가기

CodingTest/Baekjun Online Judge

[ BOJ / 파이썬 ] 18808 스티커 붙이기

https://seongonion.tistory.com/113

 

[백준] 18808번 스티커 붙이기 - 파이썬(Python)

문제 (링크) https://www.acmicpc.net/problem/18808 18808번: 스티커 붙이기 혜윤이는 최근에 다양한 대회를 참여하면서 노트북에 붙일 수 있는 스티커들을 많이 받았다. 스티커는 아래와 같이 사각 모눈종

seongonion.tistory.com

 

: 행과 열의 크기가 다른 스티커는 90도 돌릴 때 r과 c의 값도 변경해야한다는 것을 몰랐다. 경험 차이. 비슷한 문제 나오면 헷갈리지 말 것!

 

: 90도 돌리기 복습

r * c일 때, 

for i in range(r):

  for j in range(c):

    changed[i][j] = original[r-j-1][i]

 

: 로직 만들기가 그래도 정답에 근접하다. 어리바리 안 떨고 다가가려고 노력할 수 있는 수준은 됐다.

: 정답 여전히 못 맞추기는 하지만, 구현 정확성은 떨어지지만 하다보면 될거야. 너무 상심하지 말자. 계속 문제 풀면 된대.

: 계속 풀어보고 답지 보고 이해하고 수정하고, 안 보고 다시 풀고. * n번 하면 될거야 시험 때까지.

: 한 문제에 너무 얽매이지 말고 다음 문제로 넘어가는 쿨함도 지니자.

 


2022.10.09

import sys
input = sys.stdin.readline
import copy

n, m, l = map(int, input().split())
notebook = [[0]*m for _ in range(n)]

def rotate_sticker(r, c, sticker):
  for i in range(r):
    print(sticker[i])
  print('')
  new_sticker = [[0]*r for _ in range(c)]
  for i in range(c):
    for j in range(r):
      new_sticker[i][j] = sticker[r-j-1][i]
  return new_sticker
  
def stick_possible(x, y, r, c, sticker):
  for i in range(r):
    for j in range(c):
      if notebook[i+x][j+y] + sticker[i][j] >= 2:
        return False
  return True
  
for _ in range(l):
  r, c = map(int, input().split())
  sticker = [list(map(int, input().split())) for _ in range(r)]

  stick_okay = []
  for i in range(n):
    if stick_okay:
      break
    for j in range(m):
      for k in range(4):
        sticker = rotate_sticker(r, c, sticker)
        if i+r >= n or j+c >= m:
          continue
        if stick_possible(i, j, r, c, sticker):
          stick_okay = [i, j]
          break
  if stick_okay:
    [x, y] = stick_okay
    for i in range(x, x+r):
      for j in range(y, y+c):
        notebook[i][j] += sticker[i][j]


result = 0
for i in range(n):
  result.append(notebook[i].count(1))
print(result)

으어.. 또 답 안 나와... 수정하다가 인덱스 터졌다.. ㅠㅜㅠㅜㅠㅜㅠㅜ 하 죽겠네 진짜 ㅠㅜㅠㅜㅜㅠ 

꼼꼼함 어떻게 잡지..

 

 

# 정답코드

import sys
input = sys.stdin.readline
import copy

n, m, l = map(int, input().split())
notebook = [[0]*m for _ in range(n)]

def rotate_sticker(r, c, sticker):
  for i in range(r):
    print(sticker[i])
  print('')
  new_sticker = [[0]*r for _ in range(c)]
  for i in range(c):
    for j in range(r):
      new_sticker[i][j] = sticker[r-j-1][i]
  return new_sticker
  
def stick_possible(x, y, r, c, sticker):
  for i in range(r):
    for j in range(c):
      if notebook[i+x][j+y] + sticker[i][j] >= 2:
        return False
  return True
  
for _ in range(l):
  r, c = map(int, input().split())
  sticker = [list(map(int, input().split())) for _ in range(r)]

  stick_okay = []
  for i in range(n):
    if stick_okay:
      break
    for j in range(m):
      for k in range(4):
        sticker = rotate_sticker(r, c, sticker)
        if i+r >= n or j+c >= m:
          continue
        if stick_possible(i, j, r, c, sticker):
          stick_okay = [i, j]
          break
  if stick_okay:
    [x, y] = stick_okay
    for i in range(x, x+r):
      for j in range(y, y+c):
        notebook[i][j] += sticker[i][j]


result = 0
for i in range(n):
  result.append(notebook[i].count(1))
print(result)