백준 구현 대비 스티커 붙이기

yjkim·2023년 8월 28일
0

알고리즘

목록 보기
43/60

문제 : 스티커 붙이기

접근

1) 맨 위 왼쪽에서 시작해서 오른쪽으로 한칸씩 가면서 시작지점 선택 -> 2)탐색 후 가능하면 graph 값 갱신, 불가능하면 rotate함수로 sticker 변수 전달해준 후 다시 1)로 -> 1의 갯수 센 다음에 total 출력

의 방식으로 도식화를 진행하였고 구현에 어려움은 없었으나 2개의 테스트 케이스에서 계속해서 에러 발생.

에러 발생 이유는 rotate 함수에 있었음. 회전의 기준을 잘못 잡아서 정 반대로 구현해버림.

초기 rotate 함수의 형태는 다음과 같았다

초기 rotate 함수

  def rotate(sticker, r, c):
      new_sticker = [[0 for i in range(r)] for j in range(c)]
      for i in range(c):
          for j in range(r):
              new_sticker[i][j] = sticker[j][c-i-1]
      return new_sticker

수정 rotate 함수

  def rotate(sticker, r, c):
      new_sticker = [[0 for i in range(r)] for j in range(c)]
      for i in range(r):
          for j in range(c):
              new_sticker[j][r-i-1] = sticker[i][j]
      return new_sticker

앞으로 배열의 회전 문제가 나올 시 일관성있게 기준을 원형 배열로 잡고 계산해야 할듯

전체 코드

  n, m, k = map(int, input().split())
  graph = [[0 for i in range(m)] for j in range(n)]
  # n이 세로 m이 가로


  def put_sticker(sticker, r, c):
      # r이 세로 c이 가로
      for ii in range(n - r + 1):
          for jj in range(m - c + 1):
              # ii와 jj는 시작점
              flag = True
              for _i in range(ii, ii + r):
                  for _j in range(jj, jj + c):
                      if graph[_i][_j] == 1 and sticker[_i - ii][_j - jj] == 1:
                          flag = False
              if flag:
                  for _i in range(ii, ii + r):
                      for _j in range(jj, jj + c):
                          if sticker[_i - ii][_j - jj] == 1:
                              graph[_i][_j] = 1
                  return True
      return False

  # 4번 12 6번 22
  def rotate(sticker, r, c):
      new_sticker = [[0 for i in range(r)] for j in range(c)]
      for i in range(r):
          for j in range(c):
              new_sticker[j][r-i-1] = sticker[i][j]
      return new_sticker

  # 회전할때 기존의 이차원 배열을 기준으로 돌리자

  total = 0
  for i in range(k):
      r, c = map(int, input().split())
      sticker = []
      for j in range(r):
          sticker.append(list(map(int, input().split())))
      count = 0
      while count < 4:
          if put_sticker(sticker, r, c):
              break
          else:
              sticker = rotate(sticker, r, c)
              r, c = c, r
              count += 1

  for ii in range(len(graph)):
      for jj in range(len(graph[0])):
          if graph[ii][jj] == 1:
              total += 1


  print(total)
profile
We may throw the dice, but the Lord determines how they fall

0개의 댓글