Deff_Dev

[코드업] 크레이지 아케이드 (C++) 본문

코딩테스트/코드업

[코드업] 크레이지 아케이드 (C++)

Deff_a 2024. 3. 27. 14:20
 

크레이지 아케이드

-2 0 0 -1 0 -1 -1 -2 -2 -1 -2 -2 -1 0 -1 -1 -2 -2 -2 0 -2 -1 -2 -1 -2 -2 -2 0 0 0 -2 -1 -1 -2 -2 0 0 0 0 0 -1 0 0 -2 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 -2 -2 -2 -2 -2 -2 -2 -2 -2 0 0 0 0 -2 0 -2 -2 -2 0 0 0 0 0 -2 0 0 -2 0 0 2 Character

codeup.kr

문제

 

0(빈 공간), 1 이상의 수(숫자만큼 상하좌우로 터지는 물풍선), -1 (물줄기가 닿으면 멈추는 벽)으로 구성된  10 x 10  크레이지 아케이드 게임 맵과 n(플레이어의 수), 각 플레이어의 위치 좌표가 주어진다.

 

물풍선이 모두 터질 때의 맵과 각 플레이어의 생존 유무를 출력한다.  

(0은 빈공간, -1은 장애물, -2는 물풍선, 플레이어는 입력된 순서+1로 표현한다.)

풀이

1. 맵 정보를 입력을 받고 물풍선의 위치 정보를 따로 저장한다.

2. 물풍선의 갯수만큼 반복문을 돌려 4 방향으로 터트린다.

3. 플레이어 정보를 입력받고 플레이어가 생존했다면 맵에 저장한다.

4. 맵 정보와 플레이어의 상태를 출력한다.

 

#include <iostream>
#include <vector>

// https://codeup.kr/problem.php?id=1525
using namespace std;

int map[10][10] = { 0, }; // 전체 맵
vector<pair<int, int>> waterBalloons; // 물풍선의 위치 정보를 저장하는 벡터
vector<pair<int, int>> playerPos; // 플레이어의 위치 정보를 저장하는 벡터

// 4방향 배열
int dx[4] = { 1,-1,0,0 };
int dy[4] = { 0,0,1,-1 };

void Explode() {

	for (int i = 0; i < waterBalloons.size(); i++) { // 물풍선 터트림
		int x = waterBalloons[i].first, y = waterBalloons[i].second; // 물풍선의 x,y 좌표 저장
		int power = map[x][y]; // 물풍선의 파워 저장

		for (int z = 0; z < 4; z++) { // 물풍선이 4방향으로 터짐
			for (int j = 0; j <= power; j++) { // 물풍선의 파워 만큼 반복
				// 물풍선이 터졌을 때 물 줄기 x,y 좌표
				int explode_X = x + dx[z] * j;
				int explode_Y = y + dy[z] * j;

				// 물줄기가 맵을 벗어났거나 벽(-1)에 맞았을 때 물줄기는 멈춤
				if (explode_X < 0 || explode_X > 9 || explode_Y < 0 || explode_Y > 9
					|| map[explode_X][explode_Y] == -1) {
					break;
				}

				// 혹시나 다른 물풍선을 건들 수도 있으니 빈칸에만 물줄기(-2)를 저장
				if (j == 0 || map[explode_X][explode_Y] == 0) { // j == 0은 자기 자신은 터져야 하기때문에 조건에 넣음
					map[explode_X][explode_Y] = -2;
				}
			}
		}
	}
}

void PlayerState() {
	int n;

	cin >> n; // 플레이어 수 입력
	for (int i = 0; i < n; i++) { // 플레이어 수만큼 위치 입력
		int x, y;
		cin >> x >> y;
		if (map[x - 1][y - 1] == 0) {  // 물풍선이 터진 맵에 살아 남은 플레이어 번호 저장
			map[x - 1][y - 1] = i + 1;
		}
		playerPos.push_back({ x - 1, y - 1 }); // 플레이어 위치 정보 벡터에 저장
	}

	for (int i = 0; i < 10; i++) { // 전체 맵 출력
		for (int j = 0; j < 10; j++) {
			cout << map[i][j] << " ";
		}
		cout << endl;
	}

	cout << "Character Information" << endl;
	for (int i = 0; i < n; i++) { // 플레이어의 현재 상태 출력
		int state = map[playerPos[i].first][playerPos[i].second];

		if (state < 0) {
			cout << "player " << i + 1 << " dead\n";
		}
		else {
			cout << "player " << i + 1 << " survive\n";
		}
	}
}

int main() {

	for (int i = 0; i < 10; i++) { // 맵 입력
		for (int j = 0; j < 10; j++) {
			cin >> map[i][j];
			if (map[i][j] > 0) {
				waterBalloons.push_back({ i, j });
			}
		}
	}

	Explode(); // 물풍선 터짐 

	PlayerState(); // 플레이어 상태 정보 
	
	return 0;
}

 

 

 

CodingTestPractice/CodeUp/2차원 배열/크레이지 아케이드.cpp at main · seungdo1234/CodingTestPractice

코딩 테스트 연습. Contribute to seungdo1234/CodingTestPractice development by creating an account on GitHub.

github.com

 

 

코드를 이해하는 데 어려움이 있는 부분이 있거나 개선할 부분이 있다면 댓글을 달아주세요.