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

2025. 2. 5. 22:24·백준 문제/시뮬레이션

문제: 18808번: 스티커 붙이기

basic-algo-lecture/workbook/0x0D.md at master · encrypted-def/basic-algo-lecture

 

basic-algo-lecture/workbook/0x0D.md at master · encrypted-def/basic-algo-lecture

바킹독의 실전 알고리즘 강의 자료. Contribute to encrypted-def/basic-algo-lecture development by creating an account on GitHub.

github.com

 

#include <iostream>
#include <vector>
using namespace std;

int n, m, k, r, c, totalCnt = 0;
vector<vector<int>> board;
vector<vector<int>> sticker;

bool IsPossibleFill(int boardX, int boardY) {
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < c; j++) {
            // 범위를 벗어나면 false
            if ((boardY + i >= n) || (boardX + j >= m)) {
                if (sticker[i][j] == 1) return false;
            }
            // 이미 채워져 있으면 false
            else if (board[boardY + i][boardX + j] == 1 && sticker[i][j] == 1)
                return false;
        }
    }
    // 스티커 부착
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < c; j++) {
            if (sticker[i][j] == 1)
                board[boardY + i][boardX + j] = 1;
        }
    }
    return true;
}

void rotate() {
    vector<vector<int>> rotated(c, vector<int>(r));
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < c; j++) {
            rotated[j][r - 1 - i] = sticker[i][j]; // 90도 회전
        }
    }
    sticker = rotated;
    swap(r, c);
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin >> n >> m >> k;
    board.assign(n, vector<int>(m));

    for (int i = 0; i < k; i++) {
        cin >> r >> c;
        sticker.assign(r, vector<int>(c)); // 크기 조정

        for (int j = 0; j < r; j++) {
            for (int l = 0; l < c; l++) {
                cin >> sticker[j][l];
            }
        }

        // 스티커 붙이기
        bool isPasted = false;
        for (int rot = 0; rot < 4; rot++) {
            for (int y = 0; y <= n - r; y++) {
                if (isPasted) break;
                for (int x = 0; x <= m - c; x++) { // x 범위 수정
                    if (IsPossibleFill(x, y)) {
                        isPasted = true;
                        break;
                    }
                }
            }
            if (isPasted) break;
            rotate();
        }
    }

    // 1의 개수 세기
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (board[i][j] == 1) totalCnt++;
        }
    }
    cout << totalCnt;

    return 0;
}

 

... 문제 풀다가 점점 산으로 가는게 느껴져서 부득이하게 동영상 참고해서 풀었다. 처음에는 문제를 잘못 이해했다. 스티커가 주어진 순서대로 붙이라고 문제에서 줬는데 제대로 안 읽어서 백트래킹 이용해야 하는 문제인 줄 알았다;; 

 

그냥 스티커 벡터 하나 만들어놓고 새로운 스티커 입력 받을 때마다 갱신해주면 되는 거였다. 입력 받자마자 해당 스티커를 붙일 수 있는지 확인하고, 붙일 수 있다면 바로 붙이도록 했다. 붙일 수 없는 경우에는 회전을 해줘야 하는데 0, 90, 180, 270 으로 최대 4번까지 확인하게 되는 경우가 있다.

 

시계방향으로 90도 돌리는게 처음에는 되게 어려울 것 같다고 생각했는데 막상 손으로 써보면서 하니까 괜찮았다. 

 

저번에 시뮬레이션 문제 풀었을 때도 느낀거지만 한 문제에 들어가는 시간이 엄청난 것 같다. 시간 엄청 쓰다보면 잘 하고 있는 건지도 잘 모르겠고..;; 아무튼 오늘은 겨우 문제 풀었다.

 

 

'백준 문제/시뮬레이션' 카테고리의 다른 글
  • [백준] 15686번 치킨 배달
  • [백준] 15683번 감시
dubu0721
dubu0721
dubu0721 님의 블로그 입니다.
  • dubu0721
    dubu0721 님의 블로그
    dubu0721
  • 전체
    오늘
    어제
    • 분류 전체보기 (343)
      • 프로그래밍언어론 정리 (5)
      • 컴퓨터네트워크 정리 (5)
      • 알고리즘&자료구조 공부 (64)
        • it 취업을 위한 알고리즘 문제풀이 입문 강의 (60)
        • 학교 알고리즘 수업 (3)
        • 실전프로젝트I (0)
      • 백준 문제 (196)
        • 이분탐색 (7)
        • 투포인트 (10)
        • 그래프 (7)
        • 그리디 (24)
        • DP (25)
        • BFS (18)
        • MST (7)
        • KMP (4)
        • Dijkstra (3)
        • Disjoints Set (4)
        • Bellman-Ford (2)
        • 시뮬레이션 (3)
        • 백트래킹 (15)
        • 위상정렬 (5)
        • 자료구조 (25)
        • 기하학 (1)
        • 정렬 (11)
        • 구현 (8)
        • 재귀 (8)
        • 수학 (8)
      • 유니티 공부 (11)
        • 레트로의 유니티 게임 프로그래밍 에센스 (11)
        • 유니티 스터디 자료 (0)
        • C# 공부 (0)
      • 유니티 프로젝트 (48)
        • 케이크게임 (13)
        • 점토게임 (35)
      • 언리얼 공부 (10)
        • 이득우의 언리얼 프로그래밍 (10)
      • 진로 (1)
      • 논문 읽기 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    언리얼
    그래프
    유니티 공부 정리
    dp
    티스토리챌린지
    시뮬레이션
    맵
    투포인터
    수학
    골드메탈
    이벤트 트리거
    재귀
    자료구조
    스택
    유니티 프로젝트
    BFS
    C#
    해시
    레트로의 유니티 프로그래밍
    유니티
    백준
    그리디
    정렬
    바킹독
    오블완
    이분탐색
    큐
    우선순위큐
    백트래킹
    이득우
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
dubu0721
[백준] 18808번 스티커 붙이기

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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