본문 바로가기

algorithm68

[JAVA] 세그먼트 트리 ( SegmentTree ) www.acmicpc.net/blog/view/9 세그먼트 트리 (Segment Tree) 문제 배열 A가 있고, 여기서 다음과 같은 두 연산을 수행해야하는 문제를 생각해봅시다. 구간 l, r (l ≤ r)이 주어졌을 때, A[l] + A[l+1] + ... + A[r-1] + A[r]을 구해서 출력하기 i번째 수를 v로 바꾸기. A[i www.acmicpc.net 백준 사이트의 설명을 보며 나름 자바 코드로 정리해봤다. import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.StringTokenizer; class Main{ static long[] segTree; static long[] a; /** * nod.. 2021. 3. 7.
[JAVA] 백준 - 캐슬 디펜스 17135 (테케 다 맞는데 틀린다면?) www.acmicpc.net/problem/17135 17135번: 캐슬 디펜스 첫째 줄에 격자판 행의 수 N, 열의 수 M, 궁수의 공격 거리 제한 D가 주어진다. 둘째 줄부터 N개의 줄에는 격자판의 상태가 주어진다. 0은 빈 칸, 1은 적이 있는 칸이다. www.acmicpc.net 자꾸 틀린다면 꼭 점검해야할 상황을 소개한다. (본인 경험) 1. 궁수 3명을 배치하는 모든 경우를 구했는가? - 문제에서 N+1 번째 칸에 궁수 3명을 배치한다고 하였다. 한 칸에 한명만 올 수 있다. 따라서 M개의 자리에서 3개를 선택하는 모든 경우의수를 구해야한다. Combination 로직을 DFS로 구현해주면 된다. 여기에서 M = 5 일때 3개의 자리를 선택하는 경우의 수는 5C3 이므로 10가지가 나와야한다... 2021. 3. 4.
[JAVA] 위상정렬 (TopologySort) - 위상정렬이란? 순서가 정해져 있는 작업들의 목록들을 가지고 전체 작업 순서를 결정하도록 하는 알고리즘. 이를 위해서는 사이클이 없는 방향그래프에서만 해야한다. 아래 그래프로 예를 들겠다. 1번 작업은 2번보다 먼저 해야한다. 이것을 방향그래프로 나타내었다. 2번은 5번 보다 먼저 해야 한다. 5번은 4번 보다 먼저 해야한다. 만약 위와 같은 작업 스케줄이 있다면 어떻게 진행하면 좋을 것인가? 1 - 2 - 3 - 5 - 4 1 - 3 - 2 - 5 - 4 위 2가지 경우중에서 한가지 선택하여 진행하면 된다. 먼저 차수에 대해 정의하겠다. 한 정점의 차수 = 해당 정점보다 먼저 선행되어야 하는 작업의 수 예를들어, 3번의 차수는 1이다. 1번 작업이 선행되어야 하기 때문이다. 5번의 차수는 2이다. 2.. 2021. 2. 24.
[JAVA] 백준 1707 - 이분 그래프 www.acmicpc.net/problem/1707 1707번: 이분 그래프 입력은 여러 개의 테스트 케이스로 구성되어 있는데, 첫째 줄에 테스트 케이스의 개수 K(2≤K≤5)가 주어진다. 각 테스트 케이스의 첫째 줄에는 그래프의 정점의 개수 V(1≤V≤20,000)와 간선의 개수 www.acmicpc.net - 7등에 랭크 되어있는 거 보면 느린코드는 아닌 듯 하다. - 이분 그래프란? 그래프에서 임의의 점을 선택하여 그 점과 이웃하는 다른 점은 선택된 점과 색이 달라야 한다. 그리고 그래프에 칠해진 색은 2종류가 가능할 때 이분 그래프라고 한다. 예를 들어, 아래는 이분 그래프인가? 정답은 이분그래프가 맞다. 왜냐하면 아래처럼 2가지의 색상만을 이용하여 임의의 점을 선택할 시 모든 이웃이 자신과 다른.. 2021. 2. 23.
[JAVA] 백준 7562 - 나이트의 이동 ( BFS) www.acmicpc.net/problem/7562 7562번: 나이트의 이동 체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수 www.acmicpc.net -이동할 방향 코드 작성 static int[] dx = {-1,-2,-2,-1,1,2,2,1}; static int[] dy = {-2,-1,1,2,2,1,-1,-2}; 10시 방향부터 시계방향으로 8가지 위치를 지정한 것이다. 예를 들어, 기존의 위치가 (x,y) = (10,10) 이라고 가정하자. ( x + dx[0] , y + dy[0] ) = 10시방향 좌표 ( x + dx[1] , y + dy[1] ).. 2021. 2. 18.
[JAVA] 백준 2583 - 영역구하기 ( BFS + 구현 ) www.acmicpc.net/problem/2583 2583번: 영역 구하기 첫째 줄에 M과 N, 그리고 K가 빈칸을 사이에 두고 차례로 주어진다. M, N, K는 모두 100 이하의 자연수이다. 둘째 줄부터 K개의 줄에는 한 줄에 하나씩 직사각형의 왼쪽 아래 꼭짓점의 x, y좌표값과 오 www.acmicpc.net - 사각형 칠하기 위와 같이 m=5 이고 n=7인 배열에서 왼쪽 아래 좌표(0,2) 와 오른쪽 위 좌표(4,4) 를 가지고 사각형에 해당되는 부분은 어떻게 체크 할것인가? 의 전체 큰 배열의 이름을 arr 라고 하자. (0,2) 와 (4,4)가 주어졌을 때 결과적으로 체크 되는 부분은 다음과 같다. arr[1][0] , arr[1][1] , arr[1][2] , arr[1][3] arr[2].. 2021. 2. 15.
[JAVA] 백준 - 2548 키순서 ( 플루이드 외샬 or BFS) www.acmicpc.net/problem/2458 2458번: 키 순서 1번부터 N번까지 번호가 붙여져 있는 학생들에 대하여 두 학생끼리 키를 비교한 결과의 일부가 주어져 있다. 단, N명의 학생들의 키는 모두 다르다고 가정한다. 예를 들어, 6명의 학생들에 대하여 www.acmicpc.net 플루이드 외샬 알고리즘을 적용하면 빠르게 풀 수 있는데 나는 쓰지 않았다. BFS 를 쓰면 더 빠를 거라고 생각했기 때문이다. 실제로 더 빨라서 전체 백준 차트에서 2등했다. (물론 메모리를 좀더 쓰긴 했지만..) (2020.02.13 기준) BFS 풀이법 - 1번 정점에서 BFS를 시작하여 1번보다 큰 정점을 체크한다. 여기서는 2,4,5,6번이 체크된다. - 2번 정점에서 BFS를 시작하여 1번보다 큰 정점을.. 2021. 2. 13.
[JAVA] 백준 11404- 플로이드(플로이드-외샬 알고리즘이란?) www.acmicpc.net/problem/11404 11404번: 플로이드 첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가 www.acmicpc.net -플로이드-외샬 알고리즘 " 모든 정점에서 모든 정점까지의 최단거리를 구하는 알고리즘" -원리 정점 i 에서 정점 j 까지 거리 = X 정점 i 에서 정점 k까지 거리 = Y 정점 k에서 정점 j 까지 거리 = Z 라고 할때, X = min ( Y+Z , X ) 를 정의한 것이 플루이드-외샬 알고리즘이다. -구현 문제를 바탕으로 구현해보자. 정점이 1번 부터 5번까지 있다고 가정하자. "원리"에서 예시로 들었던.. 2021. 2. 8.
[JAVA] 전구와 스위치 (백준 2138) ( 그리디) www.acmicpc.net/problem/2138 2138번: 전구와 스위치 N개의 스위치와 N개의 전구가 있다. 각각의 전구는 켜져 있는(1) 상태와 꺼져 있는 (0) 상태 중 하나의 상태를 가진다. i(1 2020. 10. 23.