Deff_Dev

[코드업] 생명 게임 1 (C++) 본문

코딩테스트/코드업

[코드업] 생명 게임 1 (C++)

Deff_a 2024. 3. 27. 00:33
 

생명 게임 1

25x25격자 정보가 입력된다. 총 25행, 25열이 입력된다. 생명이 있는 경우 1, 생명이 없는 경우 0으로 표시하며, 각 정보는 띄어쓰기로 구분된다.

codeup.kr

 

문제

이 문제는 0(빈칸)과 1(생명)으로 이루어진 25 x 25 맵에서 한 세대가 지날 때 마다 조건에 따라 생명이 죽고 태어난다.

 

조건

  1. 생명이 없는 칸의 주위 8칸에 정확히 3마리의 생명이 존재하는 경우 다음 세대에 그 칸에서 생명이 탄생한다.
  2. 생명이 있는 칸의 주위 8칸에 4마리 이상 또는 1마리 이하의 생명이 존재하는 경우 다음 세대에 그 칸의 생명은 죽는다.
  3. 생명이 있는 칸의 주위 8칸에 2마리 또는 3마리의 생명이 존재하는 경우 다음 세대에 그 칸의 생명은 생존한다.

현재 세대의 맵이 입력될 때, 위 조건에 따라 다음 세대의 맵을 출력한다.

 

풀이

  1. 현재 세대의 맵을 입력 받는다.
  2. 다음 세대의 맵을 현재 세대의 맵과 동일하게 초기화한다.
  3. 현재 세대의 맵을 순회하면서 각 칸마다 8방향으로 탐색하여 생명(1)의 개수를 세고, 조건에 따라 다음 세대의 맵을 갱신한다.
  4. 모든 칸에 대해 탐색을 완료한 후에 다음 세대의 맵을 출력한다.
#include <iostream>
// https://codeup.kr/problem.php?id=1515
using namespace std;

int map[26][26] = { 0, }; // 맵
int printMap[26][26] = { 0, }; // 다음 세대 맵

// 8 방향을 나타내는 배열 => x방향, y방향
int dx[8] = { 1,1,1,-1,-1,-1,0,0 };
int dy[8] = { -1,1,0,-1,1,0,1,-1 };

void NextGeneration() {
	for (int i = 1; i <= 25; i++) {
		for (int j = 1; j <= 25; j++) {
			int count = 0;
			for (int x = 0; x < 8; x++) { // 8 방향 탐색
				if (map[i + dx[x]][j + dy[x]] == 1) { // 생명이 있을 경우 count ++
					count++;
				}
			}
			// 생명이 없는 칸 주변에 3개의 생명이 있을 때 생명 탄생
			if (map[i][j] == 0 && count == 3) {
				printMap[i][j] = 1;
			}
			else if (map[i][j] == 1 && (count >= 4 || count <= 1)) {
				// 생명이 있는 칸 주변에 4마리 이상 또는 1마리 이하의 생명이 있을 때 그 칸의 생명은 죽음
				printMap[i][j] = 0;
			}
		}
	}
}
int main() {
	
	for (int i = 1; i <= 25; i++) { // 맵 입력
		for (int j = 1; j <= 25; j++) {
			cin >> map[i][j];
			printMap[i][j] = map[i][j];
		}
	}

	NextGeneration();

	for (int i = 1; i <= 25; i++) { // 다음 세대 맵 출력
		for (int j = 1; j <= 25; j++) {
			cout << printMap[i][j] << " ";
		}
		cout << endl;
	}
	return 0;
}​

 

 

CodingTestPractice/CodeUp/2차원 배열/생명 게임 1.cpp at main · seungdo1234/CodingTestPractice

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

github.com