Computer Science/Problem Solving (PS)(38)
-
[BOJ_1940 | While] 주몽
풀이 반복문의 성질을 잘 이용해서 풀어야 하는 문제이다. 먼저 주어진 고유 번호를 arr 배열에 저장한 후 정렬한다.Java의 Arrays.sort를 이용하면 데이터 크기에 맞게 O(nlogn) 시간복잡도를 가지는 정렬 알고리즘으로Java가 데이터를 잘 정렬해 준다. 정렬해 준 데이터를 while문 안에 넣고 연산을 수행하면 된다.연산 과정은 다음과 같다.start = 0, end = num.of data -1 로 놓고 시작한다. 만약 arr[end]가 m보다 클 경우 end를 1만큼 감소시키고 continue한다.그렇지 않을 경우 i를 start부터 end-1까지 반복하면서 arr[i]+arr[end] == m이 되는 i의 값을 찾는다.값이 없으면 end를 감소시키고 continue, 값이 있으면 co..
2019.02.07 -
[백준 3184 | DFS] 양
풀이 맨 처음에 BFS로 문제를 접근했다가 메모리초과가 나서 다시 DFS로 접근했던 문제였다.DFS로 이 문제를 해결하는 방법은 다음과 같다. 1. 반복문을 돌리면서 '#' 이 아닌 좌표를 찾아 차례로 DFS 함수를 실행한다.2. DFS 함수 안에서는 우선 해당 좌표의 값이 'v' 인지 'o' 인지, '.' 인지 확인한다.3. v 인경우 wCnt 값을 증가시키고, '.'로 바꾼다 o인 경우 sCnt 값을 증가시키고 '.'로 바꾼다.4. 해당 좌표의 상하좌우 값이 Valid 한 좌표인지 확인하고 각각 DFS를 수행한다. 하나의 구역 탐색이 끝나면, sCnt, wCnt를 비교해서 누가 이기는지 판단하고 최종 cnt1, 2값을 증가시키면 된다. 소스코드 1234567891011121314151617181920..
2019.02.05 -
[BOJ_2805 | Binrary Search] 나무 자르기
풀이 이분 탐색을 통해 문제를 해결하면 주어진 시간 안에 문제를 해결하는 알고리즘을 구현할 수 있다.먼저 주어진 나무들의 길이를 배열에 저장하고 Arrays.sort를 통해 빠르게 길이순으로 정렬한다.이분탐색의 탐색범위는 0부터 길이가 가장 긴 나무의 길이까지이며(left = 0, right = arr[arr.length-])mid 는 0부터 시작해 반복문의 매번 마지막에는 (left+right)/2 로 재설정해준다.각각의 반복문이 돌아갈 때마다또 다른 반복문을 통해 mid의 길이에 따른 잘린 나무들의 길이의 합을 구해준다.이 길이가 m과 같으면 mid의 값을 출력하고, 아닌 경우 각각 mid의 값을 갱신하여 반복문을 돌게 한다. 하지만 한 가지 주의해야 할 점이 있는데문제의 조건을 잘 살펴보면, 높이가..
2019.02.05 -
[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