본문 바로가기

백준

(221)
C++ [백준]15657번 N과 M(8) https://www.acmicpc.net/problem/15657 15657번: N과 M (8) N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다. N개의 자연수 중에서 M개를 고른 수열 www.acmicpc.net 솔루션 이 문제는 N과 M의 또 다른 변형으로 백트래킹에 이해를 돕기에 아주 좋은 문제인 것 같다. 나는 값을 입력을 받아서, 정렬을 하고 각각의 인덱스와 깊이를 인자로 넘겨주어서, 인덱스를 몇 번 골랐는지 체크 하고, 깊이가 만족이 된다면 출력을 하도록 코드를 짰다. 코드 #include #include #include using namespace std; vector arr; int ..
C++ [백준]1504번 특정한 최단 경로 https://www.acmicpc.net/problem/1504 1504번: 특정한 최단 경로 첫째 줄에 정점의 개수 N과 간선의 개수 E가 주어진다. (2 ≤ N ≤ 800, 0 ≤ E ≤ 200,000) 둘째 줄부터 E개의 줄에 걸쳐서 세 개의 정수 a, b, c가 주어지는데, a번 정점에서 b번 정점까지 양방향 길이 존 www.acmicpc.net 솔루션 시작 노드(1), 거쳐가는 노드(a), 거쳐가는 노드(b) 를 각각 우선순위 큐를 이용하여, 다익스트라 알고리즘을 이용했다. 그리고 각 경우를 다 if문으로 해결하였다. 1) 1->v1->1->v2->1->N 2) 1->v2->1->v1->1->N (1과 2는 식이 같다) 3) 1->v1->1->v2 ->N 4) 1->v2->1->v1->N 5)..
C++ [백준]1806번 부분합 https://www.acmicpc.net/problem/1806 1806번: 부분합 첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다. www.acmicpc.net 솔루션 처음에 이 문제를 보고 dp인가? 싶었으나 도저히 아닌 것 같아서 알고리즘 보기를 하니, 투 포이터였다.. 투 포인터를 보고 나니, 바로 방법이 생각이 났다. i) 시작점과, 끝점의 idx를 만들고, idx 사이의 값들을 더해 놓는다. ii) 값이 작다면, 끝 idx를 증가시키고, 값을 더한다. iii) 값이 크다면, 더 작아져도 되므로 시작점 idx를 증가 시키고 값을 빼 ..
C++ [백준]1197번 최소 스패닝 트리 https://www.acmicpc.net/problem/1197 솔루션 먼저 우선순위 큐에, 각 가중치들을 -를 붙여서 넣어주고 뽑아서 각 노드들과 연결이 되어있으면 연산을 하지않고, 노드들과 연결이 되어있지 않다면, 연결을 시켜주고, sum에 값을 더해 주었다. 각 노드들이 union이 되어있는지 아닌지는 유튜브에 "동빈나 - 실전 알고리즘 18강 합집합 찾기"를 참고하였으며, 알고리즘은 크루스칼 알고리즘을 참고하였다. https://ko.wikipedia.org/wiki/%ED%81%AC%EB%9F%AC%EC%8A%A4%EC%BB%AC_%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98 크러스컬 알고리즘 - 위키백과, 우리 모두의 백과사전 컴퓨터 과학에서, 크러스컬 알고리즘(영어: K..
C++ [백준]14503번 로봇 청소기 https://www.acmicpc.net/problem/14503 14503번: 로봇 청소기 로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어 www.acmicpc.net 솔루션 처음 청소기의 좌표를 입력 받고, 그 지점부터 반복문을 통해 청소를 시작한다. 문제에 쓰여있는 조건에 따라 무조건 왼쪽으로 돌면서, 각각 청소를 할 수 있다면 좌표를 증가 시키고, 청소가 안된다면, 계속 왼쪽으로 방향을 돌린다. 이 과정을 for문을 통해 4번 반복한 뒤에도 청소를 안 한다면, 후진을 한다. (나는 i==3이라는 조건을 통해서 후진을 구현했다.) 내가 청소를 한 부분은 2..