[구름톤 챌린지] DAY 10 GameJam

OOING·2023년 8월 28일
0

백준+알고리즘 공부

목록 보기
26/75

문제

입력

입출력 예시

코드

#include <iostream>
#include <vector>
using namespace std;

int N;
vector<vector<pair<int, char>>> grid;
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};

int play(int x, int y){
	vector<vector<int>> player = vector<vector<int>> (N + 1, vector<int>(N + 1, 0));
	player[x][y] = 1;
	int score = 1;
	while(1){
		int dir;
		switch(grid[x][y].second){
			case 'U' : {
				dir = 0;
				break;
			}
			case 'D' : {
				dir = 1;
				break;
			}
			case 'L' : {
				dir = 2;
				break;
			}
			case 'R' : {
				dir = 3;
				break;
			}
		}
		int cnt = grid[x][y].first;
		while(cnt--) {
			x += dx[dir];
			y += dy[dir];
			if(x > N) x -= N;
			else if(x == 0) x += N;
			if(y > N) y -= N;
			else if(y == 0) y += N;
			if(player[x][y]) goto out;
			player[x][y] = 1;
			++score;
		}
	}
	out : return score;
}

int main() {
	cin >> N ;
	grid = vector<vector<pair<int, char>>> (N + 1, vector<pair<int, char>> (N + 1, {0, ' '}));
	int a, b, pa, pb;
	cin >> a >> b >> pa >> pb;
	
	for(int i = 1; i <= N; i++){
		for(int j = 1; j <= N; j++){
			cin >> grid[i][j].first >> grid[i][j].second;
		}
	}
	
	int gr = play(a, b);
	int pl = play(pa, pb);
	
	if(gr > pl) printf("goorm %d", gr);
	else printf("player %d", pl);
	return 0;
}

사실 switch 문과 goto는 해설을 보고 수정했다. goto는 정말 .. 거의 안 쓰는거긴 할텐데 중첩 반복문 빠져나올 때는 유용하게 사용할 수 있을 것 같다.

goto

while(1) {
	// 뭔가 있고
    while( 무언가의 조건 ) {
    	if( 무언가의 조건 2) goto out;
    }
}

out : {
	// 반복문 빠져나온 이후 코드
}

break로는 하나의 반복문만 빠져나가기 때문에 항상 flag 변수를 만들어서 내부 while문에서 flag = true; break; 로 나온 후 외부 while문에서 if(flag) break; 로 하곤 했는데. 가끔 goto 써보자😅

지문이 긴 구현 문제를 대충 읽고 푸는 버릇이 있어서(실제 코테만큼 지문이 긴 문제가 잘 없기도 하고) 이런 문제들을 좀 찾고 싶었는데 정말 우연히.. 그냥 구글링하다가 광고 달려있는걸 봤는데.. 오~ 꽤 괜찮아보여서 오늘부터 참여.
profile
HICE 19

0개의 댓글