본문 바로가기

백준12

다익스트라 알고리즘 정리 지난 알고리즘 글에서 다익스트라 알고리즘을 정리한 글을 작성한다 예고했었다. 다익스트라 알고리즘의 구현 방법 및, 실제 문제 풀이를 정리해보고자 한다. 다익스트라 알고리즘(Dijkstra's Algorithm) : 그래프 상의 두 정점 사이의 최단거리를 구하는 알고리즘. GPS, 네트워크 라우팅 등의 다양한 분야에서 활용된다. 다익스트라 알고리즘 구현 다익스트라 알고리즘은 다음과 같은 과정을 거친다. 시작점에서 탐색을 시작한다. 새 노드에 방문할 때마다, 가장 작은 거리(가중치)를 갖는 노드를 골라서 방문한다. 방문한 노드의 각 인접점에 대해, 시작점까지의 거리를 계산한다. → 이 때, 새로운 최단거리가 나오면 최단거리를 업데이트 한다. 이전에 다른 글에서 정리한 그래프와 달리, 다익스트라 알고리즘의 구.. 2023. 12. 28.
문자열 문제 풀이 알고리즘 5주차 주제는 문자열이었다. 역시나 기억에 남는 문제 위주로 푼 문제를 정리해본다. 백준 4889번 문제가 어째 익숙한 느낌이 들었는데, 예전에 풀었던 4949번 균형잡힌 세상 문제와 비슷한 괄호 문제였다. 다만 약간의 차이가 존재하는데, 4949번은 괄호가 포함된 문자열을 탐색하고, 괄호가 올바른지(균형 잡혔는지)의 여부를 확인하는 문제였다면, 이 문제는 올바르지 않은(안정적이지 않은) 괄호 문자열을 최소 몇 번 수정해야 옳게 만들 수 있는지를 확인해야 한다. 따라서 4949번처럼 괄호를 스택에 넣고 빼며, 첫째로 괄호로 이루어진 문자열이 안정적인지 확인한다. 만약 스택에 남은 요소가 없다면 이미 괄호 문자열은 안정적인 상태이므로 수정할 필요가 없음을 의미한다. 만약 스택에 남은 요소가 있다면.. 2023. 12. 11.
구현 문제 풀이 알고리즘 스터디 4주차 주제는 구현이었다. 기억에 남는 문제 위주로 풀이 내용을 정리한다. 백준 2174번 다수의 로봇들 (1≤N≤100) 이 존재하는 공간에서 각 로봇들에 명령을 내리고, 해당 명령을 문제 없이 수행할 수 있는지 파악하는 문제. 명령은 총 3가지인데, ‘로봇이 향하는 방향을 기준으로’ 왼쪽/오른쪽으로 90도 회전/앞으로 한 칸 움직이기이다. 따라서 각 로봇들의 위치 뿐 아니라, 로봇이 현재 향하고 있는 방향 또한 고려해야하는 문제였다. 로봇이 다수 존재하기 때문에, 입력받은 순서대로 로봇에 번호를 붙여 객체에 위치 및 방향을 저장해두고, 각 로봇의 정보에 접근하기 용이하게끔 하였다. 이후로는 순서대로 들어오는 명령을 처리하기만 하면 된다. const readline = require(".. 2023. 12. 4.
그래프 & DFS/BFS 문제 풀이 지난 게시물에서 그래프와 그래프 순회에 대한 강의를 듣고 내용을 정리하여 포스팅했었다. 이번에는 강의 내용을 활용하여 풀었던 문제들을 짧게 공유한다. 문제들은 대부분 백준 문제집의 DFS+BFS 필수 문제 에 속한 문제들이다. 백준 2178번 이차원 배열 형태의 미로를 탐색하며, 출발점부터 도착점까지의 최소 거리를 구하는 문제이다. BFS/DFS 문제를 제대로 푸는게 처음이라, 공부한 개념을 적용하기 조금 어려웠는데 다음과 같이 풀었다. BFS로, 시작점(0, 0)에서부터 순회를 시작한다. 미로는 길이 존재하고, 현재 접점과 인접한 사방의 접점으로만 진행할 수 있다. 따라서 순회 시 이를 전부 체크한다. 위의 조건을 만족하며 아직 방문하지 않은 인접점은 방문 처리 후 BFS 탐색 큐에 넣어줌으로써, 다.. 2023. 11. 19.
유클리드 호제법 백준의 정수론 문제를 살펴보다, 유클리드 호제법에 대해 알게 되었다. 어떤 것인지 간단하게 파악하고, 이를 이용해 문제를 푼 것에 대해 짤막히 기록한다. 유클리드 호제법 자연수 혹은 정수 사이의 최대공약수(Greatest Common Denominator: GCD)를 구하기 위한 알고리즘. a와 b의 최대공약수는, a / b의 나머지 r과 b의 최대공약수와 같다. 이를 실제 함수로 구현하면 재귀 혹은 반복을 통해 구현할 수 있다. 나는 아래와 같은 코드를 작성해 문제풀이에 활용하였다. const getGCD = (a, b) => { if (a === b) return a; if (a === 1 || b === 1) return 1; if (b === 0) return a; return getGCD(b, .. 2023. 10. 29.
백준에서 JS로 문제 풀이하기 + 이런저런 메모(+추가: 2023.11.22) 앞서 올린 백트래킹 게시물에서 언급했듯, 얼마 전부터 시간이 날 때 조금씩조금씩 알고리즘 문제 풀이를 하고 있다. 주로 백준에서 문제를 풀고 있는데, 백준에서 문제를 풀 때 어떻게 풀고 있는지 + 문제 풀 때 개인적으로 알아두면 좋을 것 같은 점을 간단하게 기록해두려 한다. 백준에서 JS로 문제를 풀기 위한 세팅 예전에 백준에서 문제를 풀 때는 C++를 사용했는데, 이제는 거의 잊어버리기도 했고 업무를 JS로 하다 보니 JS로 문제를 풀어야겠다는 생각으로 아무 생각 없이 언어 설정을 살펴보았다. 하지만 자바스크립트는 목록에 보이지 않았고... node.js만 덩그러니 있어서 뭔가 싶던 도중 검색을 통해 JS는 node.js를 선택해야 함 + 입력값을 직접 처리해야 함 이라는 정보를 얻게 되었다. JS로의.. 2023. 10. 23.