일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- ELK
- 돈암동맛집
- npm
- 한남동맛집
- 통영여행
- gradle
- tomcat7
- 퇴사후공무원
- 성신여대맛집
- 파이썬
- 뚝섬역맛집
- 방이편백육분삼십
- 서울숲누룽지통닭구이
- 통영예쁜카페
- 한성대맛집
- JavaScript
- ubuntu자바설치
- 공무원
- react
- 통영에어비앤비
- 통영
- 성북구맛집
- springboot
- 스페인여행
- 자바스크립트에러처리
- 영화추천
- 국가직
- 방이편백육분삼십성신여대
- 성신여대편백집
- 꼴뚜기회
- Today
- Total
코린이의 기록
[BOJ] 11727 - 타일링2 (C++) 본문
1. 알고리즘
DP문제로, 2*n은 이전 타일 붙여 나아 가면서 개수를 구할 수 있는 방식이다. 즉 큰 것을 구하기 위해 작은 단위부터 더해 나아가는 방식..
2. 전체 소스
2*n 타일은 2*n-1 번째의타일에서 2*1의 타일을 붙이는 값 더하기 2*n-1번째의 타일에서 2*2와 2*1 타일을 붙이는 값을 더해서 구할 수 있다.
arr를 선언하여 각 n번째 타일의 채운 가짓수를 저장한다.
3. 참고 사항
이문제는 알고보면 굉장히 간단한 문제임에도 불구하고 시간초과, 틀렸습니다의 결과를 보게 되었다.
시간 초과에 관련된 소스는 아래 5번 틀린문제에 있는데 이건 안봐도 되는 소스.. 너무 복잡하게 생각해서 구현했더니 시간 초과가 발생했다.
틀렸습니다 관된 소스는 integer표현 가능한 숫자의 범위를 벗어나서 숫자가 커질 경우 음수의 결과 값을 받게 되는 일이 발생하였다. 문제의 흰트에서 볼 수 있다 시피 10007를 괜히 나누는 것이 아니였다. 10007를 나눔으로써 2*1000까지의 타일을 구할 수 있게 된다.
(arr[i] %=10007;를 for문 안에서 해주지 않고 마지막 cout 하는 부분에서 해주어서 틀렸음.)
n이 3일 경우
n이 8일 경우
n이 32일 경우
integer 표현 가능한 범위 : –2,147,483,648 ~ 2,147,483,647
4. 문제
백준 알고리즘 : https://www.acmicpc.net/problem/11727
5. 틀린 문제
아래 답안은 시간 초과된 소스이다. 더 간단한 로직이 있는데 뻘짓을 했다. 기록용으로 남겨둔다.. ...
2*n 은 2*1, 2*2 두가지 경우가 있으므로 우선 한가지 경우만 순열을 구한 다음 각각 2*n 블록의 개수의 가짓수가 2개이므로 2의 n승을 해주었다.
즉, 타일이 2*3일 경우,
1) 11 11 11
2) 11 11 2
3) 11 2 2
4) 2 2 2
와 같이 나눌 수 있는데, 이때 2에 해당하는 것을
2) 11 11 (2*2) / 11 11 (2*1) : 2가지
3) 11 (2*2) (2*2) / 11 (2*1) (2*2) / 11 (2*2), (2*1) / 11 (2*1) (2*1) : 4가지
4) (2*2) (2*2) (2*2) / (2*2) (2*2) (2*1) / (2*2) (2*1) (2*2) / (2*1) (2*2) (2*2) / (2*2) (2*1) (2*1) / (2*1) (2*2) (2*1) / (2*1) (2*1) (2*2) / (2*1) (2*1) (2*1) : 8가지
위와 같이 2는 각각 2개의 경우의 수가 있으므로 2^n(2의 개수) 만큼 경우가 생긴다.
이러한 로직으로 구현했는데.. 쓸데없는 짓이었다.
pow(2,i)가 시간 복잡도를 늘려서 시간 초과가 나왔다.
위와 거의 같은 방법이긴 한데
2의 n승을 없애고 2->3치환 후 전체 순열 개수를 구하는 로직으로 바꾸었으나 마찬가지로 시간 초과로 실패
(2는 2*1 , 3은 2*2 라고 생각하고 순열을 구해서 순열 개수로 구했음
마찬가지로 쓸데 없는 짓..
1) 11 11 11
2) 11 11 2
3) 11 2 2
4) 2 2 2
2) 11 11 11 2 / 11 11 3
3) 11 2 2 / 11 2 3 / 11 3 2 / 11 3 3
4) 2 2 2 / 2 2 3 / 2 3 2 / 3 2 2 / 2 3 3 / 3 2 3 / 3 3 2 / 3 3 3
'c&c++ > 백준' 카테고리의 다른 글
[BOJ] 11052 - 붕어빵 판매하기 (0) | 2018.05.08 |
---|---|
[BOJ] 9095 - 1,2,3 더하기 (C++) (0) | 2018.05.08 |
[BOJ] 1463 - 1로 만들기 (C++) (0) | 2018.05.08 |
[BOJ] 1697 - 숨바꼭질 (C++) (0) | 2018.05.08 |
[BOJ] 10971 - 외판원 순회2 (C++) (0) | 2018.05.08 |