Skip to content

Commit

Permalink
Merge pull request #85 from HYU-PS-STUDY/wonkyDD
Browse files Browse the repository at this point in the history
[week-12] 3190, 16235
  • Loading branch information
clean2001 authored Apr 15, 2024
2 parents 811ebf8 + 722f69b commit e5ef9b4
Show file tree
Hide file tree
Showing 3 changed files with 250 additions and 0 deletions.
Empty file removed week12/wonkyDD/.gitkeep
Empty file.
133 changes: 133 additions & 0 deletions week12/wonkyDD/16235.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#define PLANE_MAX 11
using namespace std;
int dy[] = {-1, -1, -1, 0, 0, 1, 1, 1};
int dx[] = {-1, 0, 1, -1, 1, -1, 0, 1};


int N,M,K;

// NOTE : 매 겨울 채워지는 양분의 양
int plane[PLANE_MAX][PLANE_MAX];

// NOTE : 각 칸의 양분 상태
int nutrient[PLANE_MAX][PLANE_MAX];

/**
* NOTE
* - 각 칸에는 여러 개의 나무가 담길 수 있다
* - 나무의 나이가 담기게 된다
*/
vector<int> tree[PLANE_MAX][PLANE_MAX];

bool age_cmp(int a1, int a2) {
return a1 < a2;
}

bool check_bound(int y, int x) {
return y>=1 && y<=N && x>=1 && x<=N;
}

void spring_and_summer() {
// spring
for (int y=1; y<=N; ++y) {
for (int x=1; x<=N; ++x) {
if (tree[y][x].empty()) continue;

// NOTE : 가장 어린 나무가 먼저 양분을 먹는다
sort(tree[y][x].begin(), tree[y][x].end(), age_cmp);

// NOTE : 양분을 섭취하고 나이가 먹은 나무들의 나이가 담긴다
vector<int> tmp;

int die = 0;

for (int i=0; i<tree[y][x].size(); ++i) {
int age = tree[y][x][i];

if (nutrient[y][x] < age) {
die += age/2;
}
else {
nutrient[y][x] -= age;
tmp.push_back(age+1);
}
}

tree[y][x].clear();
for (const auto& n : tmp) {
tree[y][x].push_back(n);
}

// summer
nutrient[y][x] += die;
}
}
}

void fall() {
for (int y=1; y<=N; ++y) {
for (int x=1; x<=N; ++x) {
if (tree[y][x].empty()) continue;

for (int t=0; t<tree[y][x].size(); ++t) {
// NOTE : 나이가 5의 배수여야 번식 가능하다
if (tree[y][x][t]%5 != 0) continue;

for (int i=0; i<8; ++i) {
int ny=y+dy[i], nx=x+dx[i];
if (!check_bound(ny, nx)) continue;
tree[ny][nx].push_back(1);
}
}
}
}
}

void winter() {
for (int i=1; i<=N; ++i) {
for (int j=1; j<=N; ++j) {
nutrient[i][j] += plane[i][j];
}
}
}

int answer() {
int cnt = 0;
for (int i=1; i<=N; ++i) {
for (int j=1; j<=N; ++j) {
if (tree[i][j].empty()) continue;
cnt += tree[i][j].size();
}
}
return cnt;
}

int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);

cin >> N >> M >> K;
for (int i=1; i<=N; ++i) {
for (int j=1; j<=N; ++j) {
cin >> plane[i][j];
nutrient[i][j] = 5;
}
}

int y,x,age;
for (int i=0; i<M; ++i) {
cin >> y >> x >> age;
tree[y][x].push_back(age);
}

while (K--) {
spring_and_summer();
fall();
winter();
}
cout << answer();
return 0;
}
117 changes: 117 additions & 0 deletions week12/wonkyDD/3190.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
#include <iostream>
#include <unordered_map>
#include <deque>
using namespace std;
#define BOARD_MAX 101

struct snake {
int y; int x;
};

// NOTE : Up, Down, Left, Right 순서
int dy[] = {-1, 1, 0, 0};
int dx[] = {0, 0, -1, 1};

int N,K,L;
unordered_map<int, char> time_to_dir;
bool apple[BOARD_MAX][BOARD_MAX];

// NOTE : front: 꼬리, back: 머리
deque<snake> dq;
// NOTE : 뱀은 처음에 오른쪽을 향한다.
int dir=3;
bool game_over;

int dir_converter(char c) {
if (c == 'L') {
if (dir == 0) return 2;
if (dir == 1) return 3;
if (dir == 2) return 1;
if (dir == 3) return 0;
}

if (c == 'D') {
if (dir == 0) return 3;
if (dir == 1) return 2;
if (dir == 2) return 0;
if (dir == 3) return 1;
}

return -1;
}

bool check_bound(int y, int x) {
return y>=1 && y<=N && x>=1 && x<=N;
}

bool check_itself(int y, int x) {
for (const auto& p : dq) {
if (p.y == y && p.x == x) return false;
}
return true;
}

void rotate(int time) {
char l_or_d = time_to_dir[time];
dir = dir_converter(l_or_d);
}

void move() {
// NOTE : dq.back == 머리, dq.front == 꼬리
int ny = dq.back().y+dy[dir], nx = dq.back().x+dx[dir];

// NOTE : 만약 벽이나 자기자신의 몸과 부딪히면 게임이 끝난다
if (!check_bound(ny, nx) || !check_itself(ny, nx)) {
game_over = true;
return;
}

dq.push_back({ny, nx});

// NOTE : 만약 이동한 칸에 사과가 있다면, 그 칸에 있던 사과가 없어지고 꼬리는 움직이지 않는다
if (apple[ny][nx]) {
apple[ny][nx] = false;
}
// NOTE : 만약 이동한 칸에 사과가 없다면, 몸길이를 줄여서 꼬리가 위치한 칸을 비워준다. 즉, 몸길이는 변하지 않는다.
else {
for (int i=0; i<dq.size()-1; ++i) {
dq[i].y = dq[i+1].y;
dq[i].x = dq[i+1].x;
}
dq.pop_back();
}
}

int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);

cin >> N >> K;
int r,c;
for (int i=0; i<K; ++i) {
cin >> r >> c;
apple[r][c] = true;
}
cin >> L;
int t; char d;
for (int i=0; i<L; ++i) {
cin >> t >> d;
time_to_dir.insert({t, d});
}

int time = 0;
dq.push_back({1, 1});
while (1) {
game_over = false;

// NOTE : 먼저 뱀은 몸길이를 늘려 머리를 다음칸에 위치시킨다
move();
++time;

if (game_over) break;

// NOTE : 방향을 전환해야 하는 순간이면 전환한다
if (time_to_dir.find(time) != time_to_dir.end()) rotate(time);
}
cout << time;
return 0;
}

0 comments on commit e5ef9b4

Please sign in to comment.