프로그래밍/C++

2873 롤러코스터 [C++]

김파츠 2023. 8. 26. 20:57

https://www.acmicpc.net/problem/2873

 

2873번: 롤러코스터

첫째 줄에 가장 가장 큰 기쁨을 주는 롤러코스터는 가장 왼쪽 위 칸부터 가장 오른쪽 아래 칸으로 어떻게 움직이면 되는지를 출력한다. 위는 U, 오른쪽은 R, 왼쪽은 L, 아래는 D로 출력한다. 정답

www.acmicpc.net

#include <iostream>
#include <string>
#define MAX 1000
using namespace std;


int main(int argc, char** argv) {
	
	int R, C;
	int arr[MAX][MAX];
	string str = "";


	//제일 작은 기쁨을 가진 검은 칸
	pair<int, int> MinHappyPos; //좌표
	int MinHappyVal = MAX; //기쁨값

	cin >> R >> C;
	for (int i = 0; i < R; i++) {
	    
		for (int j = 0; j < C; j++) {
		    //cout << "i: " << i << " j: " << j << '\n';
			cin >> arr[i][j];

			//현재 칸이 검은 칸이고 지금 기쁨값보다 작을 때
			if (arr[i][j] < MinHappyVal && ((i+j)%2==1) ) {
				//갱신해주기
				MinHappyPos.first = j; //x
				MinHappyPos.second = i; //y

				MinHappyVal = arr[i][j]; //기쁨값
			}
		}
	}


	
	if (R % 2 == 1) {
		//1) 세로가 홀수이고 가로가 짝수일 때
		//횡방향(<-->)으로 이동

		for (int i = 0; i < R; i++) {
			for (int j = 0; j < C - 1; j++) {
				if (i % 2 == 1) str += 'L';
				else str += 'R';
			}
			if(i!=R-1) str += 'D';
		}
	}
	else if (C % 2 == 1) {
		//2) 세로가 짝수이고 가로가 홀수일 때
		//종방향(↑↓)으로 이동

		for (int i = 0; i < C; i++) {
			for (int j = 0; j < R - 1; j++) {
				if (i % 2 == 1) str += 'U';
				else str += 'D';
			}
			if (i != C- 1) str += 'R';
		}

	}
	else {
	   //3) 세로 가로 모두 짝수일 때

	   int MinR = (MinHappyPos.second % 2==0) ? MinHappyPos.second : MinHappyPos.second - 1;
	   int MinC = MinHappyPos.first;

	   //1. 검은칸이 있는 두 줄의 행까지 다다르기 전
	   //횡방향(<-->)으로 이동
	  
		for (int i = 0; i < MinR; i++) {
			   for (int j = 0; j < C - 1; j++) {
				   if (i % 2 == 1)str += 'L';
				   else str += 'R';
			   }
			   if (i != R - 1) str += 'D';
		}
	   
	   

	   //2. 검은칸이 있는 두 줄의 행까지 다다른 후 (검은 칸 만나기 전)
	   for (int i = 0; i < MinC; i++) {
		   if (i % 2 == 1)str += "UR";
		   else str += "DR";
	   }

	   //3. 검은칸이 있는 두 줄의 행까지 다다른 후 (검은 칸 만난 후)
	   for (int i = MinC; i < C-1; i++) {
		   if (i % 2 == 1)str += "RU";
		   else str += "RD";
	   }
       
     
	   //4. 나머지 칸 (끝 점 까지)
	   for (int i = MinR + 2; i < R; i++) {
		    str += 'D';
		   for (int j = 0; j < C - 1; j++) {
			   if (i % 2 == 1)str += 'R';
			   else str += 'L';
		   }
	   }

	}

	cout << str;


}

참고자료

https://se-jung-h.tistory.com/entry/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98C-%EB%B0%B1%EC%A4%80-2873-%EB%A1%A4%EB%9F%AC%EC%BD%94%EC%8A%A4%ED%84%B0

 

알고리즘(C++) / 백준 2873 : 롤러코스터

2873 www.acmicpc.net/problem/2873 2873번: 롤러코스터 첫째 줄에 가장 가장 큰 기쁨을 주는 롤러코스터는 가장 왼쪽 위 칸부터 가장 오른쪽 아래 칸으로 어떻게 움직이면 되는지를 출력한다. 위는 U, 오른

se-jung-h.tistory.com

https://www.slideshare.net/Baekjoon/baekjoon-online-judge-2873

 

Baekjoon Online Judge 2873번 풀이

choi@startlink.io https://www.acmicpc.net/problem/2873 • R  *  C • (1,  1)  -­‐>  (R,  C) • • https://www.acmicpc.net/problem/2873 • R C https:/...

www.slideshare.net