[BOJ] 백준 17299 오등큰수 (JAVA)
Algorithm/- Baekjoon2024. 4. 1. 14:43[BOJ] 백준 17299 오등큰수 (JAVA)

📑 문제🌱 아이디어위 문제에서 말하는 “오등큰수” 는 NGF(i) 일 때 자기 자신 오른쪽에 있는 숫자 중 자신보다 많은등장 횟수를 가지는 숫자 중 가장 왼쪽에 있는 수이다. 예를 들어보자! ex.) 1 1 1 1 3 1 1인 경우 NGF(3) = 1이다. 반대로 NGF(1) = -1이다, 1보다 큰 등장 횟수가 없기 때문이다.그리고 출력은 입력된 순서를 지켜야 하기 때문에 -1 -1 -1 -1 1 -1 -1이다. 위 문제는 스택을 사용해야 한다. 내가 스택을 사용해야겠다고 유추한 근거는 두 가지이다 1. 답을 정하는 조건이 자신의 오른쪽 즉 방향이 정해져 있다.2. N ≤ 1,000,000이며 이는 O(N^2)를 가지는 단순한 구조로 구현 불가능 -> 시간 초과 발생 결론은 효율적인 구조 ex.) ..

[BOJ] 백준 1719 택배 (JAVA)
Algorithm/- Baekjoon2024. 3. 21. 05:01[BOJ] 백준 1719 택배 (JAVA)

📑 문제🌱 아이디어최단거리를 구하고, 최단거리 루트의 경로 역추적을 통해 풀어보자! 최단거리 문제이다. 하지만 최단거리로 갈 때 바로 첫 노드를 출력하는 문제이다. 가령 1 → 5번 노드로 가야 한다면 여러 가지 루트 중 가장 최단 경로 1 → “3” → 4 → 5 일 때위 문제에서 요구하는 답은 "3"번 노드를 출력하는 게 조건이다. 즉 경로 역추적 알고리즘이 필요하다. 그리고 또 하나 i → j로 갈 때 바로 직행하는 방법도 있지만 이러한 루트는 최단루트가 아닐 수 있다.i → j ,  i → h → j ⇒ 직행루트 와 경유지가 있는 루트를 비교해야 한다결국 플로이드워셜 알고리즘을 사용하는 게 가장 좋아 보이는 문제이다.기본적인 플로이드 워셜 알고리즘을 구현하는 것은 어렵지 않았으나. 경로 역추적..

[BOJ] 백준 1525 퍼즐 (JAVA)
Algorithm/- Baekjoon2024. 3. 19. 20:58[BOJ] 백준 1525 퍼즐 (JAVA)

📑 문제 🌱 아이디어"고민해도 안 나온다면 답지보고 내 것으로 만들자" 이 문제는 내가 여태까지 풀어왔던 알고리즘 지식 + 기법(?)으로  어떻게는 해결해보려고 했으나 다 실패했다.우울해하면서 결국 검색을 통해 코드를 봤다.HashMap으로 BFS 방문처리를 하는 코드였지만 정말 특이한 부분이 있었다 1차원 배열의 인덱스(문자열)를 2차원 배열로 변경해서 경로 이동후 다시 1차원 배열(문자열)로 변환 후HashMap을 통해 문자열을 저장하는 방법이었다 예를 들어문자열 str = "123456789"3*3 2차원 배열로 나타낼 때 1차원 배열 -> 2차원 배열Y = 3 / 3X = 3 % 3 숫자 4는idx ( 1 , 0 )에 위치하게 된다만약 X 축으로 +1을 해주고 idx ( 1 , 1 )로 이동했..

[BOJ] 백준 1153 네 개의 소수 (JAVA)
Algorithm/- Baekjoon2024. 3. 14. 17:18[BOJ] 백준 1153 네 개의 소수 (JAVA)

📑 문제🌱 아이디어소수판별 알고리즘으로 구한 소수와 백트래킹으로 답을 구하자! 골드바흐 추측을 통해 푸는 것이 가장 주류 풀이법인 것 같은데 골드바흐 추측을 알지 못하기 때문에에라토스테네스의 체 + 백트레킹으로 문제를 풀었다. 성능차이는 골드바흐 추측을 통해 푸는 방법이 더 좋다. 아마도 백트레킹 특성상 시간초과가 날 수 있기 때문에골드바흐 추측으로 푸는 것 같은데 가지치기를 잘 설정하면 시간초과는 전혀 걱정 안 해도 된다! 위 문제는 스페셜 저지 문제이며 여러 가지의 답 중 단 하나만 출력해도 답으로 인정해 준다 즉 38 = 5 + 7 + 13 + 13, 38 = 2 + 2 + 3 + 31 등 여러 가지 답 중 하나만 출력해도 무방하다 가장 큰 소수 값부터 차례대로 입력해서  4개의 소수의 합이 N..

[BOJ] 백준 10830 행렬 제곱 (JAVA)
Algorithm/- Baekjoon2024. 3. 13. 00:39[BOJ] 백준 10830 행렬 제곱 (JAVA)

📑 문제🌱 아이디어분할정복을 이용한 행렬제곱 문제, 큰 문제를 작은 단위로 나눠서 풀어보자 분할 정복의 가장 기본적인 개념은 큰 문제를 작은 단위로 나눠서 푸는 것이다.. 예를 들면 N^8 은 N*N*N*N*N*N*N*N 이다. 즉 N을 8번 곱해야 한다.  분할 정복을 통해 작은 단위로 나눠서 bottom up 방식으로 푼다면  (((N^2)^2)^2) 3번만 연산하면 된다. 이는 O(logn)의 시간복잡도를 가지며 N^B, B가 클수록 좋은 성능을 보여준다.  그리고 행렬 A와 행렬 B를 곱한다면 A =1234 B =5678  A X B =1*5+2*71*6+2*83*5+4*73*5+4*8 위와 같이 행렬곱셈과 동시에 분할정복으로 작은 단위 ~ 큰 단위로 답을 도출해야 한다.🌱 코드 및 풀이 만..

반응형
image