일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- jvm
- C++
- 벤쿠버
- binary search
- 프로그래밍언어론
- 라인
- BFS
- 알고리즘
- Java
- C/C++
- 스프링 프레임워크
- 프로그래머스
- 머신러닝
- 시애틀
- 릿코드
- spring
- 스타벅스
- 다이나믹프로그래밍
- leetcode
- DP
- 백트래킹
- STL
- 딥러닝
- 모두를 위한 딥러닝
- Spring Framework
- Python
- 파이썬
- dfs
- 라인플러스
- 백준
- Today
- Total
케이스윔의 개발 블로그
[백준][BFS] 9019번 DSLR 본문
문제
숫자 A, B가 주어질 때 주어진 4개의 명령을 최소한으로 적용시켜 A를 B로 변환해야합니다. 최소한으로 필요한 명령어 나열을 출력해야합니다.
문제 출처: 백준 온라인저지(https://www.acmicpc.net/problem/9019)
풀이
최소한의 명령을 통해 변환해야하므로 BFS를 통해서 큐에 넣으면서 한단계동안 수행할 수 있는 숫자를 만들어봅니다. D, S, L, R 각 명령어를 수행하는 함수를 만들었고, 큐에서 pop한 값을 차례대로 넣으면서 새로운 숫자가 만들어지면 해당하는 숫자를 또 큐에 넣습니다. 만약 최소한의 명령개수를 구하는 거라면 더 쉽게 생각할 수 있었을텐데 해당 명령어를 나열하는 것이 답이기 때문에 조금 고민을 했습니다. 큐에서 pop한 수를 4개의 명령어를 다 수행시켜보고 변환된 숫자가 이미 나오지 않았다면 해당 숫자가 어떤 명령어를 통해서 만들어진건지 기록을 하고, 어떤 숫자에서 변환이 된건지를 기록합니다. check[만들어진 숫자] = 만들기 전 숫자 를 해주고, dir[만들어진 숫자] = D or S or L or R을 기록합니다. 이렇게 되면 마지막 숫자가 만들어졌을 때 check[만들어진 숫자] 에서 제일 처음 입력된 A까지 찾아갈 수 있고 찾아가면서 해당 dir을 벡터에 넣은다음 역순으로 출력하게 되면 만들어진 명령어 나열이 완성됩니다. D, S, L, R 계산을 잘 해주고 출력하기 위해 저장을 잘 해주면 됩니다! 참고로 테스트케이스가 여러개이다보니까 초기화를 해줘야했는데 check, dir 배열을 전부 다 초기화해주기에는 너무 시간이 많이 낭비되는 것 같아서 한 테스트케이스마다 사용된 숫자만을 벡터에 저장하고, BFS가 종료될 때 벡터의 숫자 check, dir만 초기화해주도록 하였습니다.
모르고 역순으로 출력해서 틀린 다음 다시 도전.. 떨리는 순간..
코드
https://github.com/kswim/Algorithm/blob/master/BFS/9019.cpp
'Algorithm > DFS &BFS' 카테고리의 다른 글
[백준][BFS] 1389번 케빈 베이컨의 6단계 법칙 (0) | 2018.12.06 |
---|---|
[백준][BFS] 1525번 퍼즐 (0) | 2018.11.29 |
[백준][BFS] 16236번 아기상어 (0) | 2018.11.06 |
[백준][BFS] 14503번 로봇 청소기 (0) | 2018.04.14 |
[백준 알고리즘][BFS] 2206번 벽 부수고 이동하기 (0) | 2018.02.06 |