[구름톤 챌린지] GameJam

ppparkta·2023년 8월 25일
1

Problem solving

목록 보기
60/65
post-thumbnail

GameJam

문제

풀이

정답은 맞췄는데 조건을 고민해보며 이것저것 수정하다가 얻어걸린 느낌이 들어서 조금 찝찝하다.

문제를 풀 때 고민했던 조건은 딱 두가지였다.

  • 첫번째는 x와 y좌표,
  • 두번째는 U와 D command에 대해서였다.

두번째 조건부터 생각해보면, 보통은 배열을 그림으로 표현할 때 y값이 더 큰 값이 하단에 위치하게 된다. 따라서 up이라고 하면 배열 그림 상에서는 아래로 내려가는 느낌이 된다. 그런데 이 문제는 지문에서 이 문제에서 위쪽은 행 번호가 감소하는 방향이다. 라고 명시했기 때문에 명확하게 이해하고 구현할 수 있었다.

첫번째로 고민했던 x와 y좌표는... 이건 내 국어능력의 문제인 것 같은데, 지문에서 Rg번째 행 Cg번째 열에 말을 올려두었다고 명시하고 있다. row, coulmn으로 이해하고 R을 x, C를 y라고 생각하고 풀었다. 그런데 여기서는 R이 y, C가 x였다. 생각해보면 위에서 up, down command를 얘기할 때에도 위쪽이 행 번호가 감소하는 방향이라고 명시하였으니 문제는 일관적으로 얘기하고 있었던 것 같다.

여기서 놓쳐서 꽤 많은 시간을 낭비했다.

로직을 보자면, 배열 map, tmp, check를 사용해서 맵 검사를 하고 있다. 처음에 종료조건을 놓치고 문제를 풀기 시작해서, 한번 도착했던 좌표에 다시 도착할 경우 같은 경로를 반복하게 되므로 종료되도록 설계했는데, 도착지가 아니더라도 한번이라도 방문한 좌표에 다시 도착할 경우 종료하라는 문구가 있었다. 따라서 해당 부분을 구현하기 위해 사용했던 check배열은 필요 없을 것 같다.

코드가 많이 비효율적이고 더러워져서 아쉬운데, 간단하게 네개의 연산을 수행하면서 count변수의 값을 증가시켰다.

command가 200R 과 같은 형태로 들어오기 때문에 string의 substr함수를 이용해서 입력받은 커맨드를 횟수와 방향으로 분리했다.

이렇게 오래 걸릴 문제가 아니었는데 느긋하게 정리하면서 풀다보니 많은 시간이 걸렸다. 그래도 맞춰서 뿌듯함

문제에 박힌 싫어요 보는 재미도 쏠쏠...

#include <iostream>
#include <string.h>
using namespace std;
int n, gx,gy,px,py;
string map[201][201];
int tmp[201][201];
bool check[201][201];

int check_cnt(int n,int x, int y, int count){
	memset(tmp,0,sizeof(tmp));
	memset(check,false,sizeof(check));
	
	
	while(true){
		if (tmp[y][x]!=1){
			count++;
			tmp[y][x]=1;
		}
		check[y][x]=true;
		string first=map[y][x].substr(0, map[y][x].size()-1);
		int cnt=stoi(first);
		string command=map[y][x].substr(map[y][x].size()-1, map[y][x].size());
		if (command=="L")
		{
			for (int i=0;i<cnt;i++){
				x-=1;
				if (x<0)
					x=n-1;
				if (check[y][x]==true){
					return count;
				}
				check[y][x]=true;
				if (tmp[y][x]!=1)
				{
					tmp[y][x]=1;
					count++;
				}
			}
		}
		else if (command=="D"){
			for (int i=0;i<cnt;i++){
				y+=1;
				if (y>=n)
					y=0;
				if (check[y][x]==true){
					return count;
				}
				check[y][x]=true;
				if (tmp[y][x]!=1)
				{
					tmp[y][x]=1;
					count++;
				}
			}
		}
		else if (command=="U"){
			for (int i=0;i<cnt;i++){
				y-=1;
				if (y<0)
					y=n-1;
				if (check[y][x]==true){
					return count;
				}
				check[y][x]=true;
				if (tmp[y][x]!=1)
				{
					tmp[y][x]=1;
					count++;
				}
			}
		}
		else if (command=="R"){
			for (int i=0;i<cnt;i++){
				x+=1;
				if (x>=n)
					x=0;
				if (check[y][x]==true){
					return count;
				}
				check[y][x]=true;
				if (tmp[y][x]!=1)
				{
					tmp[y][x]=1;
					count++;
				}
			}
		}
	}
	return count;
}
int main() {
	cin>>n>>gy>>gx>>py>>px;
	gx-=1;
	gy-=1;
	px-=1;
	py-=1;
	for(int i=0;i<n;i++) for(int j=0;j<n;j++) {
		cin>>map[i][j];
	}
	int g_count=check_cnt(n,gx,gy,0);
	int p_count=check_cnt(n,px,py,0);
	if (g_count>p_count)
		cout<<"goorm "<<g_count;
	else
		cout<<"player "<<p_count;
	return 0;
}
profile
겉촉속촉

0개의 댓글