본문 바로가기
Programming/Algorithm

미궁속의 방

by OKOK 2018. 1. 24.

#include<iostream>

using namespace std;


int N, K;

char move_array[300001];

long long res;


void problem_in()

{

cin >> N >> K;

cin >> move_array;

}


void solving()

{

int ik;

int i, j, z;

char d;

int test;

long long val, inc;


i = 1; j = 1; val = 1; res = 1;

for (ik = 0; ik<K; ik++)

{

d = move_array[ik];


if (d == 'L') j--;

if (d == 'U') i--;


test = (i + j) + (i + j >= N + 1);

test % 2 == 0 ? z = i : z = j;


inc = 2 * z - (test + (d == 'L') + (d == 'R')) % 2;

if (i + j >= N + 1) inc = 2 * N - inc;


if (d == 'R') { val += inc; j++; }

if (d == 'D') { val += inc; i++; }

if (d == 'L' || d == 'U') val -= inc;


res += val;

}

}


int main()

{

int T, it;

cin >> T;


for (it = 1; it <= T; it++)

{

problem_in();

solving();


cout << "Case #" << it << endl

<< res << endl;

}


return 0;

}

 


예를 들어 6바이 6행렬을 만들고서 움직이는 것은 이해가 가는데, 어떻게 만드는 것이지, 어떻게 이런 행렬을 만드는 것이지, 1차원 행렬이 아니고, 2차원 행렬로 만들어볼까요. 2차원 행렬로 만드는 것이 가능한지 궁금합니다. 그리고 먼저 모든 값을 알고 있다고 가정합니다. 그리고 상관관계가 어떻게 되어 있는지 알고 있다고 가정한 겂입니다. 오케이요. 아 그럼 넣을 필요는 없으므로 이동했을 때의 값을 알고 있으면 됩니다. 1차원 행렬이 아닌 2차원 행렬로 가정하고 풀이를 하면 됩니다. 일차원 값들은 어떻게 진행되는지, 열행렬들은 어떻게 진행되는지 관찰을 잘 하면 됩니다. 


이런 규칙들을 어떻게 찾아낼 수 있을까? 그리고 인풋하는데에서 부터 동적배열을 받을 필요가 있을까.

그냥 단순하게 배열을 모두 만들어 내는게 좋다. 왜냐하면 가장 큰 숫자가 인풋으로 들어올 수 있기 때문입니다. 그러므로 2차원 동적 배열을 고려하지 않아도 됩니다. 동적배열을 고려하지 않고, 단순하게 가장 큰 배열을 만들어서 사용하면 됩니다.