https://www.acmicpc.net/problem/3019
처음 이 문제를 보고, 10분 동안 해결방법을 찾지 못하고 고민하다가
7개의 케이스에 따라서 각각의 높이 차이를 확인하는 식으로 문제에 접근했다.
예를 들어, 5번 케이스의 경우
내려올 수 있는 도형의 종류는 다음과 같이 4가지가 있다.
이때, 각각의 도형 별로 필드의 높이는
000 / 10 / 01 / 101 이 되어야 블록을 놓을 수 있게 된다.
다른 케이스들도 90,180,270도를 회전한 뒤에 중복되는 도형을 제거한 뒤
필드 높이들을 확인한 후 계산해주면 답을 구할 수 있다.
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | #include <iostream> #include <string.h> using namespace std; int main(){ int C,P; int map[110]={0}; cin>>C>>P; memset(map,-1,sizeof(map)); for(int i=1;i<=C;i++) scanf("%d",&map[i]); int ans=0; for(int i=1;i<=C;i++){ switch(P){ case 1: ans++; //0 if(map[i]==map[i+1] && map[i+1]==map[i+2] && map[i+2]==map[i+3]) ans++; //0000 break; case 2: if(map[i]==map[i+1]) ans++; //00 break; case 3: if(map[i]==map[i+1] && map[i+1]+1==map[i+2]) ans++; //001 if(map[i]==map[i+1]+1) ans++; //10 break; case 4: if(map[i]==map[i+1]+1 && map[i+1]==map[i+2]) ans++; //100 if(map[i]+1==map[i+1]) ans++; //01 break; case 5: if(map[i]==map[i+1] && map[i+1]==map[i+2]) ans++; //000 if(map[i]==map[i+2] && map[i+1]==map[i]-1) ans++; //01 if(map[i]+1==map[i+1]) ans++; //101 if(map[i]==map[i+1]+1) ans++; //10 break; case 6: if(map[i]==map[i+1] && map[i+1]==map[i+2]) ans++; //000 if(map[i]+1==map[i+1] && map[i+1]==map[i+2]) ans++; //00 if(map[i]==map[i+1]) ans++; //011 if(map[i]==map[i+1]+2) ans++; //20 break; case 7: if(map[i]==map[i+1] && map[i+1]==map[i+2]) ans++; //000 if(map[i]==map[i+1] && map[i+1]==map[i+2]+1) ans++; //02 if(map[i]==map[i+1]) ans++; //110 if(map[i]+2==map[i+1]) ans++; //00 break; } } cout<<ans<<endl; return 0; } | cs |
'알고리즘(BOJ) > 시뮬레이션' 카테고리의 다른 글
백준 17140번 - 이차원 배열과 연산 (0) | 2019.10.14 |
---|---|
백준 14503번 - 로봇 청소기 (3) | 2019.08.18 |
백준 14890번 - 경사로 (0) | 2019.07.03 |
백준 1764번 - 듣보잡 (0) | 2019.05.14 |
백준 17144번 - 미세먼지 안녕! (0) | 2019.05.13 |