일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 독서
- serializer
- 코딩
- bob
- 동적 프로그래밍
- bob 9기 후기
- DP
- 추리 소설
- Blind SQL Injection
- 웹 해킹
- Django Rest Framework
- 알고리즘
- 코딩공부
- 가가 형사 시리즈
- webhacking.kr
- 코딩 공부
- 백준 알고리즘
- 백준알고리즘
- best of the best
- Django Restful API
- 백엔드
- Django CRUD
- 정보 보안
- 웹 개발
- 삼성 SW 역량 테스트
- 일본 소설
- 히가시노 게이고
- 백준
- KITRI
- 백엔드 개발
- Today
- Total
요모조모 ʚɞ
[C] 백준 14499번 주사위 굴리기 본문
안녕하세요! (❁´◡`❁)
뭐했다고 벌써 3월,,, 개강이네요 ^^*
오늘은 주말 맞이 삼성 SW 역량 테스트 기출 문제를 풀어보았습니다 ~
이번 문제도 이전 문제와 마찬가지로 시뮬레이션 문제입니다.
주어진 문제의 조건을 잘 확인한 후, step by step으로 구분하여 구현하면 쉽게 해결할 수 있습니다!
저는 이번 문제를 총 4가지 단계로 나누어 수행하였습니다.
1. 주사위를 이동하기에 앞서, 현재 위치에서 이동이 가능한지 확인하기
2. (1번이 가능하다면) 주사위를 주어진 방향에 맞게 굴리기
3. 주사위 or 칸에 적절한 값 채우기
4. 출력하기
그럼 1단계부터 차례대로 살펴보도록 하겠습니다.
1. 주사위를 이동하기에 앞서, 현재 위치에서 이동이 가능한지 확인하기
문제의 조건에서 주사위를 이동시킬 때 바깥으로 이동하려고 하는 경우 해당 명령을 무시(+출력 x)하라고 하였습니다.
따라서 이동하려는 방향에 맞게 확인을 해주었습니다.
(각 배열은 0번 index부터 시작한다고 가정하겠습니다.)
- 1번(동쪽): 현재 y가 M-1이 아닌지 확인
- 2번(서쪽): 현재 y가 0이 아닌지 확인
- 3번(북쪽): 현재 x가 0이 아닌지 확인
- 4번(남쪽): 현재 x가 N-1이 아닌지 확인
예를 들어, 1번으로(동쪽) 이동하려는 경우 주사위 좌표 (x, y)의 y값을 1 증가시켜주어야 합니다.
(오른쪽 방향으로 이동해야 하기 때문)
만약 현재 y값이 M-1(주어진 가로 크기)라면 더 이상 증가시켜 줄 수 없기 때문에
2, 3, 4번 과정을 모두 pass 합니다.
2. (1번이 가능하다면) 주사위를 주어진 방향에 맞게 굴리기
1번 과정의 조건을 만족한다면 해당 방향에 맞게 주사위를 굴려줘야 합니다.
저는 주사위를 굴릴 때 방향(동, 서, 남, 북)에 따른 규칙을 찾아 구현하였습니다.
이때 주사위의 전개도를 생각하면 쉽게 구현할 수 있습니다.
위의 사진은 주사위의 이동 방향에 따른 전개도의 변화를 나타냅니다.
(전개도 안의 값들은 위치를 나타내기 위해 임의의 값을 넣었습니다.)
저는 전개도의 값을 담기 위해 dice라는 1차원 배열을 선언해주었고,
전개도의 1번 위치부터 6번 위치까지 순서대로 dice 배열에 저장하였습니다.
각 전개도 아래에 적혀있는 숫자 배열이 dice 배열에 들어갈 값을 의미합니다.
노란색으로 적혀있는 값은 주사위를 이동함으로써 변화되는 값을 의미하기 때문에,
각각의 이동 방향에 맞게 값을 변화시켜주면 됩니다.
3. 주사위 or 칸에 적절한 값 채우기
문제의 조건을 살펴보면 주사위를 굴렸을 때,
이동한 칸에 쓰여 있는 수가 0일 때와 0이 아닐 때를 구분하고 있음을 알 수 있습니다.
참고로 저는 지도의 각 칸을 나타내기 위해 map이라는 2차원 배열을 선언하였습니다.
(입력으로 들어온 지도 값을 저장)
0일 때는 주사위의 바닥면(dice 배열을 기준으로 5번 index)을 이동한 칸(map[x][y])에 복사하고,
0이 아닐 때는 칸에 쓰여 있는 수를 주사위 바닥면에 복사 + 칸을 0으로 만들어 주었습니다.
4. 출력하기
출력의 경우 주사위의 윗 면에 쓰여 있는 수를 출력하면 되기 때문에,
dice 배열의 0번째 index의 값을 출력하면 됩니다.
주어진 과정을 바탕으로 구현한 코드는 아래와 같습니다!
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int N, M, x, y, K, command;
int map[20][20];
int dice[6];
// 1번 단계
int check() {
switch (command) {
case 1:
if (y == M - 1)
return 0;
break;
case 2:
if (y == 0)
return 0;
break;
case 3:
if (x == 0)
return 0;
break;
case 4:
if (x == N - 1)
return 0;
break;
}
return 1;
}
// 2번 단계
void dice_rolling() {
int temp = 0;
temp = dice[0];
switch (command) {
case 1:
y++;
dice[0] = dice[3];
dice[3] = dice[5];
dice[5] = dice[2];
dice[2] = temp;
break;
case 2:
y--;
dice[0] = dice[2];
dice[2] = dice[5];
dice[5] = dice[3];
dice[3] = temp;
break;
case 3:
x--;
dice[0] = dice[1];
dice[1] = dice[5];
dice[5] = dice[4];
dice[4] = temp;
break;
case 4:
x++;
dice[0] = dice[4];
dice[4] = dice[5];
dice[5] = dice[1];
dice[1] = temp;
break;
}
}
// 3번 단계
void fill_value() {
if (map[x][y] == 0)
map[x][y] = dice[5];
else {
dice[5] = map[x][y];
map[x][y] = 0;
}
}
// 4번 단계
void print() {
printf("%d\n", dice[0]);
}
int main() {
scanf("%d%d%d%d%d", &N, &M, &x, &y, &K);
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
scanf("%d", &map[i][j]);
for (int i = 0; i < K; i++) {
scanf("%d", &command);
if (!check())
continue;
dice_rolling();
fill_value();
print();
}
return 0;
}
1. 주사위를 이동하기에 앞서, 현재 위치에서 이동이 가능한지 확인하기
check() 함수를 통해 확인한 후 조건을 만족하지 않는다면,
continue 문을 실행하여 해당 command를 무시하도록 구현하였습니다.
2. (1번이 가능하다면) 주사위를 주어진 방향에 맞게 굴리기
dice_rolling() 함수를 통해 주사위를 굴린 후, dice 배열을 이동 방향에 맞게 적절히 수정해주었습니다.
3. 주사위 or 칸에 적절한 값 채우기
fill_value() 함수를 통해 이동한 칸의 값이 0일 때와 0이 아닐 때를 구분하여 주사위 or 칸의 값을 채워주었습니다.
4. 출력하기
print() 함수를 통해 문제에서 출력해야 할 주사위 윗면에 적혀있는 수를 출력하였습니다.
+) 저는 이러한 과정을 이동하는 명령(command)을 입력받을 때마다 바로바로 수행할 수 있도록 구현하였습니다.
내일부터 개강하면 쉬는 날이 토요일밖에 없어서 문제를 자주 풀 수 있을지 모르겠네요 ㅠㅠ
최대한 부지런히 풀어보도록 하겠습니다 . . . . .
'코딩 > C' 카테고리의 다른 글
[C] 백준 15686번 치킨 배달 (0) | 2021.04.26 |
---|---|
[C] 백준 17144번 미세먼지 안녕! (1) | 2021.02.21 |
[C] 백준 14503번 로봇 청소기 (0) | 2021.02.15 |
[C] 백준 14502번 연구소 (0) | 2021.02.07 |
[C] 백준 20055번 컨베이어 벨트 위의 로봇 (0) | 2021.01.23 |