2022. 11. 9. 23:09ㆍ공부/알고리즘
18808번: 스티커 붙이기
혜윤이는 최근에 다양한 대회를 참여하면서 노트북에 붙일 수 있는 스티커들을 많이 받았다. 스티커는 아래와 같이 사각 모눈종이 위에 인쇄되어 있으며, 스티커의 각 칸은 상하좌우로 모두 연
www.acmicpc.net
문제를 푸는 방식은 문제에서 다 알려주기에 그대로 풀면 되지만, 구현하는 과정이 매우 어려웠던 문제다.
풀이과정
1. 스티커의 갯수만큼 모든 지점에서 다음 스티커가 들어갈 수 있는지를 판단하는 함수 isAvail()을 실행한다.
2. 만약 한 방향에서 전부 실패하면 그 다음 방향으로 시도해본다.
3. 모든 방향에서 실패하면 다음 스티커로 넘어간다.
시간복잡도
스티커 100개, 노트북 뒷면 너비 최대 40*40, 스티커 크기 최대 10*10, 방향 4
4 * 40 * 40 * 10 * 10 * 100 = 64000000번
python은 1초에 약 2천만번의 연산이 가능하므로 약 3초 정도에 해결 가능하다.
python은 C++대비 기준 시간이 보통 3배로 주어지므로 6초 안에 통과 가능하면 된다.
여기서 포인트는 90도 회전인데, 배열을 90도 회전하게 되면 다음처럼 배열의 위치가 바뀌게 된다.
배열을 90도 회전한다고 해서 새 배열을 만들면 시간복잡도와 공간복잡도 모두 손해를 보게 되니
기존 배열은 그대로 오름차순으로 참조하되, 스티커의 위치만 위의 배열대로 참조하면 된다.
만약 로직을 좀 더 짧게 짜면 다음처럼 된다.
근데 이러면 시간에서 손해봄
왜와이? 코드 반복을 줄이기 위해서 p 배열을 만드는 것을 반복하기 때문. 따라서 기존 시간의 2배가 걸린다.
'공부 > 알고리즘' 카테고리의 다른 글
BOJ 12100. 2048 (Easy) (0) | 2022.11.13 |
---|---|
코딩테스트에 필요한 파이썬 문법 정리 (0) | 2022.11.10 |
BOJ 15683. 감시 [백트래킹, 시뮬레이션] (0) | 2022.11.08 |
[SWEA] 회문 (0) | 2022.11.03 |
[SWEA] 암호문 3 (0) | 2022.11.01 |