<모든 문제는 C++를 기반으로 풀이한다.>
switch-case
문을 사용한 직관적인 방법을 사용했다.do { } while (getc(stdin) == ' ')
을 사용해도 좋지만, 여기서는 각 명령어가 띄어쓰기로 구분되어 있어서 제대로 입력을 받지 못한다.getline(cin, buffer)
함수를 이용해서 각 명령어를 하나씩 따로따로 받아오자.(y, x)
로 푸는 방법을 선호한다.U
는 위로 이동해야하므로 x를 증가시키고, D
는 x를 감소시킨다.L
은 왼쪽으로 이동해야하므로 y를 감소시키고, R
은 y를 증가시킨다.#include <iostream>
using namespace std;
int main() {
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
int N = 0; cin >> N; cin.ignore(); // getline() 함수 쓰기 위해서 버퍼 비우기.
int curX = 1, curY = 1;
string plan; getline(cin, plan); // 아예 string으로 입력받아버리기.
for (int i = 0; i < plan.size(); ++i) {
char order = plan[i];
switch (order) {
case 'U':
if (curX != 1) curX--;
break;
case 'D':
if (curX != N) curX++;
break;
case 'L':
if (curY != 1) curY--;
break;
case 'R':
if (curY != N) curY++;
break;
}
}
cout << curX << ' ' << curY << '\n';
}
#include <iostream>
using namespace std;
int main() {
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
int N = 0; cin >> N;
int cnt = 0;
for (int i = 0; i <= N; ++i)
for (int j = 0; j < 60; ++j)
for (int k = 0; k < 60; ++k)
if ((to_string(i) + to_string(j) + to_string(k)).find('3') != string::npos) cnt++;
cout << cnt << '\n';
}
3
이 없을 경우 find()
함수는 string::npos
를 반환함을 기억하자.// EX 02 :: 왕실의 나이트
#include <iostream>
using namespace std;
static constexpr int moving[8][2] {
{1, -2}, {2, -1}, {2, 1}, {1, 2},
{-1, 2}, {-2, 1}, {-2, -1}, {-1, -2}
}; // 나이트의 이동경로 변위를 (y, x)로 나타냄.
inline bool isInner(int y, int x, int num) {
int newY = y + moving[num][0], newX = x + moving[num][1];
return ((1 <= newY && newY <= 8) && (1 <= newX && newX <= 8));
}
int main() {
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
string initPos; cin >> initPos;
// 알파벳은 열(col)을 의미, 숫자는 행(row)을 의미하고, 1을 더해줘야 한다.
int x = initPos[1] - '1' + 1, y = initPos[0] - 'a' + 1;
int ans = 0;
for (int i = 0; i < 8; ++i) // 8방향 모두 테스트
if (isInner(y, x, i)) ans++;
cout << ans << '\n';
}
// EX 03 :: 개임 개발
#include <iostream>
using namespace std;
static constexpr int moving[4][2] {
{-1, 0}, {0, 1}, {1, 0}, {0, -1}
}; // 북쪽 동쪽 남쪽 서쪽
static int N, M, curX, curY, pos, map[50][50]; // 0: 육지, 1: 바다, 2: 방문
enum class state {land, ocean, visited};
int solve() {
int ret = 1;
map[curY][curX] = static_cast<int>(state::visited); // 첫 칸을 방문표시 해준다.
while(true) {
int returnCnt = 0;
for (int i = 0; i < 4; ++i) {
pos = (pos - 1 < 0) ? 3 : pos - 1; // 현재 방향의 왼쪽 방향으로 바꿔준다.
// 맵의 외곽은 항상 바다, 범위 검사 불필요하다.
if (map[curY + moving[pos][0]][curX + moving[pos][1]] == static_cast<int>(state::land)) {
curY += moving[pos][0], curX += moving[pos][1];
map[curY][curX] = static_cast<int>(state::visited); // 방문 표시한다.
ret++;
break;
}
else returnCnt++; // 갈 수 없다면 방향만 바꾸고 돌아가기 카운트 하나 증감.
}
if (returnCnt == 4) { // 더 이상 갈 곳이 없다면 뒤로 이동해야한다.
curY -= moving[pos][0], curX -= moving[pos][1];
// 뒷칸이 바다일 경우 더 이상 이동할 수 없으므로 움직임 종료.
if (map[curY][curX] == static_cast<int>(state::ocean)) break;
}
}
return ret;
}
int main() {
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
cin >> N >> M;
cin >> curX >> curY >> pos;
for (int y = 0; y < N; ++y)
for (int x = 0; x < M; ++x)
cin >> map[y][x];
cout << solve() << '\n';
}