백준의 킹(1063) 문제이다.
( 문제 바로가기 )
[ 문제풀이 ]
1) 이 문제는 문제의 조건대로 그대로 구현해주면 되는 시뮬레이션 문제이다. 구현하기 전, 우리가 고려해야될 몇가지에 대해서
파악하고 들어가보자.
1. 열은 A ~ H , 행은 8 ~ 1 이다.
즉, 맵의 가장 왼쪽위가 A1이 아닌, A8이라는 것이다. 열은 A~H이기 때문에 이를 숫자로 바꿔버리면 1열 ~ 8열 순서대로
되어있지만, 행 같은 경우 8 ~ 1 로 감소하는 순으로 주어졌기 때문에 8행 1열을 입력받았을 때 우리는 이를 1행 1열로
계산을 해줘야 한다는 것이다.
그렇다면 우리는 계산할 때, 이 부분에 주의를 해줘야 한다는 것을 알고있자.
2. 킹을 움직이는데, 맵 밖으로 나가게 되는 경우, 그 명령을 건너 뛰어야 한다.
킹을 무작정 움직이다가 맵 밖으로 나가게 되면 그 명령을 건너뛰어야 한다. 킹을 맵 밖으로 보내버리면 안된다.
3. 킹을 움직이는데, 돌을 만나게 되는 경우, 돌도 킹과 같은 방향으로 움직여야 한다.
킹이 움직일 때 마다, 돌의 위치와 같은 위치인지 항상 생각해줘야 하고, 그럴 경우와 아닌 경우에 대해
처리해야될 부분이 다르다.
2) 1번부터 들어가보자. 먼저, 명령에 따라서 우리는 8칸을 움직일 수가 있다.
이렇게 총 8칸을 움직이는데, 위의 명령에 따라서 x, y 값이 어떻게 바뀌는지 알아보자.
중요한건 y값이다. 가장 아래 행이 1행이고, 가장 위의 행이 8행이기 때문에, 북쪽으로 갈수록 y값은 증가, 남쪽으로 갈수록
y값은 감소한다는 점 주의하자.
2번은 킹이 한번 움직일 때 마다 맵의 범위 내에 있는 체크해주면 된다. 움직이려는 좌표점의 x , y값이 1보다 크거나 같고
8보다 작거나 같으면 맵의 범위 내에 있는 것이다.
3번은 2번 안에 속해야 되는 내용이다. 범위 체크를 하는 것에 대한 순서를 정리해보자.
- 1. 움직이려는 킹의 좌표가 맵의 범위내에 있는지 ??
- 2. 맵의 범위 내에 있다면, 혹시 그 좌표가 돌이 있는 좌표인지 아닌지 ??
- 2.1 돌이 있는 곳이라면, 돌을 킹과 같은 방향으로 움직였을 때, 돌 또한 맵의 범위내에 있는지?
- 2.2 돌이 없는 곳이라면, 그대로 진행.
이런 순서로 진행되어야 한다.
구현 자체는 어려운 부분이 없으니, 소스코드를 참고하길 바란다.
[ 소스코드 ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 | // 열 = A ~ H / a b c d e f g h 8 // 행 = 1 ~ 8 / 8행 #include<iostream> #include<string> #define MAX 51 using namespace std; int N, Kx, Ky, Rx, Ry; string Move[MAX]; void Input() { char a; cin >> a >> Ky; Kx = a - 'A' + 1; cin >> a >> Ry; Rx = a - 'A' + 1; cout << "King = " << Kx << Ky << endl; cout << "Rock = " << Rx << Ry << endl; cin >> N; for (int i = 0; i < N; i++) { cin >> Move[i]; } //for (int i = 0; i < N; i++) cout << Move[i] << endl; } bool SamePosition(int Kx, int Ky, int Rx, int Ry) { if (Kx == Rx && Ky == Ry) return true; return false; } bool RangeCheck(int x, int y) { if (x < 1 || y < 1 || x > 8 || y > 8) return false; // 범위밖을 나가버리면 false를 반환 return true; // 아니면 true를 반환 } void Movement() { for (int i = 0; i < N; i++) { if (Move[i] == "R") { if (RangeCheck(Kx + 1, Ky)) { Kx++; if (SamePosition(Kx, Ky, Rx, Ry)) { if (RangeCheck(Rx + 1, Ry)) Rx++; else Kx--; } } } else if (Move[i] == "L") { if (RangeCheck(Kx - 1, Ky)) { Kx--; if (SamePosition(Kx, Ky, Rx, Ry)) { if (RangeCheck(Rx - 1, Ry)) Rx--; else Kx++; } } } else if (Move[i] == "B") { if (RangeCheck(Kx, Ky - 1)) { Ky--; if (SamePosition(Kx, Ky, Rx, Ry)) { if (RangeCheck(Rx, Ry - 1)) Ry--; else Ky++; } } } else if (Move[i] == "T") { if (RangeCheck(Kx, Ky + 1)) { Ky++; if (SamePosition(Kx, Ky, Rx, Ry)) { if (RangeCheck(Rx, Ry + 1)) Ry++; else Ky--; } } } else if (Move[i] == "RT") { if (RangeCheck(Kx + 1, Ky + 1)) { Kx++; Ky++; if (SamePosition(Kx, Ky, Rx, Ry)) { if (RangeCheck(Rx + 1, Ry + 1)) { Rx++; Ry++; } else { Kx--; Ky--; } } } } else if (Move[i] == "LT") { if (RangeCheck(Kx - 1, Ky + 1)) { Kx--; Ky++; if (SamePosition(Kx, Ky, Rx, Ry)) { if (RangeCheck(Rx - 1, Ry + 1)) { Rx--; Ry++; } else { Kx++; Ky--; } } } } else if (Move[i] == "RB") { if (RangeCheck(Kx + 1, Ky - 1)) { Kx++; Ky--; if (SamePosition(Kx, Ky, Rx, Ry)) { if (RangeCheck(Rx + 1, Ry - 1)) { Rx++; Ry--; } else { Kx--; Ky++; } } } } else if (Move[i] == "LB") { if (RangeCheck(Kx - 1, Ky - 1)) { Kx--; Ky--; if (SamePosition(Kx, Ky, Rx, Ry)) { if (RangeCheck(Rx - 1, Ry - 1)) { Rx--; Ry--; } else { Kx++; Ky++; } } } } } char Result_King = Kx + 'A' - 1; char Result_Rock = Rx + 'A' - 1; cout << Result_King << Ky << endl; cout << Result_Rock << Ry << endl; } void Solution() { Movement(); } void Solve() { Input(); Solution(); } int main(void) { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); freopen("Input.txt", "r", stdin); Solve(); return 0; } | cs |
'[ BOJ Code ] > # BOJ -' 카테고리의 다른 글
[ 백준 1339 ] 단어수학 (C++) (0) | 2019.02.02 |
---|---|
[ 백준 1965 ] 상자넣기 (C++) (0) | 2019.02.02 |
[ 백준 2239 ] 스도쿠 (C++) (0) | 2019.02.02 |
[ 백준 2225 ] 합분해 (C++) (4) | 2019.02.01 |
[ 백준 15654 , 15655 ] N과M(5) , N과M(6) (C++) (0) | 2019.02.01 |