Algorithm & Data Structure/BOJ
-
[백준] 2352 반도체 설계 (LIS)2020.01.17
-
[백준] 2644 촌수계산 (BFS)2020.01.16
-
[백준] 14888 연산자 끼워넣기 (BruteForce, 재귀호출)2020.01.15
-
[백준] 3053 택시 기하학2020.01.15
-
[백준] 1057 토너먼트2020.01.14
-
[백준] 10825 국영수 (Sort)2020.01.13
-
[백준] 1937 욕심쟁이 판다 (DFS, DP)2020.01.13
-
[백준] 12100 2048(Easy)2020.01.11
[백준] 2352 반도체 설계 (LIS)
https://www.acmicpc.net/problem/2352
2352번: 반도체 설계
첫째 줄에 정수 n(1 ≤ n ≤ 40,000)이 주어진다. 다음 줄에는 차례로 1번 포트와 연결되어야 하는 포트 번호, 2번 포트와 연결되어야 하는 포트 번호, …, n번 포트와 연결되어야 하는 포트 번호가 주어진다. 이 수들은 1 이상 n 이하이며 서로 같은 수는 없다고 가정하자.
www.acmicpc.net
LIS, 동적계획법, 그리디 알고리즘 등으로 풀수 있는 문제입니다.
저는 LIS로 접근해봤습니다.
첫번째 원소를 결과배열에 넣고 시작합니다.
두번째 원소부터 배열의 마지막 값과 비교해서 해당원소가 더 크면 뒤에 추가,
작으면 앞에서부터 해당 원소보다 처음으로 같거나 큰 배열값을 만났을때 교체 하는 식으로 접근했습니다.
포트번호가 4 2 6 3 1 5
에서 가장긴 증가하는 부분수열을 구하면
2 3 5가 되는데 이번 문제를 푸는 방식으로 구해보면 1 3 5 가 나옵니다.
선이 겹치지 않아야 하는데 이 부분에서 고민이 많이 됐습니다.
답은 최대 길이만 구하면 되므로 통과되는데 선의 겹침을 해결하지는 못했습니다.
이 부분을 고민중입니다..
'Algorithm & Data Structure > BOJ' 카테고리의 다른 글
[백준] 1904 01타일 (Dynamic programming) (0) | 2020.01.22 |
---|---|
[백준] 4963 성의 개수(BFS) (0) | 2020.01.20 |
[백준] 2644 촌수계산 (BFS) (0) | 2020.01.16 |
[백준] 14888 연산자 끼워넣기 (BruteForce, 재귀호출) (0) | 2020.01.15 |
[백준] 3053 택시 기하학 (0) | 2020.01.15 |
[백준] 2644 촌수계산 (BFS)
https://www.acmicpc.net/problem/2644
2644번: 촌수계산
사람들은 1, 2, 3, …, n (1≤n≤100)의 연속된 번호로 각각 표시된다. 입력 파일의 첫째 줄에는 전체 사람의 수 n이 주어지고, 둘째 줄에는 촌수를 계산해야 하는 서로 다른 두 사람의 번호가 주어진다. 그리고 셋째 줄에는 부모 자식들 간의 관계의 개수 m이 주어진다. 넷째 줄부터는 부모 자식간의 관계를 나타내는 두 번호 x,y가 각 줄에 나온다. 이때 앞에 나오는 번호 x는 뒤에 나오는 정수 y의 부모 번호를 나타낸다. 각 사람의 부모는 최대
www.acmicpc.net
BFS를 사용해 촌수를 계산하는 문제입니다.
각 사람의 정보와 촌수를 저장하는 클래스를 만들어 사용했습니다.
시작을 x, 촌수 0으로 시작해서 연결된 사람이 있으면 현재촌수 + 1 해주며 큐에 담습니다.
BFS진행 중 y차례가 되면 촌수를 저장하고 BFS를 종료합니다.
'Algorithm & Data Structure > BOJ' 카테고리의 다른 글
[백준] 4963 성의 개수(BFS) (0) | 2020.01.20 |
---|---|
[백준] 2352 반도체 설계 (LIS) (0) | 2020.01.17 |
[백준] 14888 연산자 끼워넣기 (BruteForce, 재귀호출) (0) | 2020.01.15 |
[백준] 3053 택시 기하학 (0) | 2020.01.15 |
[백준] 1057 토너먼트 (0) | 2020.01.14 |
[백준] 14888 연산자 끼워넣기 (BruteForce, 재귀호출)
https://www.acmicpc.net/problem/14888
14888번: 연산자 끼워넣기
첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, 곱셈(×)의 개수, 나눗셈(÷)의 개수이다.
www.acmicpc.net
재귀호출을 사용하는 브루트포스 문제였습니다.
매번 각 연산자의 숫자를 solve함수에 넣어주면서 재귀호출을 해줍니다.
재귀호출로 만들어지는 경우의 수를 보면
연산자의 수가 (+ - * /) 각각 2 1 1 1 일때
- + + - * /
- + + - / *
- + + * - /
- + + * / -
- + + / - *
- + + / * -
- + - * / +
이런 순서로 진행 됩니다.
재귀호출을 이해하는것이 포인트인 문제 같습니다.
'Algorithm & Data Structure > BOJ' 카테고리의 다른 글
[백준] 2352 반도체 설계 (LIS) (0) | 2020.01.17 |
---|---|
[백준] 2644 촌수계산 (BFS) (0) | 2020.01.16 |
[백준] 3053 택시 기하학 (0) | 2020.01.15 |
[백준] 1057 토너먼트 (0) | 2020.01.14 |
[백준] 10825 국영수 (Sort) (0) | 2020.01.13 |
[백준] 3053 택시 기하학
https://www.acmicpc.net/problem/3053
3053번: 택시 기하학
문제 19세기 독일 수학자 헤르만 민코프스키는 비유클리드 기하학 중 택시 기하학을 고안했다. 택시 기하학에서 두 점 T1(x1,y1), T2(x2,y2) 사이의 거리는 다음과 같이 구할 수 있다. D(T1,T2) = |x1-x2| + |y1-y2| 두 점 사이의 거리를 제외한 나머지 정의는 유클리드 기하학에서의 정의와 같다. 따라서 택시 기하학에서 원의 정의는 유클리드 기하학에서 원의 정의와 같다. 원: 평면 상의 어떤 점에서 거리가 일정한 점들의 집합
www.acmicpc.net
택시 기하학 에 대해 알아가는 문제였습니다.
T1(x1,y1), T2(x2,y2)
기존 유클리드 기하학에서 두점의 거리는 길을 가로지르는 초록색 선이고 최단거리입니다.
하지만 모눈종이의 길을 따라 가는 빨강,초록,노랑의 길이는 모두 같습니다.
이것이 택시 기하학(맨해튼거리)입니다.
문제에 택시 기하학 공식으로 나온 D(T1,T2) = |x1-x2| + |y1-y2| 으로 빨간길의 길이를 재보면
이해가 쉽습니다.
원
원이란 한지점에서 거리가 일정한 점들의 집합입니다.
유클리드 기하학에서 원은 일반적으로 알고 있는 둥그란 원입니다. (원의 넓이 : pi*R^2)
택시 기하학에서 원은 택시 기하학적으로 거리가 같은 점들의 집합이로 마름모 꼴이 나옵니다.
그림을 보면 원점에서 선을 따라 각 면에 다다르는 길이는 모두 같습니다.
이처럼 택시 기하학에서 원이란 마름모 꼴입니다.
즉, 택시 기하학에서 원의 넓이는 마름모의 넓이를 구하면 됩니다. (마름모 넓이 : 2R^2)
'Algorithm & Data Structure > BOJ' 카테고리의 다른 글
[백준] 2644 촌수계산 (BFS) (0) | 2020.01.16 |
---|---|
[백준] 14888 연산자 끼워넣기 (BruteForce, 재귀호출) (0) | 2020.01.15 |
[백준] 1057 토너먼트 (0) | 2020.01.14 |
[백준] 10825 국영수 (Sort) (0) | 2020.01.13 |
[백준] 1937 욕심쟁이 판다 (DFS, DP) (0) | 2020.01.13 |
[백준] 1057 토너먼트
https://www.acmicpc.net/problem/1057
1057번: 토너먼트
김지민은 N명이 참가하는 스타 토너먼트에 진출했다. 토너먼트는 다음과 같이 진행된다. 일단 N명의 참가자는 번호가 1번부터 N번까지 배정받는다. 그러고 난 후에 서로 인접한 번호끼리 스타를 한다. 이긴 사람은 다음 라운드에 진출하고, 진 사람은 그 라운드에서 떨어진다. 만약 그 라운드의 참가자가 홀수명이라면, 마지막 번호를 가진 참가자는 다음 라운드로 자동 진출한다. 다음 라운드에선 다시 참가자의 번호를 1번부터 매긴다. 이때, 번호를 매기는 순서는 처음
www.acmicpc.net
수학 문제였습니다.
a와 b가 같아질때까지 카운트해주면 됩니다.
1번 vs 2번 승자 => 다음라운드 1번 부여 : (1+1)/2, (1+2)/2
3번 vs 4번 승자 => 다음라운드 2번 부여 : (3+1)/2, (3+2)/2
x번 vs x+1번 승자 => x승리시 : (x+1)/2번, x+1승리시 : (x+2)/2번 부여
(x는 홀수)
'Algorithm & Data Structure > BOJ' 카테고리의 다른 글
[백준] 14888 연산자 끼워넣기 (BruteForce, 재귀호출) (0) | 2020.01.15 |
---|---|
[백준] 3053 택시 기하학 (0) | 2020.01.15 |
[백준] 10825 국영수 (Sort) (0) | 2020.01.13 |
[백준] 1937 욕심쟁이 판다 (DFS, DP) (0) | 2020.01.13 |
[백준] 12100 2048(Easy) (0) | 2020.01.11 |
[백준] 10825 국영수 (Sort)
https://www.acmicpc.net/problem/10825
10825번: 국영수
첫째 줄에 도현이네 반의 학생의 수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 한 줄에 하나씩 각 학생의 이름, 국어, 영어, 수학 점수가 공백으로 구분해 주어진다. 점수는 1보다 크거나 같고, 100보다 작거나 같은 자연수이다. 이름은 알파벳 대소문자로 이루어진 문자열이고, 길이는 10자리를 넘지 않는다.
www.acmicpc.net
간단한 정렬 문제였습니다.
학생정보를 담는 클래스를 만들어 저장했습니다.
그 후, Arrays.sort()로 오름,내림 차순 정렬해주었습니다.
국어 : 내림차순
영어 : 오름차순
수학 : 내림차순
이름 : 사전순 오름차순
으로 정렬합니다.
(* 오름차순 1,2,3,4..... 갈수록 증가)
(*내림차순 4,3,2,1.... 갈수록 감소)
*Comparator 인터페이스의 compare메소드를 오버라이드하여 사용합니다.
오름차순 정렬은
o1>o2 면 1 (양수)
아니면 -1 (음수)를 리턴합니다.
1 이면 자리바꿈, -1이면 자리유지 입니다.
내림차순을 하고싶으면 o2 와 o1의 자리를 바꿔줍니다.
(* 문제에서 o1==o2일 경우의 조건을 달아주어서 같을때 0을 리턴하는게 아니라 조건문을 달아 주었습니다. 일반적으로 같을경우 0을리턴해 자리를 유지합니다.)
'Algorithm & Data Structure > BOJ' 카테고리의 다른 글
[백준] 3053 택시 기하학 (0) | 2020.01.15 |
---|---|
[백준] 1057 토너먼트 (0) | 2020.01.14 |
[백준] 1937 욕심쟁이 판다 (DFS, DP) (0) | 2020.01.13 |
[백준] 12100 2048(Easy) (0) | 2020.01.11 |
[백준] 1182 부분수열의 합 (0) | 2020.01.10 |
[백준] 1937 욕심쟁이 판다 (DFS, DP)
https://www.acmicpc.net/problem/1937
1937번: 욕심쟁이 판다
n*n의 크기의 대나무 숲이 있다. 욕심쟁이 판다는 어떤 지역에서 대나무를 먹기 시작한다. 그리고 그 곳의 대나무를 다 먹어 치우면 상, 하, 좌, 우 중 한 곳으로 이동을 한다. 그리고 또 그곳에서 대나무를 먹는다. 그런데 단 조건이 있다. 이 판다는 매우 욕심이 많아서 대나무를 먹고 자리를 옮기면 그 옮긴 지역에 그 전 지역보다 대나무가 많이 있어야 한다. 만약에 그런 지점이 없으면 이 판다는 불만을 가지고 단식 투쟁을 하다가 죽게 된다(-_-) 이
www.acmicpc.net
DFS + DP 문제였습니다.
dp[y][x] 에 (y,x)지점에서 살수있는 최대 일 수 를 저장합니다.
dfs로 재귀호출 을 하면서 dp[y][x]값을 지정해줍니다.
시간을 고려하기 위해 DFS에 DP를 적용시켜 문제를 풀어야 합니다.
즉, 방문했던곳이면 바로 dp[y][x]에 저장된 최대일수를 리턴합니다.
ex)
[map]
(0,0) 4 | (0,1) 6 | (0,2) 8 |
(1,0) 2 | (1,1) 12 | (1,2) 10 |
시작지점을 (0,0)으로 해보면
dp[0][0] = max(dp[0][0], dfs(0,1) + 1) = 5
dp[0][1] = max(dp[0][1], dfs(0,2) + 1) =4
dp[0][2] = max(dp[0][2], dfs(1,2) + 1) =3
dp[1][2] = max(dp[1][2], dfs(1,1) + 1) =2
dfs(1,1) -> 갈 곳이 없음 -> return dp[1][1] (= 1)
dfs(1,1) 이 1로 리턴되므로 역으로 올라가면 2, 3, 4, 5 가 되어 dp[0][0]은 5가 됩니다.
만약 시작지점을 (1,0)으로 한다면 dp[1][0] = max(dp[1][0], dfs(0,0)+1) 인데
dp[0][0] 의 값이 5로 저장되어 있으므로, return dp[0][0] 로 재귀호출을 바로 끝냅니다
따라서 do[1][0] 은 5 + 1 = 6 이 됩니다.
[dp]
5 | 4 | 3 |
6 | 1 | 2 |
'Algorithm & Data Structure > BOJ' 카테고리의 다른 글
[백준] 1057 토너먼트 (0) | 2020.01.14 |
---|---|
[백준] 10825 국영수 (Sort) (0) | 2020.01.13 |
[백준] 12100 2048(Easy) (0) | 2020.01.11 |
[백준] 1182 부분수열의 합 (0) | 2020.01.10 |
[백준] 1026 보물 (0) | 2020.01.09 |
[백준] 12100 2048(Easy)
https://www.acmicpc.net/problem/12100
12100번: 2048 (Easy)
첫째 줄에 보드의 크기 N (1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 게임판의 초기 상태가 주어진다. 0은 빈 칸을 나타내며, 이외의 값은 모두 블록을 나타낸다. 블록에 쓰여 있는 수는 2보다 크거나 같고, 1024보다 작거나 같은 2의 제곱꼴이다. 블록은 적어도 하나 주어진다.
www.acmicpc.net
브루트포스와 DFS를 같이 사용하여 해결한 문제입니다.
dfs를 호출할때마다 현재 map의 상태를 기억해주어야 모든 경우의 수를 따져볼 수 있습니다.
map 의 상 하 좌 우 이동은 move()함수를 통해 이동시켜줍니다.
* 맵을 이동시킬때 Queue를 사용하는데,
상,하 방향일땐 각 열의 모든원소를 큐에 담고,
좌,우 방향일땐 각 행의 모든원소를 큐에 담습니다.
idx변수를 사용해 상,하 일때 행, 좌,우 일때 열 을 지정해주면 해당 블록의 위치가 지정됩니다.
(이때 이동방향에 있는 블록이 우선순위인걸 생각해줍니다 idx -> 상: 0, 하: n-1, 좌: 0, 우: n-1)
'Algorithm & Data Structure > BOJ' 카테고리의 다른 글
[백준] 10825 국영수 (Sort) (0) | 2020.01.13 |
---|---|
[백준] 1937 욕심쟁이 판다 (DFS, DP) (0) | 2020.01.13 |
[백준] 1182 부분수열의 합 (0) | 2020.01.10 |
[백준] 1026 보물 (0) | 2020.01.09 |
[백준] 2573 빙산 (0) | 2020.01.08 |