문제
여행가 A는 N x N 크기의 정사각형 공간 위에 서 있다. 이 공간은 1 x 1 크기의 정사각형으로 나누어져 있다. 가장 왼쪽 위 좌표는 (1,1)이며, 가장 오른쪽 아래 좌표는 (N,N)에 해당한다. 여행가 A는 상, 하, 좌, 우 방향으로 이동할 수 있으며, 시작 좌표는 항상 (1,1)이다. 우리 앞에는 여행가 A가 이동할 계획이 적힌 계획서가 놓여있다.
계획서에는 하나의 줄에 띄어쓰기를 기준으로 L, R, U, D중 하나의 문자가 반복적으로 적혀 있다. 각 문자의 의미는 다음과 같다.
L : 왼쪽으로 한 칸 이동
R : 오른쪽으로 한 칸 이동
U : 위로 한 칸 이동
D: 아래로 한 칸 이동
이때 여행가 A가 N x N 크기의 정사각형 공간을 벗어나는 움직임은 무시된다. 예를 들어 (1,1)의 위치에서 L 혹은 U를 만나면 무시된다.
다음은 N = 5인 지도와 계획서이다.
이 경우 6개의 명령에 따라서 여행가가 움직이게 되는 위치는 순서대로 (1,2), (1,3), (1,4), (2,4), (3,4)이므로, 최종적으로 여행가 A가 도착하게 되는 곳의 좌표는 (3,4)이다. 다시 말해 3행 4열의 위치에 해당하므로 (3,4)라고 적는다. 계획서가 주어졌을 때 여행가 A가 최종적으로 도착할 지점의 좌표를 출력하는 프로그램을 작성하시오.
입력 조건
첫쨰 줄에 공간의 크기를 나타내는 N이 주어진다. (1 <= N <= 100)
둘째 줄에 여행가 A가 이동할 계획서 내용이 주어진다. (1 <= 이동횟수 <= 100)
출력 조건
첫째 줄에 여행가 A가 최종적으로 도착할 지점의 좌표 (X,Y)를 공백으로 구분하여 출력한다.
입력 예시
5
R R R U D D
출력 에시
3 4
UDLR.c
#include <stdio.h>
int main(){
int n;
int x=1, y=1;
char c[100];
scanf("%d",&n);
getchar();
scanf("%[^\n]",c);
for(int i=0;c[i] != '\0';i++){
if(c[i] == ' ')
continue;
switch(c[i]){
case 'U':
if(x == 1){
break;
}
x--;
break;
case 'D':
if(x == n){
break;
}
x++;
break;
case 'L':
if(y == 1){
break;
}
y--;
break;
case 'R':
if(y == n){
break;
}
y++;
break;
}
}
printf("%d %d\n",x,y);
}
이번 문제는 알고리즘 자체는 바로 떠올라 어려운 편은 아니였지만 c로 옮기는데 꽤 고생한 문제이다.
처음 보는 문법은 %[^c] 라는 서식문자인데 scanf에서 이 서식문자를 만나면 c 자리에 있는 문자가 나올때 까지 입력을 받는다.
여기서 나는 개행문자인 '\n'을 사용했다. 이 이유는 scanf는 문자열을 받을 때 공백을 구분자로 인식하기 때문이다. 그래서 저 서식문자로 공백또한 포함시킨다는 명령을 내렸다.
그 이후 문제는 공백 문자가 스트림에 남아있다는 점이다. 이 점으로 인해 문자열을 받는 scanf가 스트림에 그대로 남은 개행문자때문에 실행되지 않는 오류가 있었다.
그래서 getchar()을 사용하여 스트림을 비워주는 작업을 한 후 문자열을 받도록 하였다.
스위치문에선 띄어쓰기는 무시하고 문자일 경우에만 코드를 진행하게 하였다.
쉬운 문제였지만 너무 오래 고생한 감이 있다.
다음은 이코테에서 제공하는 코드들이다.
UDLR.py
# N 입력받기
n = int(input())
x, y = 1, 1
plans = input().split()
# L, R, U, D에 따른 이동 방향
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]
move_types = ['L', 'R', 'U', 'D']
# 이동 계획을 하나씩 확인
for plan in plans:
# 이동 후 좌표 구하기
for i in range(len(move_types)):
if plan == move_types[i]:
nx = x + dx[i]
ny = y + dy[i]
# 공간을 벗어나는 경우 무시
if nx < 1 or ny < 1 or nx > n or ny > n:
continue
# 이동 수행
x, y = nx, ny
print(x, y)
UDLR.cpp
#include <bits/stdc++.h>
using namespace std;
// N을 입력받기
int n;
string plans;
int x = 1, y = 1;
// L, R, U, D에 따른 이동 방향
int dx[4] = {0, 0, -1, 1};
int dy[4] = {-1, 1, 0, 0};
char moveTypes[4] = {'L', 'R', 'U', 'D'};
int main(void) {
cin >> n;
cin.ignore(); // 버퍼 비우기
getline(cin, plans);
// 이동 계획을 하나씩 확인
for (int i = 0; i < plans.size(); i++) {
char plan = plans[i];
// 이동 후 좌표 구하기
int nx = -1, ny = -1;
for (int j = 0; j < 4; j++) {
if (plan == moveTypes[j]) {
nx = x + dx[j];
ny = y + dy[j];
}
}
// 공간을 벗어나는 경우 무시
if (nx < 1 || ny < 1 || nx > n || ny > n) continue;
// 이동 수행
x = nx;
y = ny;
}
cout << x << ' ' << y << '\n';
return 0;
}
'Study > CodingTest' 카테고리의 다른 글
[Programmers] Lv.1 - 삼각형의 완성조건 (2) (0) | 2022.10.31 |
---|---|
[Programmers] Lv.1 - 삼총사 (0) | 2022.10.31 |
[이코테/Python] 1장 그리디 - 1이 될 때 까지 (0) | 2022.10.11 |
[이코테/Python] 1장 그리디 - 숫자 카드 게임 (0) | 2022.10.11 |
[이코테/Python] 1장 그리디 - 큰 수의 법칙 (0) | 2022.10.08 |
문제
여행가 A는 N x N 크기의 정사각형 공간 위에 서 있다. 이 공간은 1 x 1 크기의 정사각형으로 나누어져 있다. 가장 왼쪽 위 좌표는 (1,1)이며, 가장 오른쪽 아래 좌표는 (N,N)에 해당한다. 여행가 A는 상, 하, 좌, 우 방향으로 이동할 수 있으며, 시작 좌표는 항상 (1,1)이다. 우리 앞에는 여행가 A가 이동할 계획이 적힌 계획서가 놓여있다.
계획서에는 하나의 줄에 띄어쓰기를 기준으로 L, R, U, D중 하나의 문자가 반복적으로 적혀 있다. 각 문자의 의미는 다음과 같다.
L : 왼쪽으로 한 칸 이동
R : 오른쪽으로 한 칸 이동
U : 위로 한 칸 이동
D: 아래로 한 칸 이동
이때 여행가 A가 N x N 크기의 정사각형 공간을 벗어나는 움직임은 무시된다. 예를 들어 (1,1)의 위치에서 L 혹은 U를 만나면 무시된다.
다음은 N = 5인 지도와 계획서이다.
이 경우 6개의 명령에 따라서 여행가가 움직이게 되는 위치는 순서대로 (1,2), (1,3), (1,4), (2,4), (3,4)이므로, 최종적으로 여행가 A가 도착하게 되는 곳의 좌표는 (3,4)이다. 다시 말해 3행 4열의 위치에 해당하므로 (3,4)라고 적는다. 계획서가 주어졌을 때 여행가 A가 최종적으로 도착할 지점의 좌표를 출력하는 프로그램을 작성하시오.
입력 조건
첫쨰 줄에 공간의 크기를 나타내는 N이 주어진다. (1 <= N <= 100)
둘째 줄에 여행가 A가 이동할 계획서 내용이 주어진다. (1 <= 이동횟수 <= 100)
출력 조건
첫째 줄에 여행가 A가 최종적으로 도착할 지점의 좌표 (X,Y)를 공백으로 구분하여 출력한다.
입력 예시
5
R R R U D D
출력 에시
3 4
UDLR.c
#include <stdio.h>
int main(){
int n;
int x=1, y=1;
char c[100];
scanf("%d",&n);
getchar();
scanf("%[^\n]",c);
for(int i=0;c[i] != '\0';i++){
if(c[i] == ' ')
continue;
switch(c[i]){
case 'U':
if(x == 1){
break;
}
x--;
break;
case 'D':
if(x == n){
break;
}
x++;
break;
case 'L':
if(y == 1){
break;
}
y--;
break;
case 'R':
if(y == n){
break;
}
y++;
break;
}
}
printf("%d %d\n",x,y);
}
이번 문제는 알고리즘 자체는 바로 떠올라 어려운 편은 아니였지만 c로 옮기는데 꽤 고생한 문제이다.
처음 보는 문법은 %[^c] 라는 서식문자인데 scanf에서 이 서식문자를 만나면 c 자리에 있는 문자가 나올때 까지 입력을 받는다.
여기서 나는 개행문자인 '\n'을 사용했다. 이 이유는 scanf는 문자열을 받을 때 공백을 구분자로 인식하기 때문이다. 그래서 저 서식문자로 공백또한 포함시킨다는 명령을 내렸다.
그 이후 문제는 공백 문자가 스트림에 남아있다는 점이다. 이 점으로 인해 문자열을 받는 scanf가 스트림에 그대로 남은 개행문자때문에 실행되지 않는 오류가 있었다.
그래서 getchar()을 사용하여 스트림을 비워주는 작업을 한 후 문자열을 받도록 하였다.
스위치문에선 띄어쓰기는 무시하고 문자일 경우에만 코드를 진행하게 하였다.
쉬운 문제였지만 너무 오래 고생한 감이 있다.
다음은 이코테에서 제공하는 코드들이다.
UDLR.py
# N 입력받기
n = int(input())
x, y = 1, 1
plans = input().split()
# L, R, U, D에 따른 이동 방향
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]
move_types = ['L', 'R', 'U', 'D']
# 이동 계획을 하나씩 확인
for plan in plans:
# 이동 후 좌표 구하기
for i in range(len(move_types)):
if plan == move_types[i]:
nx = x + dx[i]
ny = y + dy[i]
# 공간을 벗어나는 경우 무시
if nx < 1 or ny < 1 or nx > n or ny > n:
continue
# 이동 수행
x, y = nx, ny
print(x, y)
UDLR.cpp
#include <bits/stdc++.h>
using namespace std;
// N을 입력받기
int n;
string plans;
int x = 1, y = 1;
// L, R, U, D에 따른 이동 방향
int dx[4] = {0, 0, -1, 1};
int dy[4] = {-1, 1, 0, 0};
char moveTypes[4] = {'L', 'R', 'U', 'D'};
int main(void) {
cin >> n;
cin.ignore(); // 버퍼 비우기
getline(cin, plans);
// 이동 계획을 하나씩 확인
for (int i = 0; i < plans.size(); i++) {
char plan = plans[i];
// 이동 후 좌표 구하기
int nx = -1, ny = -1;
for (int j = 0; j < 4; j++) {
if (plan == moveTypes[j]) {
nx = x + dx[j];
ny = y + dy[j];
}
}
// 공간을 벗어나는 경우 무시
if (nx < 1 || ny < 1 || nx > n || ny > n) continue;
// 이동 수행
x = nx;
y = ny;
}
cout << x << ' ' << y << '\n';
return 0;
}
'Study > CodingTest' 카테고리의 다른 글
[Programmers] Lv.1 - 삼각형의 완성조건 (2) (0) | 2022.10.31 |
---|---|
[Programmers] Lv.1 - 삼총사 (0) | 2022.10.31 |
[이코테/Python] 1장 그리디 - 1이 될 때 까지 (0) | 2022.10.11 |
[이코테/Python] 1장 그리디 - 숫자 카드 게임 (0) | 2022.10.11 |
[이코테/Python] 1장 그리디 - 큰 수의 법칙 (0) | 2022.10.08 |