일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- dfs
- 이진탐색
- 나무박멸
- 3Dreconstruction
- 루돌프의반란
- DP
- 코드트리빵
- 구현
- ICER
- 슈퍼컴퓨터클러스터
- ARM
- 마법의숲탐색
- ros
- 코드트리
- 토끼와 경주
- 포탑부수기
- BFS
- 조합
- DenseDepth
- 마이크로프로세서
- 왕실의기사대결
- 소프티어
- 시뮬레이션
- Calibration
- 싸움땅
- 삼성기출
- 수영대회결승전
- ISER
- 백준
- 순서대로방문하기
Archives
- Today
- Total
from palette import colorful_colors
[백준] 15685 드래곤 커브 with C++ (삼성기출) 본문
시계방향 rotation 구현을 생각해내느라 헤맸다.
다행히 예제만 맞으면 무난하게 통과가 가능한 문제인 것 같다,,?
구현 방법은 주석 참고
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int N, answer;
int MAP[101][101];
int dx[4] = { 1, 0, -1, 0 };
int dy[4] = { 0, -1, 0, 1 };
struct coordinate {
int x;
int y;
};
coordinate rotate(int baseX, int baseY, int x, int y) {
coordinate newCool;
int gapX = x - baseX;
int gapY = y - baseY;
newCool.y = baseY + gapX;
newCool.x = baseX - gapY;
return newCool;
}
void makeCurve(int startX, int startY, int d, int g) {
vector <coordinate> curves;
curves.push_back({ startX, startY });
// 0세대 만들기
int endX = startX + dx[d];
int endY = startY + dy[d];
curves.push_back({ endX, endY });
// 1세대 이상일때
if (g > 0) {
for (int gen = 0; gen < g; gen++)
{
coordinate newCoor;
// 돌려야 할 좌표 개수: 0->1세대는 1개, 1->2세대는 2개, 2->3세대는 4개, ...
// 맨 마지막에 끝좌표 업데이트를 위해 일부러 거꾸로 인덱스
for (int i = pow(2, gen) - 1; i >= 0; i--)
{
int nowX = curves[i].x;
int nowY = curves[i].y;
newCoor = rotate(endX, endY, nowX, nowY);
curves.push_back(newCoor);
}
endX = newCoor.x; // 맨 마지막꺼 업데이트
endY = newCoor.y;
}
}
for (int i = 0; i < curves.size(); i++)
{
coordinate temp = curves[i];
if (temp.x >= 0 && temp.y >= 0 && temp.x <= 100 && temp.y <= 100) // 커브 점 MAP에 찍기
MAP[temp.y][temp.x] = 1;
}
}
int main() {
cin >> N;
for (int i = 0; i < N; i++)
{
int startX, startY, d, g;
cin >> startX >> startY >> d >> g;
makeCurve(startX, startY, d, g);
}
for (int i = 0; i <= 99; i++) // MAP 좌표가 네 귀퉁이 모두 1이면 answer++
{
for (int j = 0; j <= 99; j++)
{
if (MAP[i][j] == 1 && MAP[i + 1][j] == 1 && MAP[i][j + 1] == 1 && MAP[i + 1][j + 1] == 1)
answer++;
}
}
cout << answer;
return 0;
}
'알고리즘 > 문제풀이' 카테고리의 다른 글
[SWEA] 2382 미생물 격리 with C++ (0) | 2024.02.21 |
---|---|
[백준] 14503 로봇 청소기 with C++ (삼성기출) (1) | 2024.02.19 |
[SWEA] 5656 벽돌깨기 with C++ (0) | 2024.02.19 |
[SWEA] 1767 프로세서 연결하기 with C++ (0) | 2024.02.19 |
[SWEA] 5650 핀볼 게임 with C++ (0) | 2024.02.18 |