https://www.acmicpc.net/problem/14499
구현을 잘 하는거 말고는 딱히 어려운게 아니었다. 주사위가 움직일 때 어떻게 바뀌는지 잘 체크하는 정도?
문제를 푼 방법은 다음과 같다
- 주어진 값들을 입력받고 2차원 배열에 넣는다
- 명령으로 주어지는 숫자들은 큐에 push 한다
- 반복문을 돌며 명령을 하나씩 꺼낸다
- 명령에 따라 해당 방향으로 진행할 수 있는지 여부를 파악한다 --> canGo 함수로 확인
- 명령에 따라 동,서,남,북으로 움직인다
- 주사위를 굴린다 --> rollDice 함수
- 굴린 칸에 써있는 수를 확인하고 그에 맞게 처리를 한다.
- 주사위의 맨 윗면을 출력한다.
주사위 배열(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] = 아랫면 (밑바닥)
*/
'Problem Solving > 백준' 카테고리의 다른 글
[삼성 SW 역량 테스트 기출 문제] 17779_게리맨더링 2 (0) | 2020.02.07 |
---|---|
[백준 BOJ] 11559_Puyo Puyo (0) | 2020.01.24 |
[백준 BOJ] 5397_키로거 (0) | 2019.12.18 |
[백준 BOJ] 7576_토마토 (0) | 2019.12.14 |
[백준 BOJ] 1753_최단 경로 (0) | 2019.12.02 |