탐색(3)
-
[BOJ_7576 | BFS]토마토
풀이 BFS를 이용하여 풀어야 하는 문제였다. 먼저 창고에 있는 토마토들을 쭉 스캔해서 큐에 넣는다.큐는 FIFO(First - In - First - Out)의 성질을 가지는 자료구조이기 때문에큐에 먼저 넣은 토마토들의 상하좌우의 좌표를 먼저 탐색할 수 있다. 창고에 있는 토마토들을 쭉 스캔해서 넣은 다음에는 !q.isEmpty()를 조건으로 while문을 이용한다.큐에서 빼낸 좌표의 상하좌우의 좌표가 유효한지를 먼저 확인하고, (isValid) 그 좌표에 익지않은 토마토가 있다면 토마토를 익게 만들고,원래의 토마토의 날짜에 1을 더해 익은 토마토의 좌표와 함께 큐에 다시 넣어주고 BFS를 반복한다. 즉, 큐에 들어가는 객체는 창고의 x좌표, y좌표, 그리고 경과일수가 들어가며, 맨 처음 스캔할때의 경..
2019.01.28 -
[BOJ_3474 | Number Theory] 교수가 된 현우
풀이 문제 자체는 크게 어려운 문제는 아니었던것 같다.하지만, 풀이 과정에 따라서 시간 복잡도가 천차만별이 될 수 있다는 것을3번의 실패끝에 경험했다. 몇 자리수인지를 물어보는 것이 아니라 뒷자리에 0이 몇개가 있는지를 계산하는 문제였기 때문에비교적 간단하게 2 와 5의 개수만으로 답을 구할 수 있다. 단 이때 참고해도 될 만한 부분은 1. 2의 개수는 무조건 5의 개수보다 많으므로 굳이 2의 개수를 세느라 시간을 낭비할 필요가 없다 2. 1~N 사이의 2나 5의 배수를 탐색하는 과정에서 모든 숫자를 탐색할 필요가 없다 이 2가지 정도로 정리할 수 있겠다. 2번을 몰랐던 상황에서 1024!의 값을 구하기 위해1~1024 까지의 모든 자연수의 2, 5의 배수개수를 세고 있었고결과적으로 시간 복잡도가 증가하..
2019.01.02 -
[BOJ_4963 | DFS] 섬의 개수
풀이 전형적인 DFS문제로 보여진다.뭔가 다른 방법이 있진 않을까 해서 DFS를 사용하지 않고 풀려고도 시도해 보았지만아무래도 DFS로 문제를 해결하는 것이 더 간단해보인다. DFS란 Depth-First Search 의 약자로하나의 경로를 우선적으로 끝까지 탐색하는 알고리즘이다. 위 문제를 해결하기 위해서 1로 연결되는 경로를 DFS로 탐색하면서 그 값을 다 2로 바꾸어 준다.그럼 하나의 점에서 시작된 DFS결과는 상하좌우 대각선으로 연결된 하나의 섬을 전부 2로 바꾼 결과가 되고 아직 2로 바뀌지 않은 지점은 연결되지 않은 섬이므로 카운터의 값을 증가시킨뒤에 다시 DFS를 수행하는 방식이다.DFS에 익숙하지 않다면 이 문제를 통해 한번 연습해보는 것이 좋을 듯 하다. 크게 어렵지 않은 난이도로 DFS..
2019.01.02