본문 바로가기

알고리즘31

[BOJ] N과 M(1), next_permutation풀이 https://www.acmicpc.net/problem/15649 15649번: N과 M (1) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해 www.acmicpc.net 백트래킹으로 푸는걸 떠나서, next_permutation으로 어떻게 풀어야 할지 감이 잘 오지 않았다. 코드를 짧게해서 조합을 구할때처럼 뭔가 깔끔한 N! 풀이가 없나? 싶었다. 조합은 {0,0,0,1,1}로 두고 5C3을 한번에 출력할 수 있지만, 순열은 그렇지 않다. ​ 특히 next_permutation은 5명중에 순서고려 X해서 5명 다 세우는건 쉽게 할 수 있다. 하지만, 4P2 이런.. 2021. 11. 8.
[BOJ] 2448. 별찍기-11 https://www.acmicpc.net/problem/2448 2448번: 별 찍기 - 11 첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, ...) (0 ≤ k ≤ 10, k는 정수) www.acmicpc.net 여기까지 푸니 이제서야 재귀가 뭔지 와닿는다. 뭔가 말로 표현은 할 수없는데.. 어떻게 되는지 조금 생각할 수 있게됨 ​ 규칙 : 1. 이게 N = 12일때 인데, 뭔가 재귀함수 내에서 3개로 나눠서 호출하면 될 것 같다는 생각을 함 2. 파란 네모 단위로 배열에 담으면 되겠다는 생각 3. 시작점만 잘 주면 풀리겠다는 생각 4. 시작점을 어떻게 찾을까? N = 12일때(빨간색 네모로 들어가보자) div = N/2; recur(div, x, y+div.. 2021. 11. 4.
[BOJ] 1699. 제곱수의 합 https://www.acmicpc.net/problem/1699 1699번: 제곱수의 합 어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=22+22+12+12+12(5개 항)도 가능하다 www.acmicpc.net 풀이방법 : DP + 약간의 생각 ​ 1트 : 실패 Why? TLE 1. DP[n] = k, n을 만드는데 필요한 최소 숫자의 개수 라고 table 정의 ​ DP[1] = 1 DP[2] =2 // 1 + 1 DP[3] = 3 // 1 + 1 + 1 DP[4] = 1 // 2^2 ​ 이런식으로 해서 DP[10]을 구할땐, DP[1]+DP[9], DP[2]+DP.. 2021. 10. 28.
[알고리즘] Prim`s algorithm. MST 구하는 2번째 방법. 프림 반갑습니다. 이번엔 O(ElogV) 시간복잡도를 가지는 Prim알고리즘에 대해서 알아보겠습니다. ​ 이건 음.. heap을 알아야 하는데, 힙구조를 가지는 priority_queue를 사용할 수 있으면 좋습니다. 없으면 kruskal이 구현하기 더 낫습니다. ​ ​ Kruskal VS Prim 결과부터 말하면 Edge가 많으면 Prim, Edge가 적으면 Kruskal이 좀 더 좋습니다. (이론상) ​ Kruskal은 sort과정에 O(ElogE)이 피할 수 없기에 E에 영향을 받고, Prim은 O(ElogV)입니다. 이미 방문된 지점은 다시 방문되지 않기에 pq의 push나 pop과정이 없어서 그렇습니다. 근데 MST를 찾는다는건 기본적으로 V < E니까 쓰겠죠...? 근데 그냥 편한대로 합시다. ​ .. 2021. 10. 2.
[Programmers] 2021 kakao blind - 합승 택시 요금 https://programmers.co.kr/learn/courses/30/lessons/72413 코딩테스트 연습 - 합승 택시 요금 6 4 6 2 [[4, 1, 10], [3, 5, 24], [5, 6, 2], [3, 1, 41], [5, 1, 24], [4, 6, 50], [2, 4, 66], [2, 3, 22], [1, 6, 25]] 82 7 3 4 1 [[5, 7, 9], [4, 6, 4], [3, 6, 1], [3, 2, 3], [2, 1, 6]] 14 6 4 5 6 [[2,6,6], [6,3,7], [4,6,7], [6,5,11], [2,5,12], [5,3,20], [2,4 programmers.co.kr 풀이 방법 : 플로이드, 다익스트라 ​ 나의 사고 과정 1. undirected, .. 2021. 10. 1.
[자료구조] MST를 구할 때 사용하는 크루스칼 알고리즘(Kruskal) 설명에 앞서, Union - Find 연산에 대해서 학습을 해야하는데, 이 부분은 제가 봤던 유튜브로 대체하겠습니다. https://www.youtube.com/watch?v=eTaWFhPXPz4 이것과 Optimized Union/FInd를 보시고 https://www.acmicpc.net/problem/1717 1717번: 집합의 표현 첫째 줄에 n(1 ≤ n ≤ 1,000,000), m(1 ≤ m ≤ 100,000)이 주어진다. m은 입력으로 주어지는 연산의 개수이다. 다음 m개의 줄에는 각각의 연산이 주어진다. 합집합은 0 a b의 형태로 입력이 주어진다. 이는 www.acmicpc.net 이 문제를 풀어서 제대로 이해했나 확인해보시면 됩니다. ​ Kruskal 알고리즘을 왜 쓰는가? - MST를.. 2021. 9. 30.
[BOJ] 같은수로 만들기 2374, 13146 (분할정복, 스택) https://www.acmicpc.net/problem/2374 2374번: 같은 수로 만들기 n(1 ≤ n ≤ 1,000)개의 자연수 A[1], A[2], A[3], …, A[n]이 있다. 이 자연수에 Add(i)라는 연산을 하면, A[i]가 1만큼 증가한다. 이때, A[i]만 증가하는 것이 아니고, A[i]의 좌우로 인접한 같은 수의 그룹이 한 www.acmicpc.net 풀이 방법 : 분할정복 (재귀), 스택 ​ 분할정복을 이용한 방법은 O(N^2)까지 나올 수 있어서, 13146에서 시간초과가 납니다. 하지만 stack을 이용한 풀이로 하면 O(N)으로 해결할 수 있습니다. ​ 1. stack을 이용한 풀이 https://www.acmicpc.net/problem/13146 13146번: 같은 .. 2021. 9. 29.
[BOJ] 12738, 14003 LIS(가장 긴 증가하는 수열, 이분탐색) - 2 https://www.acmicpc.net/problem/12738 12738번: 가장 긴 증가하는 부분 수열 3 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (-1,000,000,000 ≤ Ai ≤ 1,000,000,000) www.acmicpc.net n이 100만이므로 O(nlogn)의 풀이를 택해야 합니다. 이번엔 이분탐색을 이용해서 풀어보도록 하겠습니다. 참고로 이분탐색은 빠르게 개수는 찾을 수 있지만, LIS가 항상 올바른 순서로 있다고 장담할 순 없습니다. lower_bound함수를 이용하면 t보다 같거나, 큰 가장 최소의 인덱스를 반환해줍니다. 예를들면 arr[3] = {1,5,6} 일때 lower_bo.. 2021. 9. 25.
[BOJ] 11053, 11722, 14002 LIS(가장 긴 증가하는 수열, 가장 긴 감소하는 수열) - 1 https://www.acmicpc.net/problem/11053 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net 저는 바로 못풀었습니다. DP로 어떻게 풀지? 이렇게 생각했어요. 위키피디아에서 LIS를 검색해서 시뮬레이션을 보고 이분탐색으로 했습니다. 전 아이언5티어입니다.. ​ 풀이 방법 : 2가지가 있습니다. LIS 시리즈가 1~5까지 있는만큼, 더 좋은방법이 존재합니다. 이번 포스팅에서는 DP를 이용한 풀이, 다음 포스팅에서.. 2021. 9. 25.
[BOJ] 배열돌리기 2 (겉면부터 하나씩 돌려도 된다) https://www.acmicpc.net/problem/16927 16927번: 배열 돌리기 2 크기가 N×M인 배열이 있을 때, 배열을 돌려보려고 한다. 배열은 다음과 같이 반시계 방향으로 돌려야 한다. A[1][1] ← A[1][2] ← A[1][3] ← A[1][4] ← A[1][5] ↓ ↑ A[2][1] A[2][2] ← A[2][3] ← A[2][4] A[2][5] www.acmicpc.net 처음에 뭐가 다르지? 했는데, R이 다르다 R이 1천 -> 10억이다. 시간이 오래 걸렸다. 몇시간 걸렸다. 왜 그랬는지 알아보자. 1. 뭔가 %로 나눠야한다는건 알았다. N*M으로 나눴다. 대체 왜 이런 생각을 했는지 모르겠다. 당연히 틀렸다. 2. 생각해보니까 맨 바깥 줄이 5*4에서 14번만에 제자.. 2021. 9. 1.
728x90