본문 바로가기

PS(알고리즘) 문제풀이26

[백준] 1697번 숨바꼭질 <C++> 문제 문제 분석 간선의 가중치가 동일하고 이동에 대한 최단 거리를 구하는 문제이다. 그런데 이 문제는 특이하게 1차원이다. 즉, 1차원 BFS 문제의 대표 유형이다. 최단 거리가 어떠한 경우에도 될 수 없는 경우는 다음과 같다. - 이미 방문했던 곳을 또 방문하는 경우 (동선 낭비) - 맵 범위 밖을 벗어나는 경우 길이가 8이고 수빈이가 3번 위치에 있을 때, X-1, X+1, 2*X 위치로 각각 이동시킬 때 각 위치의 최단 경로를 아래에서 살펴보자. 3번 위치에서 X-1, X+1, 2*X 지점은 각각 2,4,6 지점이다. 그래서 저 3개의 지점은 1번의 이동만으로 저 지점에 도달할 수 있다. 이제 케이스를 나눠서 생각해봐야 한다. - 2번 지점으로 이동한 경우 - 4번 지점으로 이동한 경우 - 6번 지.. 2024. 2. 3.
[백준] 16165번 걸그룹 마스터 준석이 <C++> 문제 문제 분석 unordered_map(해시)을 통해 key와 value 값을 양방향으로 검사하는 테크닉을 익히는 문제이다. key 값을 통해 value 값을 찾는 것은 find 함수로 쉽다. value 값을 통해 key 값을 찾으려면 iterator을 순회하면서 찾아야 한다. 대신 시간 제한이 빡빡한 경우 배열에 key 값을 저장해두고 배열의 인덱스로 접근하는 방법도 있지만 이 문제의 경우 N과 M의 범위가 100으로 작고 시간 제한도 2초이므로 iterator로 순회해도 된다. 정답 코드 문제 요구사항을 그대로 구현하면 된다. #include #include #include #include using namespace std; unordered_map um; // (멤버 이름, 팀 이름) int m.. 2024. 2. 3.
[백준] 9093번 단어 뒤집기 <C++> 문제 문제 분석 / 시행 착오 문제의 요지는 쉽게 말하자면 문장에서 각 단어마다 반대로 뒤집어서 출력하는 것이 핵심이라고 볼 수 있다. 필자는 총 2번의 시행착오를 거쳤는데 이 글을 보는 많은 독자들이 이 2개의 시행착오 중 하나를 겪었을 것이라고 생각한다. 시행착오 1 : 문장이 1개만 입력되어지고 프로그램이 종료될 때 분명 예제 케이스를 잘 붙여넣기 했는데 시행착오 1 이 일어나는 경우에는 cin/getline과 cin.ignore() 의 개념을 몰라서 그런 것이다. cin은 강제 개행(즉, '\n')을 처리하지 않고 입력 버퍼로 남겨둔다. (즉, '\n'은 입력 버퍼에 남는다.) getline은 강제 개행(즉, '\n')을 입력 버퍼에서 가져와 처리한다. (즉, '\n'은 입력 버퍼에 남지 않는다... 2024. 2. 3.
[백준 11724번 C++] 연결 요소의 개수 (BFS) 문제 문제 분석 그래프의 연결되어 있는 뭉텅이의 개수를 찾는 문제이다. 예제 입력 1을 예시로 그림을 그리면 아래와 같고 연결 요소의 개수(뭉텅이의 개수)는 2이다. 간선에 가중치가 없으므로 bfs 탐색과 dfs 탐색으로 이 문제를 해결할 수 있다. - (dfs/bfs 구현 연습 문제) - (전형적인 flood fill 에서 뭉텅이의 개수를 세는 유형) 정답 코드 - bfs로 구현한 코드이다. - 이때 메모리 제한은 512MB 이므로 N의 크기가 1000인 2차원 배열을 만들어도 된다. - 이때 1부터 입력받은 노드 개수만큼 돌면서 만약 방문하지 않은 노드가 있다면 bfs 탐색을 하고 bfs 탐색을 한 횟수가 뭉텅이의 개수이므로 그 개수를 출력해준다. // bfs 풀이 #include #include #.. 2024. 2. 2.