본문 바로가기

Algorithm

(51)
[Java] 백준 1114번 - 통나무 자르기 통나무 최대 c번 자를 수 있고, 자르는 위치는 정해져 있다. 통나무를 잘라서 만들 수 있는 길이의 최대값의 최소값을 구하는 문제이다. 최대값의 최소값이라는 문구가 주어지면 이분 탐색의 방법을 사용하는 것이 가능하다. 이분 탐색은 주어진 조건을 만족하는 최소값이나 최대값을 log(n)의 시간 복잡도에 찾을 수 있기 때문이다. 잘리는 위치는 정해져있으므로 누적합을 이용해서 통나무의 길이를 더하고, 만약 누적합이 허용되는 길이보다 길다면, 이전의 위치에서 통나무를 잘라준다. 자르지 못하는 상황에서 길이를 초과한 경우에는 break를 이용해 통나무 탐색을 빠져나와서 left와 right의 값을 변경해준다. 첫번째 통나무의 길이를 최소로 하라는 조건이 주어져 있기 때문에, 뒤에서부터 통나무를 자른다. 만약 통나..
[Java] 2021 위클리 챌린지 6주차 - 복서 정렬하기 복서들의 승패 정보를 가지고 정렬을 하면 되는 문제이다. 전체 승률이 높은 복서의 번호가 앞쪽으로 갑니다. 아직 다른 복서랑 붙어본 적이 없는 복서의 승률은 0%로 취급합니다. 승률이 동일한 복서의 번호들 중에서는 자신보다 몸무게가 무거운 복서를 이긴 횟수가 많은 복서의 번호가 앞쪽으로 갑니다. 자신보다 무거운 복서를 이긴 횟수까지 동일한 복서의 번호들 중에서는 자기 몸무게가 무거운 복서의 번호가 앞쪽으로 갑니다. 자기 몸무게까지 동일한 복서의 번호들 중에서는 작은 번호가 앞쪽으로 갑니다. 위 4가지 조건으로 정렬을 시키면 된다. 그래서 복서의 정보를 담을 class를 선언해주고, 해당 값들을 저장한다. 승률의 경우 플레이한 게임의 수가 0인 경우에 0/0 이 되지 않도록 주의를 기울이면 쉽게 해결이 가..
[Java] 2021 위클리 챌린지 5주차 - 모음 사전 A, E, I, O, U 5개의 모음을 사용하여 만들 수 있는 길이 5 이하의 모든 단어가 수록된 단어집이 있다. 단어는 사전순으로 배열되어 있으며, 첫번째 단어는 "A"이고, 두번재 단어는 "AA"이고 마지막 단어는 "UUUUU"이다. word를 input으로 받을 때, 이 단어가 단어집에서 몇번째째 단어인지 return 하는 문제이다. 대략적으로 계산해보았을 때 총 단어의 개수는 6^5 = 7776 개를 넘을 수 없다. 단어의 위치를 알 수 있는 규칙을 찾는 것도 방법이겠지만, 단어의 수가 많지 않으니 brute force 방법을 이용해 풀어도 된다. orderMap이라는 map변수를 만들어서 (단어, 순번) 조합으로 map에다 저장을 하고, solution에는 map에서 순번을 찾아서 return하..
백준 2251번 물통(Java) A, B, C 세개의 물통이 있고, 처음에는 A와 B물통에는 물이 비어 있고 C물통에만 물이 차있다. 물통의 최대 용량이 input으로 주어지고, 어떤 물통에서 다른 물통으로 물을 따를 때는 다른 물통이 가득 찰 때까지 혹은, 따르는 물통의 물이 빌 때까지 따를 수 있다. A물통이 비어 있을 때, C의 물통에 차있는 물의 양으로 가능한 것을 오름차순으로 출력해야한다. 물을 따르는 경우는 A->B, A->C, B->A, B->C, C->A, C->B 총 6가지 경우가 있다. 이 때, 현재 물통에 담긴 물의 양을 상태로 저장하여 한번 방문한 상태의 경우는 재방문 하지 않도록 BFS를 구현하여 문제를 풀어주면 된다. 나는 물의 양을 "-"로 연결하여 Key를 만들었고, Set을 이용해서 방문 여부를 체크했다...
백준 1027번 고층 건물 (c++) 중학교 1학년 때 배우는 함수를 이용하면 된다. 볼 수 있는 최소 건물의 높이를 구하는 함수는 f(x) = ax + b 가 된다. 처음에는 모든 건물을 볼 수 있으므로 a = - 999999999 모든 건물을 볼 수 있는 최소값을 잡고, b는 현재 건물의 높이가 들어가되면 된다. 각 건물들을의 왼쪽과 오른쪽을 확인하면서 볼 수 있는 건물의 최소 높이 보다 높다면 num ++ 를 하고, 기울기 a 값을 업데이트 한다. 각 건물별로 볼 수 있는 건물들을 확인하고 최대값을 출력하면 된다. #include using namespace std; int main() { double building[50]; int n; cin >> n; for (int i = 0; i > buildin..
백준 1022번 소용돌이 예쁘게 출력하기 (c++) 소용돌이는 여러개의 정사각형들이 둘러쌓여 있는 것으로 볼 수 있다. 정사각형의 각변에서 숫자가 어떻게 늘어가는지 규칙을 찾아서 출력해주면 된다. 1. 정사각형의 오른쪽 변 행이 위로 올라갈수록 숫자가 증가한다. 행은 변수 i 로 받아서 관리하고, 위로 올라가는 것은 i가 감소하는 것을 의미한다. 그래서 startNum -i 임을 알 수 있고 -i , -i + 1, -i +2 ,..., i 를 0,1,2,3,... i *2 로 바꾸기 위해서 j 를 더해준다. 오른쪽 변이 j이므로 j는 항상 고정된 값이다. 그래서 startNum - i + j 가 오른쪽 변의 숫자 공식이 된다. 2. 정사각형의 위쪽 변, 왼쪽, 아래쪽 변도 동일한 방법으로 수식을 적을 수 있다. 숫자의 최대값을 구하고, 최대값의 길이만큼 ..
Codility MinMaxDivision 풀이 (Java) 최대값이 M인 배열 A가 인풋으로 들어온다. 우리는 K개의 배열 A를 K개의 그룹으로 나누고 각 그룹의 합의 최대값을 최소로하도록 만드는 문제이다. 카테고리가 Binary Search이기 때문에, 이분 탐색을 써서 풀 수 있는 문제라는 것을 알 수 있다. 각 그룹의 최대값을 이분탐색을 통해서 찾아주면 된다. l = 0, r = M * A.length 로 설정해준다. r을 M * A.length로 설정한 이유는 배열의 각 원소의 최대값이 M이기 때문이다. sum이라는 변수를 만들어 각 그룹의 합을 저장하고, sum이 mid값보다 커질 때는 새로운 그룹을 만드는 것으로 코드를 작성한다. mid값은 새로운 그룹을 만드는 구분자로 사용되며, 정답과는 다른 값이다. 그룹의 개수가 K보다 크게 된다면, mid값이 ..
백준 2075번 N번째 큰 수 (c++) N*N (N > n; for (int i = 0; i > arr[i]; } sort(arr, arr + n * n); cout > n; // 2. priority queue 풀이 priority_queue pq; for (int i = 0; i > input; pq.push(input); } //상위 n개만 남긴다. while (pq.size() > n) { pq.pop(); } } cout