목록Baekjoon (177)
GitHubSeob

문제 https://www.acmicpc.net/problem/1261 1261번: 알고스팟 첫째 줄에 미로의 크기를 나타내는 가로 크기 M, 세로 크기 N (1 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 미로의 상태를 나타내는 숫자 0과 1이 주어진다. 0은 빈 방을 의미하고, 1은 벽을 의미 www.acmicpc.net 문제풀이 입력을 받는 matrix벡터와 벽을 몇 번 부쉈는지 나타내는 visit벡터를 선언한다. BFS로 문제를 풀었으며 queue에는 { y, x, 벽 부순 횟수 } 순으로 입력을 push 했다. 네 방향을 탐색하면서 다음 칸의 visit벡터를 보면서 값이 -1 (방문을 하지 않음)이거나 벽이 있고 cnt+1보다 크면 큐에 push 하고, 벽이 없고 cnt보다 크면 방..

문제 https://www.acmicpc.net/problem/1644 1644번: 소수의 연속합 첫째 줄에 자연수 N이 주어진다. (1 ≤ N ≤ 4,000,000) www.acmicpc.net 문제풀이 에라토스테네스의 체를 이용하여 N까지의 소수를 미리 구해둔다. 그 다음 두포인터 부분을 구현하면 된다. 이중 for문, while문으로 구현해봤는데 시간차이가 안났다.. 1806번 문제 코드와 거의 비슷하게 구현했는데 이중for문 -> while문으로 바꿨는데 시간초과 나던코드가 통과한것으로 봐선 시간복잡도가 더 적은게 확실한데 왜 여기서는 차이가 없는지 모르겠다. 코드 #include #include using namespace std; int main() { ios::sync_with_stdio(f..

문제 https://www.acmicpc.net/problem/1806 1806번: 부분합 첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다. www.acmicpc.net 문제풀이 이런 식으로 sum값이 목푯값보다 작다면 sum+=arr[idx2]을 하고 idx2를 한 칸 오른쪽으로, sum값이 목푯값 이상이라면 answer값에 answer값과 idx2-idx2+1의 값 중 더 작은 값을 저장한다. 그다음, sum-=arr[idx]을 하고 idx를 한 칸 오른쪽으로 옮긴다. 처음에 배열을 N크기가 아닌 N+1만큼 사이즈로 생성하는 이유는 idx2..

문제 https://www.acmicpc.net/problem/2003 2003번: 수들의 합 2 첫째 줄에 N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다. www.acmicpc.net 문제풀이 메모이제이션을 이용했다. idx는 0부터 N-1까지, idx2는 idx부터 N-1까지로 둔다. idx는 더하려는 첫 번째 원소, idx2는 더하려는 마지막 원소이다. 따라서 idx부터 idx2까지 더한 값을 구하고, M인지 판별을 한다. 각각의 값은 자연수이므로 sum이 M을 넘어가면 더할 때마다 무조건 커지므로 효율성을 위해 break를 한..

문제 https://www.acmicpc.net/problem/1182 1182번: 부분수열의 합 첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다. www.acmicpc.net 문제풀이 다음칸을 선택, 선택하지 않는 경우인 두 경우를 나누어 DFS함수를 실행시킨다. 선택한다면 visit함수에 push_back으로 해당 idx번째 값을 넣어준다. idx가 N-1이 되었다면 visit벡터의 값들의 합을 구해 S와 같은지를 비교한다. 모두 선택하지 않는 경우는 개수에 포함이 안되므로 visit의 size가 0이 아닐 때라는 조건을 걸어..

문제 https://www.acmicpc.net/problem/6603 6603번: 로또 입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있다. 첫 번째 수는 k (6 < k < 13)이고, 다음 k개 수는 집합 S에 포함되는 수이다. S의 원소는 오름차순으로 www.acmicpc.net 문제풀이 다음칸을 선택, 선택하지 않는 경우인 두 경우를 나누어 DFS함수를 실행시킨다. DFS함수의 인자는 현재 위치가 로또의 몇 번째 숫자인지를 idx, 몇 개를 선택했는지가 cnt이다. 6개만 고르면 되므로 cnt가 6일 때 answer에 담은 숫자들을 출력한다. idx+1이 num보다 작을 때만 DFS함수를 실행하도록 하면 된다. 코드 #include #include usi..

문제 https://www.acmicpc.net/problem/14726 14726번: 신용카드 판별 신용카드는 총 16자리의 숫자로 구성되어 있다. 언뜻 보기에는 무작위로 된 숫자로 구성되어 있는 것 같이 보이지만 그 속에는 하나의 수학적 비밀이 숨겨져 있다. 그중 하나가 카드 번호가 유효 www.acmicpc.net 문제풀이 맨 오른쪽부터 짝수번째는 *2를 해준 뒤 10 이상이면 answer에 10을 나눈 몫, 나눈 나머지를 더해준다. 홀수번째일 때는 그냥 answer에 더 해주면 된다. 모든 자리를 확인하였으면 10으로 나눈 나머지가 있는지 없는지만 판별하여 출력하면 된다. 코드 #include using namespace std; int main() { int T(0); int idx(0); ci..

문제 https://www.acmicpc.net/problem/13419 13419번: 탕수육 출력은 표준 출력을 사용한다. 입력받은 데이터에 대해, 각 테스트 케이스의 답을 순서대로 출력한다. 각 테스트 케이스마다 첫 번째 줄에 먼저 시작한 사람이 기억해야 될 문자열 중 가장 짧은 www.acmicpc.net 문제풀이 입력받은 문자열의 길이가 짝수이면 첫 번째 사람은 짝수번째 알파벳만, 두 번째 사람은 홀수번째 알파벳만 외우면 된다. 문자열의 길이가 홀수 일 경우 추가로 상대방의 문자열을 더하면 된다. 코드 #include using namespace std; int main() { cin.tie(NULL); ios::sync_with_stdio(false); int T(0); string data("..

문제 https://www.acmicpc.net/problem/1987 1987번: 알파벳 세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 한 칸으 www.acmicpc.net 문제풀이 BFS로 풀었다가 메모리 초과가 났고, DFS로 풀었다가 시간 초과가 났다. 질문글을 보니 DFS에 벡터를 넣어 벡터를 복사하게 되면 시간이 더 걸리므로 전역으로 선언하는 것이 좋다고 했다. 그 부분을 수정했더니 통과가 됐다. 크게 어려운 부분은 없다. 0, 0부터 시작하여 DFS로 모든 경우를 탐방하는데 이미 지나갔던 알파벳이 있는 곳은 가지 못하도록 조건만 걸면 된다. v..