emluy 개발 일기

C++ - (백준) 13460번 구슬 탈출 2 본문

알고리즘/c, c++

C++ - (백준) 13460번 구슬 탈출 2

yulme 2020. 10. 8. 03:00
SMALL

www.acmicpc.net/problem/13460

 

13460번: 구슬 탈출 2

첫 번째 줄에는 보드의 세로, 가로 크기를 의미하는 두 정수 N, M (3 ≤ N, M ≤ 10)이 주어진다. 다음 N개의 줄에 보드의 모양을 나타내는 길이 M의 문자열이 주어진다. 이 문자열은 '.', '#', 'O', 'R', 'B'

www.acmicpc.net

// 기울이면 공이 벽 만날때까지 쭉 미끄러져 내려감
// 필요한 변수 : R과 B의 위치, 몇번만에 0로 나갔는지 셀 count
// #이 아닌 .인곳으로 계속 감. #만나기전까지 쭉 감

 

0. 전체 코드

github.com/ImYurim/Algorithm/blob/main/%EA%B5%AC%EC%8A%AC%ED%83%88%EC%B6%9C2.cpp

 

ImYurim/Algorithm

Contribute to ImYurim/Algorithm development by creating an account on GitHub.

github.com

 

1. 알아야하는 것

- BFS

- queue library 사용법 : queue 와 구조체 같이 사용하는 법

hydroponicglass.tistory.com/15

 

[C++, STL] 큐에서 구조체 사용

다른 글 [C++, STL] 알고리즘 문제풀이를 위한 큐(queue) 목적 C++의 STL을 이용하여 queue에서 struct를 사용하고 싶다. 본론 예 : 큐에 좌표를 집어넣고 싶다. 구조체 정의 typedef struct { int x; int y; int..

hydroponicglass.tistory.com

- scanf로 한줄씩 입력받기 : scanf는 엔터는 자동 무시한다.  

 

2. idea

- queue에 들어가고 방문 표시 대상이 되는 애 : 빨간공, 파란공이 방문한 x,y 좌표

   -> 맵의 각 점이 방문 표시 대상이 되는거 아님!! 주의

 

3. 작성해야할 코드 

- struct : 빨간공, 파란공이 있던 위치와 각 위치마다 몇번째 이동인지 기록 위함

- bfs 함수 

- main 함수 : 보드의 가로, 세로 길이 

 

3-1. 작성 순서

1) struct 선언

 

2) main 함수

- 보드게임 가로 세로인 n.m 입력받기

- 보드게임 판 구성 입력받기 (2차원 배열 입력)

- 처음 빨간공과 파란공이 위치한 좌표와 depth(0) 을 queue에 push

 

3) bfs 함수

- queue가 비어있기 전까지 계속 반복되는 while문

- queue에서 pop한 후 빨간공 파란공이 위치한 좌표 가져옴

- 빨간 파란공이 그 다음위치에 갈 곳을 4방향 모두 찾음 (for문으로) -> 각 방향으로 이동하기 위한 +1 -1 0 으로 이루어진 dx, dy 배열 필요

- 빨간공 따로 파란공 따로 한방향에 대해 다음 위치가 될 곳의 좌표를 가져옴 (움직이기 전좌표와 따로 다뤄지게 새로운 변수 선언 필요, move함수 필요)

 

4) move 함수

- 각 공의 좌표와 빨간공 파란공 겹치는걸 대비해서 선언해준 변수와 방향 값 을 인자로 하는 함수

- 여기서는 한 칸씩 움직임!

- while문 작성, 조건은 한 칸씩 한 방향으로 움직일때 다음 위치가 벽이거나 한 칸씩 움직이다가 현재 위치가 구멍자리가 되면 함수종료

 

5) 다시 bfs 함수

- 파란공이 구멍으로 빠지거나 빨간공이 구멍으로 빠지거나 두 공이 겹칠때 3가지 경우를 if문으로 처리해줌

 

 

4. 주의

4-1. 문법상 주의

- scanf("%1s",&map[i][j]) 변수에 주소 '&' 꼭 빼먹지 말것! why? char 한글자씩 입력하는 것이기때문에 &꼭 필요함

- queue와 구조체 같이 사용할 시, q.push 할때 괄호 안에 중괄호 넣어주기 ex) q.push({x,y,z})

 

4-2. 코드 흐름 상 주의

- move함수에서 while문 조건 두번째는 map[a_x+dx][a_y+dy] !='0' 이 아니라 map[a_x][a_y] !='0' 이다!!

  -> 왜냐면? 다음 위치에 공이 벽에 부딪힐거같으면 그만 움직이고 move함수 종료지만 다음 위치가 0이어도 구멍으로 빠져나간후 move종료다!!

 

 

 

 

=========================================================

그 외 궁금했던 것

- 공백과 엔터 제외하고 scanf로 입력 받기

:  scanf("%*[ \n]%c", &k); ->%*사용해서 공백과 엔터 입력 무시 처리

norang.io/cpp/skip-whitespace/

 

scanf()에서 공백 스킵하기

종종 문제에서 입력을 받을 때 공백을 무시해야 하는 경우가 있다.숫자만 읽어들이는 경우 scanf("%d", &var)과 같이 처리할 수 있지만,문자도 읽어야 하는 경우 공백 문자도 문자로 취급되어 귀찮아

norang.io

 

 

반응형
Comments