C++

1. 문제 설명링크 : https://www.acmicpc.net/problem/10122. 풀이과정문제 해결의 흐름 문제를 살펴보면, 배추가 심어진 위치값들이 주어지고 서로 연결된 배추들이 하나의 집합(덩어리)를 형성함을 알 수 있습니다. 따라서 이 문제는 bfs를 통해 그래프에서 연결된 요소들의 개수를 찾아내는 문제임을 파악하였습니다. 입력값을 저장하기 위해 배추 밭은 저장하는 2차원 벡터(graph), 방문 여부를 체크하는 2차원 벡터(visited)를 사용하였습니다. 그러나 테스트케이스마다 graph와 visited를 초기화해야 하므로 다음 2가지 방법 중 하나를 사용할 수 있었습니다.전역 변수 2차원 벡터를 선언하고 assign()을 활용하여 크기를 재할당한다.테스트케이스마다 새로운 지역 변수로..
1. 문제 설명 링크 : https://www.acmicpc.net/problem/11672. 풀이과정문제 해결의 흐름  트리에서 임의의 두 점 사이의 거리에 대하여 가장 긴 거리를 찾는 문제이기에 임의의 두 점 사이의 거리를 모두 구해 가장 긴 거리를 찾는 방법을 떠올렸습니다. 즉, 완전탐색과 BFS를 결합하여 문제를 풀고자 하였습니다. 하지만 아래와 같은 트리 구조를 예로 들어봤을 때, 굳이 완전탐색을 적용하여 모든 점을 탐색할 필요 없이 더 간단하게 풀 수 있는 방법이 있지 않을까 고민했습니다. 1 / \ 2 3 / \ 4 5 \ 6    3. BFS는 특정 노드에서 출발하여 모든 노드를 ..
1. 문제 설명링크 : https://www.acmicpc.net/problem/11492. 풀이 과정문제 해결의 흐름  우선, 문제 설명을 읽고 나서 DP 문제일 거 같다는 느낌이 강하게 들었습니다. 동적계획법, DP(Dynamic Programming)이란?중복되는 계산 결과를 저장하여 복잡한 문제를 더 작은 하위 문제들로 나누어 해결하는 기법입니다.이 기법은 다음 2가지 특징을 가진 문제에서 주로 사용됩니다!최적 부분 구조 : 문제를 작은 부분 문제들로 나누어 부분 문제들의 최적해를 구하여 최종적으로 전체 문제의 최적해를 구할 수 있는 구조 중복 부분 문제 : 동일한 부분 문제가 여러 번 반복되어 나타나는 구조 이 문제를 DP로 접근해야하는 이유는 이웃한 집의 색깔은 서로 달라야하는 조건 하에 모든..
1. 문제 설명링크 : https://www.acmicpc.net/problem/117232. 풀이 과정문제 해결의 흐름  처음에는 문제 제목처럼 집합 STL (std::set)을 사용하는 문제라고 생각하고 풀었더니 시간 초과로 문제가 자꾸 틀렸습니다! 입출력 시간도 줄여보고 여러 시도를 해봤지만, 이 방법은 정답이 아닌듯 보였습니다. 그래서 배열로 해결할까 고민하던 중 알고리즘 분류를 까보니 비트마스킹으로 풀어야하더라구요! 한번도 풀어본 적 없는 풀이법이라 많이 당황하였지만 CS 과목을 들으며 비트 연산에 익숙해졌기에 도전해보았습니다. 비트마스킹이란? 이진수 비트들을 활용하여 데이터를 효율적으로 저장하고 조작하는 기법메모리 절약, 속도 측면에서 엄청난 장점이 있음 비트마스킹을 통해 특정 비트를 1, 0..
1. 문제 설명링크 : https://www.acmicpc.net/problem/27982. 풀이 과정문제 해결의 흐름 보통 1초의 제한은 약 1억회 연산을 수행할 수 있는 기준이며, N(카드의 개수)가 최대 100개이므로 3중 for문을 사용할 경우 최대 백만회의 연산을 수행하므로 주어진 시간 내에 해결 가능하다고 판단하였습니다. 세 수의 합이 M을 초과하는 경우에는 break문을 사용하여 탐색을 중단하도록 효율을 높였습니다.#include #include using namespace std;int main() { // 0. 입력 받기 int N, M; // N(3 > N >> M; int num_lst[N]; for (int i = 0; i > num_lst[i]; } ..
1. 문제 설명문제 바로 가기 2. 풀이 과정문제 해결의 흐름기능 순서대로 개발함을 인지하자. progresses 배열을 순회하며 기능개발에 걸리는 시간(days)을 구하자.days가 큐에 저장된 이전 값보다 크다면 이전 작업의 개발에 현재 작업이 포함되지 않기에 끊어주어야 한다.작거나 같다면 현재 작업이 이전 작업에 포함되기에 끊어주지 않아도 된다.코드 #include #include #include using namespace std;vector solution(vector progresses, vector speeds) { vector answer; queue q; for (int i = 0; i 3. 후기   관심 있는 부분이 days가 가장 큰 q.front() 값임이 파악되면 ..
1. 문제 설명문제 바로가기2. 풀이 과정문제 해결의 흐름 처음에 문제 자체를 이해하는데 어려움이 있었다-! 자세히 살펴보니 입력된 주식가격(prices)이 언제까지 떨어지지 않는지 구해주면 되는 것이었다.이때, 주식 가격이 입력되는 간격은 1초이다. 입력된 가격 배열 prices를 순회하며 이전에 살펴봤던 값이랑 비교하였을 때 현재 값이 이전 값보다 더 작다면 이전 값의 가격이 하락한 것이기에 가격 하락 전까지의 기간을 배열에 저장해주자!4.에 해당하지 않는 값들은 Stack에 계속 쌓아준다.4.~5.의 과정이 끝난 이후 Stack에 있는 값들을 pop하며 배열에 저장한다.코드 #include #include #include using namespace std;vector solution(vector ..
1. 문제 설명문제 링크 : https://www.acmicpc.net/problem/31791부산대학교 2024 pnup div1 / div2 기출문제 2. 풀이 과정문제 해결의 흐름입력 받을 때 바이러스 위치들을 전부 queue에 저장하자bfs 구현 q_virus와 q_building, 둘 중 하나가 빌 때까지 bfs 탐색이 이루어진다.Tg의 시간동안 virus가 감염시키는 것이 building이 완전히 감염되는 것보다 우선시되어야 한다. virus의 상하좌우에 building이 위치해 있다면 해당 building은 감염되었기에 q_building에 push해주자virus의 상하좌우에 안전지역이 위치해 있다면 해당 안전지역은 감염되어 virus가 되었기에 q_viurs에 push해주자q_buildin..
태윤이
'C++' 태그의 글 목록