[백준 16174] - 점프왕 쩰리(Large)

2022. 11. 12. 17:08· CodingTest/Baekjoon
목차
  1. 🔎문제 해석
  2. 💻코드
  3. 느낀 점

📕문제


‘쩰리’는 점프하는 것을 좋아하는 젤리다. 단순히 점프하는 것에 지루함을 느낀 ‘쩰리’는 새로운 점프 게임을 해보고 싶어 한다. 새로운 점프 게임의 조건은 다음과 같다.

  1. ‘쩰리’는 가로와 세로의 칸 수가 같은 정사각형의 구역 내부에서만 움직일 수 있다. ‘쩰리’가 정사각형 구역의 외부로 나가는 경우엔 바닥으로 떨어져 즉시 게임에서 패배하게 된다.
  2. ‘쩰리’의 출발점은 항상 정사각형의 가장 왼쪽, 가장 위의 칸이다. 다른 출발점에서는 출발하지 않는다.
  3. ‘쩰리’가 이동 가능한 방향은 오른쪽과 아래 뿐이다. 위쪽과 왼쪽으로는 이동할 수 없다.
  4. ‘쩰리’가 가장 오른쪽, 가장 아래 칸에 도달하는 순간, 그 즉시 ‘쩰리’의 승리로 게임은 종료된다.
  5. ‘쩰리’가 한 번에 이동할 수 있는 칸의 수는, 현재 밟고 있는 칸에 쓰여 있는 수 만큼이다. 칸에 쓰여 있는 수 초과나 그 미만으로 이동할 수 없다.

새로운 게임이 맘에 든 ‘쩰리’는, 계속 게임을 진행해 마침내 최종 단계에 도달했다. 하지만, 게임을 진행하는 구역이 너무 넓어져버린 나머지, 이 게임에서 이길 수 있는지 없는지 가늠할 수 없어졌다. ‘쩰리’는 유능한 프로그래머인 당신에게 주어진 구역에서 승리할 수 있는지 알아봐 달라고 부탁했다. ‘쩰리’를 도와 주어진 게임 구역에서 끝 점(오른쪽 맨 아래 칸)까지 도달할 수 있는지를 알아보자!

📕입력


입력의 첫 번째 줄에는 게임 구역의 크기 N (2 ≤ N ≤ 64)이 주어진다.

입력의 두 번째 줄부터 마지막 줄까지 게임판의 구역(맵)이 주어진다.

게임판의 승리 지점(오른쪽 맨 아래 칸)에는 -1이 쓰여있고, 나머지 칸에는 0 이상 100 이하의 정수가 쓰여있다.

📕출력


‘쩰리’가 끝 점에 도달할 수 있으면 “HaruHaru”(인용부호 없이), 도달할 수 없으면 “Hing” (인용부호 없이)을 한 줄에 출력합니다.

 

🔎문제 해석


문제를 읽어보면 그냥 쉽게 풀 수 있다.

  1. 출발점은 (0,0) 도착점은 (n-1,n-1)이다.
  2. 이동방향은 오른쪽과 아래 방향
  3. 배열을 넘어서는 이동은 할 수 없음.
  4. 한 번에 이동할 수 있는 칸은 밟고 있는 칸에 적혀있는 수만큼 이동 가능(초과, 미만 x) 

BFS로 접근하면 굉장히 쉽게 풀 수 있다. 

다만 주의할 점은 이동방향 * 현재 좌표에 적혀있는 값만큼 이동한다는 것만 생각하면 쉽게 풀 수 있다.

💻코드

/*
실버1
16174 점프왕 쪨리(Large)
*/
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
int n;
vector<vector<int>> graph;
vector<vector<int>> visit;
queue<pair<int, int>> q;
vector<int> x = {1, 0};
vector<int> y = {0, 1};
string win = "HaruHaru";
string lose = "Hing";
bool result = false;
void bfs();
int main()
{
cin >> n;
graph.resize(n, vector<int>(n, 0)); //입력 행렬
visit.resize(n, vector<int>(n, 0)); //방문 행렬
for (int i = 0; i < n; i++) //행렬 입력받기
{
for (int j = 0; j < n; j++)
{
cin >> graph[i][j];
}
}
q.push(make_pair(0, 0)); //출발점 queue에 넣기
visit[0][0] = 1; //출발점 방문 체크
bfs();
if (result) //도달할 수 있는 경우
{
cout << win;
}
else //도달할 수 없는 경우
{
cout << lose;
}
}
void bfs()
{
while (!q.empty())
{
int tempx = q.front().first;
int tempy = q.front().second;
q.pop();
if (tempx == n - 1 && tempy == n - 1) //만약 도착점이라면
{
result = true;
return;
}
for (int i = 0; i < 2; i++) //오른쪽 아래,
{
int fx = tempx + x[i] * graph[tempx][tempy];
int fy = tempy + y[i] * graph[tempx][tempy];
if (fx < 0 || fy < 0 || fx >= n || fy >= n) //적절한 좌표가 아니라면 pass
{
continue;
}
if (visit[fx][fy] == 0) //이동가능한 좌표고, 만약 방문을 안했다면
{
q.push(make_pair(fx, fy)); //queue에 푸쉬하고, 방문처리를 해줌.
visit[fx][fy] = 1;
}
}
}
}

 

느낀 점

  • 그냥 실버 문제
저작자표시 (새창열림)

'CodingTest > Baekjoon' 카테고리의 다른 글

[백준 1987] - 알파벳(C++)  (0) 2022.11.17
[백준 15900] - 나무 탈출(C++)  (0) 2022.11.13
[백준 2206] - 벽 부수고 이동하기(C++)  (0) 2022.11.11
[백준 2636] - 치즈(C++)  (0) 2022.11.11
[백준 9205] - 맥주 마시면서 걸어가기(C++)  (0) 2022.11.10
  1. 🔎문제 해석
  2. 💻코드
  3. 느낀 점
'CodingTest/Baekjoon' 카테고리의 다른 글
  • [백준 1987] - 알파벳(C++)
  • [백준 15900] - 나무 탈출(C++)
  • [백준 2206] - 벽 부수고 이동하기(C++)
  • [백준 2636] - 치즈(C++)
재한
재한
안녕하세요 💻
재한
짜이한
전체
오늘
어제
  • 분류 전체보기 (504)
    • Skils (118)
      • Android (52)
      • C++ (5)
      • Kotlin (36)
      • Algorithm (24)
      • Server (1)
    • CodingTest (228)
      • Programmers (45)
      • Baekjoon (183)
    • Experience (8)
      • 후기(코딩테스트,프로그램,프로젝트) (8)
    • Computer Science (70)
      • Design Pattern (2)
      • OOP (2)
      • Computer Architecture (14)
      • OS (2)
      • Software Engineering (3)
      • DataBase (8)
      • Network (39)
    • 학교 (75)
      • R프로그래밍 (26)
      • 회계와 사회생활 (17)
      • 컴퓨터학개론 (20)
      • it기술경영개론 (12)

블로그 메뉴

  • 홈
  • 태그
  • 카테고리
  • 글쓰기
  • 설정

인기 글

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
재한
[백준 16174] - 점프왕 쩰리(Large)
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.