boj(10)
-
[BOJ_14501 | DFS] 퇴사
풀이 맨 처음에는 Dynamic Programming 방법으로 문제를 풀려고 시도했으나, 문제를 읽고 예제 몇개를 그림으로 그려가면서 시도를 해보니 DFS로 문제를 푸는 편이 더 간편할 것 같다는 생각이 들었다. DFS로 문제를 푸는 방법은 비교적 간단하다.큰 틀에서 보면 이중 For 문을 돌리는 것인데, 제시된 문제 예제를 기준으로 설명해보자면,1일부터 7일까지 반복문을 돌리면서 각각의 날짜를 시작으로 하는 경로를 찾는다.그리고 각각의 날짜에서 상담을 수행한 후에, 도달하게 되는 날짜를 다시 DFS에 집어넣어 반복한다. 예를 들어 1로 시작했다면, 1로 시작할 수 있는 경로는1 -> 4 ....1 -> 5 ....1 -> 6 ....등이 될 것이다. 이 모든 경로를 탐색하면서 경로에 놓여있는 Pi값을 ..
2019.02.02 -
[BOJ_11053 | DP] 가장 긴 증가하는 부분 수열
풀이 가장 긴 증가하는 부분 수열을 구하는 문제는 다이나믹 프로그래밍을 이용하여 해결해야 한다.arr 배열에는 입력받은 input data의 값, 즉 수열의 값들을 저장하고dp 배열에는 그 숫자보다 작은 증가하는 부분 수열의 최대 길이를 저장한다. 예를들어 n = 9 인 데이터가 다음과 같이 들어온다고 가정하자. 10, 15, 40, 20, 15, 50, 35, 80, 100 이 상황에서 arr[0] ~ arr[8]까지의 값은 각각 위의 값을 순서대로 저장할 것이다.그리고 이중 포문을 돌면서 (데이터의 개수가 더 클 때에는 O(NlogN)의 시간복잡도를 갖는 알고리즘을 사용해도 된다.)각각의 인덱스에서 그 인덱스보다 작은 최장 부분 수열의 길이+1 의 값을 dp 배열의 값으로 저장하는 것이다. 10의 d..
2019.02.01 -
[BOJ_7576 | BFS]토마토
풀이 BFS를 이용하여 풀어야 하는 문제였다. 먼저 창고에 있는 토마토들을 쭉 스캔해서 큐에 넣는다.큐는 FIFO(First - In - First - Out)의 성질을 가지는 자료구조이기 때문에큐에 먼저 넣은 토마토들의 상하좌우의 좌표를 먼저 탐색할 수 있다. 창고에 있는 토마토들을 쭉 스캔해서 넣은 다음에는 !q.isEmpty()를 조건으로 while문을 이용한다.큐에서 빼낸 좌표의 상하좌우의 좌표가 유효한지를 먼저 확인하고, (isValid) 그 좌표에 익지않은 토마토가 있다면 토마토를 익게 만들고,원래의 토마토의 날짜에 1을 더해 익은 토마토의 좌표와 함께 큐에 다시 넣어주고 BFS를 반복한다. 즉, 큐에 들어가는 객체는 창고의 x좌표, y좌표, 그리고 경과일수가 들어가며, 맨 처음 스캔할때의 경..
2019.01.28 -
[BOJ_1389 | Floyd]케빈 베이컨의 6단계 법칙
풀이 플로이드 와샬 알고리즘을 조금만 응용할 수 있다면 쉽게 해결되는 문제이다.그래프의 가중치를 저장하는 dis 배열과 같이 동작하는 count배열을 추가하였다.이 count 배열은 dis 배열이 갱신될 때마다 중간에 얼마나 많은 정점들이 연결되는 지를 카운트하여 저장하는 배열이다. 예를들어1 - 2 를 연결하는 가중치를 나타내는 dis[1][2] 값이1 - 3 - 2로 갱신될 때 count[1][2]값이 count[1][3] + count[3][2] 값으로 갱신되는 것이다. 이렇게 모든 점에 대해서 플로이드 알고리즘을 한바퀴 돌고 나면, dis배열과 count배열이 갱신되게 되고각각의 count값을 i값에 대해 합을 낸 것을 구하면, 각 i 값에 따른 케빈 베이컨의 수가 나오게 된다. 정리하면, 배열 ..
2019.01.19