Problem Solving/백준

[삼성 SW 역량 테스트 기출 문제] 14499_주사위 굴리기

돌돌김 2019. 12. 22. 00:37

https://www.acmicpc.net/problem/14499

 

14499번: 주사위 굴리기

첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다. 둘째 줄부터 N개의 줄에 지도에 쓰여 있는 수가 북쪽부터 남쪽으로, 각 줄은 서쪽부터 동쪽 순서대로 주어진다. 주사위를 놓은 칸에 쓰여 있는 수는 항상 0이다. 지도의 각 칸에 쓰여 있는 수는 10을 넘지 않는 자연수 또는 0이다. 마

www.acmicpc.net

 

구현을 잘 하는거 말고는 딱히 어려운게 아니었다. 주사위가 움직일 때 어떻게 바뀌는지 잘 체크하는 정도?

 

 

문제를 푼 방법은 다음과 같다

  1. 주어진 값들을 입력받고 2차원 배열에 넣는다
  2. 명령으로 주어지는 숫자들은 큐에 push 한다
  3. 반복문을 돌며 명령을 하나씩 꺼낸다
  4. 명령에 따라 해당 방향으로 진행할 수 있는지 여부를 파악한다 --> canGo 함수로 확인
  5. 명령에 따라 동,서,남,북으로 움직인다
  6. 주사위를 굴린다 --> rollDice 함수
  7. 굴린 칸에 써있는 수를 확인하고 그에 맞게 처리를 한다.
  8. 주사위의 맨 윗면을 출력한다.

주사위 배열(dice)는 size가 7인 배열로 만들었다. 사이즈를 6으로 할 수도 있지만, 1번 2번을 활용하기 위해 그냥 7로 했다. 때문에 0번 인덱스는 사용하지 않는다. dice 배열의 인덱스는 각각 주사위의 면에 써있는 숫자를 뜻한다.

안씀 정면 뒷면 왼쪽면 오른쪽면 윗면 아랫면

입력은 문제에 주어진 조건에 맞게 받기만 하면 된다. 항상 헷갈리는 부분 중 하나가 가로/세로, x축/y축, i/j, n/m이다

보통 문제를 풀때 세로로 진행할 때 사용하는 변수는 i, n, r 이고 가로로 진행할 때 사용하는 변수는 j, m, c이다. 때문에 x는 세로, y는 가로에 쓰는게 뭔가 덜 어색하다.

 

하지만 이는 그래프의 관점으로 보았을 때 반대이다. x축 값의 증감은 가로로, y축 값의 증감은 세로로 되기 때문이다. 문제풀때는 그냥 x축 y축은 생각하지 않고 평소 쓰는 반복문의 변수에 맞게 x와 y 좌표를 사용하는게 덜 헷갈리는 것 같다.


전역 변수로는 int map[20][20]; int n, m, x, y, k;을 해주었다.

주사위를 표현하는 dice 배열은 다음과 같다.

int dice[7] = { -99, 0, 0, 0, 0, 0, 0 };

/*
dice[0] = 안씀 (제외)
dice[1] = 정면
dice[2] = 뒷면
dice[3] = 왼쪽면
dice[4] = 오른쪽면
dice[5] = 윗면
dice[6] = 아랫면 (밑바닥)
*/