문제 출처: https://www.acmicpc.net/problem/15685
풀이
1. dx[4]와 dy[4]는 문제에서 주어진대로 선언해야한다.(막 선언하면안됨)
0:오른쪽 1:위 2:왼쪽 3:아래 이므로 , dx[4]={1,0,-1,0}, dy[4]={0,-1,0,1}
2. 규칙을 못찾겠다면 예제1,힌트1을 참고한다.
<규칙>
d =0 시작 기준,
0세대 : 0
1세대 : 0 /1
2세대 : 0 1 /2 1
3세대 : 0 1 2 1 /2 3 2 1
-----------------3세대 까지는 N세대: N-1세대 + N-1세대의 요소의 역순 +1
4세대 : 0 1 2 1 2 3 2 1 / 2 3 0 3 2 3 2 1
규칙을 못 찾겠거나 3세대까지의 규칙이 4세대이상부터도 똑같이 적용될 걸 의심하는 분들은 예제1과 힌트1을 참고하여 1~3세대규칙을찾고,
4세대부터는 N세대 : N-1세대 + (N-1세대의 요소의 역순 +1) %4 가 됨을 이해한다.
3. 규칙을 찾았다면 직접 그려본다(예제1과 힌트1이있으니 직접 예제1을 그려본다.)
문제에서 사각형의 갯수를 구하라고했는데, 언뜻 보면 뭔소린지 이해가 안 갈 수 있다. 예제1만봐도 사각형이 3개 있으니 3개아닌가?싶을 수 있다.
직접 그려보면 아래 그림처럼 어떤정점에서 칠해진좌표상에서 주어진 순서(0오->1위->2왼->3아래)대로1*1사각형을 그릴 수 있는 정점을 구하는 것임을 알 수 있다.
4. 그대로 구현하면된다.
N-1세대를 이용해서 N세대를 구하고, 그래프상에서 힌트1처럼 입력된 드래곤커브들을 그려서 정점을 체크한다.
좌표가 각각 1세대:2개, 2세대:4개, 3세대: 8개, 4세대 :16개....순으로 이어지므로 아래처럼 작성하면 될 것 같다.
주의 할것은 좌표가 0~100까지이므로 배열선언시 크기를 100*100이아닌 101*101로 선언해야한다.
for (int i = 0; i < g; i++) { int len = v.size() - 1; for (int j = len; j >= 0; j--) { v.push_back((v[j] + 1) % 4); } }
코드
#include<iostream> #include<vector> using namespace std; int n, x, y, d, g, ans; int map[101][101]; int dx[4] = { 1,0,-1,0 }; int dy[4] = { 0,-1,0,1 }; int main() { cin >> n; for (int i = 0; i < n; i++) { vector<int>v; cin >> x >> y >> d >> g; map[y][x] = 1; v.push_back(d); for (int i = 0; i < g; i++) { int len = v.size() - 1; for (int j = len; j >= 0; j--) { v.push_back((v[j] + 1) % 4); } } for (int i = 0; i < v.size(); i++) { //세대들의 정점을 칠한다. y = y + dy[v[i]]; x = x + dx[v[i]]; map[y][x] = 1; } } for (int i = 0; i < 100; i++) { for (int j = 0; j < 100; j++) { if (map[i][j] && map[i][j + 1] && map[i + 1][j] && map[i + 1][j + 1]) ans++; } } cout << ans << endl; }
결과
'문제풀이(BOJ) > 삼성 sw역량테스트 기출' 카테고리의 다른 글
[백준 16637] 괄호 추가하기 (0) | 2020.02.05 |
---|---|
[백준 16235] 나무 재테크 (0) | 2020.02.02 |
[백준 14500] 테트로미노 (0) | 2020.02.01 |
[백준17070] 파이프 옮기기1 (0) | 2020.01.30 |
[백준 17144] 미세먼지 안녕! (0) | 2020.01.29 |