[백준 7561번] 크래머의 공식 (C++)
·
📚알고리즘/백준
https://www.acmicpc.net/problem/75613 X 3 동차선형연립방정식을 크래머의 공식을 이용하여 풀어내라는 문제다.선형대수학에 나오는 개념이며, Determinant(행렬식)의 개념을 알고 있으면 문제를 이해하기 쉽다.크래머 공식을 단순 구현하는 문제이긴 부동소수점을 조절해주어야 하고, 선형대수학에 나오는 개념을 미리 알고 있는 사람이 아니면 생각보다 코드를 작성하기 시작하는데 오래걸릴거 같다. 각 원소의 범위가 -1000 ~ 1000이므로 행렬식을 계산하는 도중에 int형 범위를 넘어갈 수 있음에 유의하자.#include #define ep 0.0005#define lint long longusing namespace std;lint n, detA, detA1, detA2, de..
[백준 31404번] 아리스, 청소합니다! (Easy) (C++)
·
📚알고리즘/백준
https://www.acmicpc.net/problem/31404분리집합으로 풀어야 하나 했는데 사이클을 어떻게 잡아야 할지 감이 안오고, 입력값들의 범위가 딱 봐도 구현이길래 구현만 하자라는 마인드로 풀었다.먼지를 청소했을때는 ruleA를 따르고, 아닐때는 ruleB를 따르며 움직여야 한다. 3차원 배열을 이용해서 특정 위치 (r,c)에 들어가는 방향이 같은 경우 사이클이 생기므로 반복을 종료하면 된다.또 중요한 건 먼지를 치웠을 때 사이클 확인을 위해 저장해놓은 3차원 배열을 모두 처음 상태로 초기화 시켜주어야 한다. ruleA와 ruleB가 다르기 때문에 같은 방향으로 들어가더라도 다음 이동이 달라질 수 있기 때문이다. 개인적으로 어려웠던 문제다.#include #include #include #..
[백준 2206번] 벽 부수고 이동하기 (C++)
·
📚알고리즘/백준
https://www.acmicpc.net/problem/2206 (1,1)에서 (n,m)까지의 최소 경로를 구하는 문제다. 조건: 길은 0, 벽은 1로 표현되어 있으며 벽은 최대 1회까지 부술 수 있다.평범하게 BFS로 구현하되 벽을 부순적이 있는지 확인할 수 있어야한다. 예전에 https://www.acmicpc.net/problem/31404에서 특정위치에 반복해서 들어가는 것 뿐만 아니라 들어오는 방향까지 고려해서 3차원 배열을 이용하여 문제를 해결했었다. 똑같은 문제라고 생각했고 visited배열을 visited[x][y][cnt]로 설정하여 cnt에 벽을 부쉈는지 확인하는 배열을 추가했다. 배열이 3차원이 된 것만 빼면 나머지는 well-known한 BFS탐색이다.#include #includ..
[백준 1437번] 수 분해 (C++)
·
📚알고리즘/백준
https://www.acmicpc.net/problem/1437풀이가 2가지가 있다.1. Dp2. 수학1. 다이나믹 프로그래밍Dp로 풀려고 하면 당연히 점화식을 찾아야 하고 노가다를 하다보면 점화식이 쉽게 찾아진다.n > 4인 경우에서 dp[n] = dp[n-3]*3이 된다. #include #define mod 10007using namespace std;int main() { int n; cin >> n; int* arr = new int[n+1]; arr[0] = 0; arr[1] = 1; arr[2] = 2; arr[3] = 3; arr[4] = 4; for(int i = 5; i  2. 수학수학적 접근이 쉽지 않은데... 결론적으로는 3을 가장 많이 만들면 된다.DP로 접근할때 노가다한 수들을..
[백준 28703번] Double it (C++)
·
📚알고리즘/백준
https://www.acmicpc.net/problem/28703maxPq, minPq 우선순위 큐 2개를 이용해서 하나씩 뽑으면서 차이의 최솟값을 갱신해나가면 된다.문제는 위의 과정의 종료조건인데, 구해야 하는 것이 최대값-최솟값의 차이기 때문에 만약 입력으로 주어지는 모든 수를 2배를 할 필요가 없다. 모든수가 2배가 되면 1/2배를 할 수 있고 그럼 2배가 된 상태보다 차이도 1/2이 되므로 모든 수가 2배이상으로 커지는 것은 의미가 없다.따라서 모든 수가 2배가 되기 전까지가 반복문의 종료조건이 된다. #include #include using namespace std;int main() { ios_base::sync_with_stdio(false); cin.tie(0); int n, num;..
[백준 20302번] 민트 초코 (C++)
·
📚알고리즘/백준
https://www.acmicpc.net/problem/20302입력받는 모든 수를 소인수 분해 해서 곱셈과 나눗셈으로 나눠주면 된다.곱셈일 때는 등장하는 소수의 개수만큼 배열에서 더해주고, 나눗셈일 때는 반대로 빼주면 된다.최종 배열을 탐색하면서 0보다 작은 값이 있으면 분모에 해당 소인수가 살아있다는 뜻이므로 결과가 유리수가 된다.소인수분해하는 코드를 알아가기 좋은 문제다. #include #include #include #include #define endl "\n"using namespace std;int n, num;vector arr(100001,0);void fac(int a, bool check){ int tmp = sqrt(a); if(check){ for(int i = 2; i 1..
루오
'📚알고리즘' 카테고리의 글 목록 (3 Page)