백준(30)
-
[백준 2042] 구간 합 구하기
풀이 구간 합을 구하기 위해서 펜윅 트리를 사용하였습니다. 펜윅 트리에 대한 자세한 내용은 펜윅트리 포스팅을 참고해주세요 소스 코드 (JAVA) import java.util.*; public class BOJ_2042 { public static void main(String args[]){ Scanner input = new Scanner(System.in); int n = input.nextInt(); int m = input.nextInt(); int k = input.nextInt(); long[] matrix = new long[n+1]; FenwickTree fenwick = new FenwickTree(n); // initialize fenwick tree for(int i=1;i
2020.06.14 -
[BOJ_10814 | Stable Sort] 나이순 정렬
풀이 stable sort를 통해 구현한다면 쉽게 해결할 수 있는 문제이다. Stable Sort란 정렬 알고리즘의 종류가 아닌 알고리즘의 정렬 방식에 관한 것으로 동일한 키 값을 가진 원소들에 대하여 정렬하기 전과 정렬하기 후의 value가 같은 순서를 가지도록 정렬하는 방식을 의미한다. 예를 들어 [key, value] 쌍을 갖는 객체들이 다음과 같이 나열되어 있다고 하자 [3, "철수"] [2, "영희"] [1, "훈이"] [2, "맹구"], [2,"뚱이] key값에 대하여 위 객체들을 오름차순으로 정렬한다고 할 때, Stable Sort는 객체들을 다음과 같이 정렬한다. [1, "훈이"] [2, "영희"] [2, "맹구"] [2, "뚱이"] [3, "철수"] 즉, key 값이 동일한 경우 정렬되기..
2019.07.10 -
[BOJ_1182 | DFS backtracking] 부분집합의 합
풀이 DFS 백트래킹을 이용해서 풀 수 있는 문제였다.부분집합의 모든 경우를 헤아린다든지 하는 문제에서는 DFS를 통해재귀함수가 알아서 처리하도록 하는 편이 코딩하는 데 더 간편한 것 같다. 이 문제를 풀 때 주의해야 할 점은탐색을 하다가 S값을 찾았다고 해서 서둘러 탐색을 종료해서는 안된다는 것이다.예를 들어 S 값이 10이라고 할 때 1, 2, 3, 4 를 순서대로 탐색하고 '아 10이니까 이제 종료하고 다른 케이스를 살펴봐야지'하면 안된다는 의미인데, 왜냐하면 Array의 원소 중에 음수인 경우가 있으므로1, 2, 3, 4, -5, 5인 경우도 합이 10이 되는 케이스가 있을 수 있기 때문이다.따라서 S값을 찾았을 때는 counter의 값만 증가시켜주고 탐색을 계속해야 한다. 소스코드 import ..
2019.02.15 -
[BOJ_10799 | Stack] 쇠막대기
풀이 스택을 이용해서 풀어야하는 문제였다. 물론 반복문을 이용해서 풀 수도 있겠지만, 스택을 활용하면 문제풀이가 훨씬 용이해진다.간단히 정리해보자면, 스택은 FIFO(First in First out)을 특징으로 하는 자료구조이다.말 그래도, 먼저 넣은 데이터가 먼저 나오게 하는 구조인 것이다.이를 이용해서 쇠막대기를 레이저로 자를때 한번에 몇개씩 자르는지를 쉽게 구할 수 있다. *출처 Wikipedia 원리는 다음과 같다.'(' 가 나오면 스택에 '(' 를 집어넣고 막대기의 개수를 하나 추가한다.예를 들어 '((((' 이런식인 경우 계속 스택에 쌓기만 하는 것이다.막대기의 개수는 4개가 될 것이다. 그 다음이 중요한데, 만약 ')' 가 나오는 경우 "막대기의 개수를 하나 줄이고" 막대기의 개수만큼 총 ..
2019.02.15 -
[BOJ_14889 | DFS & BackTracking] 스타트와 링크
풀이 이 문제 역시 삼성 SW 역량테스트 기출문제 였다. DFS 백트래킹에 관한 간단한 문제였는데, 백트래킹이란, 모든 경우의 수를 모두 고려하는 알고리즘으로써,위 주어진 문제와 같이 팀을 나눌 수 있는 모든 경우의 수를 고려하는 데에 적합하다. 우선 DFS함수를 0~n/2 - 1 에 해당하는 Vertex에서 실행한다. 절반만 돌리는 이유는 순열이 아니라 조합을 구하는 문제이기 때문에 어차피 한 팀을 구하면 나머지 팀이 자동으로 결정되기 때문에 시간낭비를 막기 위한 처리였다. 예를 들어0에서 시작한 DFS는 우선 점을 하나 방문했으므로 isVisit[0] = true로 바꿔주고 방문한 점의 개수를 나타내는 len의 길이를 1 증가시켜 준다.len == n/2인 경우 하나의 조가 짜여진 경우이므로 팀을 나..
2019.02.14 -
[BOJ_14503 | DFS] 로봇 청소기
풀이 삼성 SW 역량 테스트 기출문제로, DFS의 간단한 응용 능력을 물어보는 문제였던 것 같다. DFS를 수행하는 방법이야 재귀를 이용해서 처리하면 되지만, 이 문제의 경우에는 DFS를 실행하는 순서를 처리하는 방식이 살짝 까다로운 부분이 있었다. 우선, 문제에서 제시한 방향에 따라 direction변수를 설정해 주었다. 0 - North1 - East2 - South3 - West 그리고 LeftRotate의 경우 direction변수가 들어왔을 때 그 방향의 왼쪽으로 회전한 방향을 출력하도록 처리하였다.예를 들어, 0이 들어오면 북쪽의 좌회전 방향인 서쪽을 가리키는 3을 출력하는 식이다. 그리고 dx[], dy[] 배열을 선언하고, 제시한 방향에 맞게 x, y를 변화시키는 값을 저장하였다.예를 들어..
2019.02.14