완전탐색 4

백준 13460 구슬탈출 2 C++ - BFS

구슬탈출 1과 유사하지만 살짝 다른점이 있는 문제이다. 컴퓨터스러운 문제에서 현실 세계 시뮬레이션 문제로 바뀐 듯한 느낌이다. 조건은 다음과 같다. 1. 구멍에는 빨간 구슬만 들어가야한다.(빨간 구슬이 들어간 후 파란 구슬이 들어가도 실패) 2. 10회를 초과해야하거나 초과해도 못들어가는 경우는 실패로 간주한다. 3. 구슬은 부딪혀도 상관없지만, 온전한 1칸을 차지하기 때문에 옆에 구슬이 있다면 더 이상 가지 못한다. 4. 구슬은 멈출 때(벽을 만나거나 다른 구슬을 만나거나 구멍에 들어갈 때) 까지 굴러간다. 문제 풀이는 간단하다. BFS를 사용하여 빨간 구슬과 파란 구슬의 위치를 발전시켜나가면 된다. 하지만 중복되는 상태를 고려하지 않으면 무한 루프가 생기게 되므로 visit 배열을 4차원 [Ry][R..

알고리즘 2021.04.04

백준 14888 연산자 끼워넣기 C언어 - DFS 완전탐색

N개의 수와 N-1개의 연산자를 조합하는 문제이다. 다행스럽게도 연산순서는 우선순위를 무시하고 앞에서부터 차례대로 계산하고 나누기 (/)는 음수를 양수로 나눌 경우 절대값을 나눈 몫을 음수로 바꿔서 넣는다. 즉 -5 / 2 는 -(5/2) 와 동일한 결과를 가져야한다. 연산은 DFS를 통해 미리 만들어 배열에 저장해놓고 사용하였다. 그러지 않고 DFS를 들어가면서 계산결과를 전달해줘도 되지만, 그냥 이렇게 생각하기가 편해서 이렇게 구현하였다. 주의할 점은 중간이나 마지막 계산결과가 -10억~10억이기 때문에 평소 하던 것처럼 MAX 를 987654321로 두면 10억보다 작은 값이기 때문에 결과가 틀리게 나온다. 그것 외엔 주의할 점은 없다. DFS 는 4가지 경우를 가진 Tree 형태로 구성하였고, o..

알고리즘 2021.03.11

백준 16137 견우와 직녀 C언어 - BFS 완전탐색

눈물나는 견우와 직녀의 일화이다. 하필이면 절벽지대에 살아가지고 오작교가 없으면 서로가 만나지 못할 수도 있다. 문제의 조건은 다음과 같다. 1. 한 칸을 이동하는데 1분이 걸린다. 2. 오작교에 적힌 시간의 배수에만 (0포함) 견우가 다리를 건널 수 있다. 3. 절벽이 교차하는 곳에는 오작교를 놓을 수 없다. 4. 오작교는 연속으로 건널 수 없다. 이토록 많은 조건을 뚫고도 견우가 직녀를 만나러 갈 수 있을까? 문제 풀이의 청사진은 다음과 같다. 1. 가장 빨리 도착하는 경우를 구해야하므로 BFS 를 이용하여 경로를 찾아본다. 2. 시간복잡도는 정확하게 계산하기 어렵고, 이럴 일도 없지만 N*N (map의 크기) * N * N (0이 들어갈 경우) * N * N( 완전탐색) = 1백만이므로 여유가 차고..

알고리즘 2021.03.11