분류 전체보기 34

[BOJ][C++] 백준 1303번: 전쟁 - 전투

문제https://www.acmicpc.net/problem/1303 문제 이해N × M 전쟁터에서 우리 병사(W)의 위력의 합과 적국의 병사(B)의 위력의 합을 구한다.N명이 뭉쳐있을 때 N²의 위력을 낼 수 있다. 문제 풀이💡 DFS & BFS첫 번째 칸부터 dr, dc 배열을 이용해서 같은 문자('W' / 'B')가 있는 곳을 상하좌우로 탐색한다.이미 방문한 곳은 탐색하지 않는다.탐색하는 곳은 방문 표기하고, 해당 병사 수 카운트를 증가시킨다.탐색을 종료한 후 뭉쳐있는 병사의 위력을 저장한다.병사의 위력을 합한 값을 각각 출력한다. 코드1️⃣ DFS#include #include #include using namespace std;int n, m, cnt;char color;vector> boar..

[BOJ][C++] 백준 1890번: 점프

문제https://www.acmicpc.net/problem/1890 문제 이해수가 적혀 있는 N×N 게임판에서 가장 왼쪽 위 칸에서 가장 오른쪽 아래 칸으로 규칙에 따라 점프한다.규칙에 맞게 이동할 수 있는 경로의 개수를 구한다. 규칙각 칸에 적혀있는 수는 현재 칸에서 갈 수 있는 거리를 의미한다.0은 종착점을 의미한다.현재 칸에 적혀있는 수만큼 오른쪽이나 아래로만 이동 가능하다.한 번 점프할 때 방향을 바꿀 수 없다. 오른쪽으로 또는 아래로 점프를 하는 두 경우만 존재한다. 문제 풀이 🔍 접근 각 칸마다 현재 칸까지의 경로의 개수를 저장한다. 💡 Dynamic Programming칸에 적힌 수만큼 이동해서 해당 칸까지의 경로의 개수를 저장한다.첫 번째 칸(경로의 개수 1)부터 시작한다.오른쪽으로 ..

[BOJ][C++] 백준 2579번: 계단오르기

문제https://www.acmicpc.net/problem/2579 문제 이해점수가 쓰여 있는 계단을 밟는 게임에서 얻을 수 있는 총 점수의 최댓값을 구한다. 계단 오르는 규칙한 번에 한 계단 또는 두 계단씩 오를 수 있다.연속된 세 계단을 밟으면 안 된다.마지막 도착 계단은 반드시 밟아야 한다.시작점은 계단에 포함되지 않는다. 문제 풀이 🔍 접근 각 계단마다 현재 계단까지의 점수 최댓값을 구해서 저장한다. 💡 Dynamic Programming각 계단은 1칸 또는 2칸 전 계단에서 온 것이므로 max(1칸 전 최댓값, 2칸 전 최댓값) + 현재 계단 점수로 식을 세울 수 있다.하지만 연속 세 칸을 밟으면 안 되는 조건을 만족하지 못한다.이 조건을 고려해서 경우의 수를 생각해보면 아래와 같이 나타낼..

[BOJ][C++] 백준 1260번: DFS와 BFS

문제https://www.acmicpc.net/problem/1260 문제 이해그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과 출력 문제 풀이주어진 간선과 두 정점의 번호를 이용해 인접 행렬을 저장한다. 💡 DFS현재 정점과 연결된 정점을 순서대로 재귀 탐색한다.시작 V → V와 연결된 정점 A → A와 연결된 정점 B → B와 연결된 정점 C ..인접 행렬 adj[cur][1 ~ n] 순회. 연결되어 있으면 dfs(next)dfs 탐색하면서 방문 표시 & 출력 배열에 삽입하기이미 방문한 곳이면 return💡 BFS현재 정점과 연결된 정점을 모두 큐에 삽입하고 큐에서 정점을 꺼내면서 탐색한다.시작 V → V와 연결된 정점 A → V와 연결된 정점 B → …A와 연결된 정점 A’ → A’와 연결된..

[BOJ][C++] 백준 2667번: 단지번호붙이기

문제https://www.acmicpc.net/problem/2667 문제 이해N × N 크기의 정사각형 지도에서 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다.집이 있는 곳(1)끼리 상하좌우로 연결시켜 단지를 만든다.총 단지수와 단지내 집의 수를 오름차순으로 출력한다. 문제 풀이 🔍 접근 집이 존재하는 곳을 기준으로 그 집의 상하좌우에 또 다른 집이 존재하는지를 판단하는 그래프 탐색 문제로 볼 수 있다.지도를 순회하면서 '1'이 나왔을 때 모든 인접 정점을 방문하여 연결된 집의 개수를 구한다. 🔨 구현 BFS와 DFS를 이용하여 풀 수 있다.방문 표기는 visited 배열을 만드는 대신 지도에서 방문한 곳을 '0'으로 바꾸어 표기할 수 있다.집이 있는 곳에서 dr, dc 배열을 이용해서 상..

[BOJ][C++] 백준 3085번: 사탕 게임

문제https://www.acmicpc.net/problem/3085 문제 이해N×N 크기의 보드에 사탕을 4가지 색으로 채워져있다.인접한 두 칸을 골라 사탕을 서로 교환한다.행 또는 열에서 같은 색으로 이루어져 있는 가장 긴 연속 부분을 구한다. 문제 풀이 🔍 접근 모든 경우의 수를 탐색하는 시간복잡도를 계산해보면,사탕을 교환하는 데 N * N, 연속하는 최대 개수를 구하는 데 N * N 이므로 총 O(N^4)이다.N ≤ 50이므로 제한시간 내에 계산할 수 있다. 💡 브루트포스행/열에서 인접한 두 칸을 골라 서로 사탕을 교환한다.연속하는 행/열의 최대 개수를 찾는다.1회 교환할 때마다 최대 개수를 찾는다. 코드#include #include using namespace std;/*1. 행/열에서 인..

[BOJ][C++] 백준 1789번: 수들의 합

문제https://www.acmicpc.net/problem/1789 문제 이해서로 다른 N개의 자연수의 합이 S이다. S가 주어질 때 N의 최댓값을 구한다. 문제 풀이💡 아이디어N이 최대가 되려면, 자연수를 1부터 차례대로 더하는 방식을 생각할 수 있다. 1 + 2 + 3 + 4 + ... = S 이런식으로 더할 경우 N이 최대가 된다.1 + 2+ 3 + ... + n = n * (n + 1) / 2 인 점을 이용해서 예시를 살펴볼 수 있다.예: 2001 + 2 + 3 + ... + 18 + 19 = 190 에서 10을 더하면, 서로 다른 수라는 조건을 만족하지 못한다.1 + 2 + 3 + ... + 17 + 18 = 171 이므로, 29를 더하면 200이 된다.N의 최댓값은 19이다. 🔨 구현반복..

[BOJ][C++] 백준 15650번: N과 M (2)

문제https://www.acmicpc.net/problem/15650 문제 이해1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열을 출력한다.고른 수열은 오름차순이어야 한다. 문제 풀이💡 DFS를 이용한 백트래킹 이전에 올린 N과 M (1) 문제에서, 출력할 수열이 오름차순인 것만 추가되었다. [BOJ][C++] 백준 15649번: N과 M (1)문제https://www.acmicpc.net/problem/15649 문제 이해1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열을 모두 구한다. 문제 풀이💡DFS를 이용한 백트래킹    1부터 N까지 재귀함수를 이용해 탐색하y-e-99.tistory.comN과 M (1)과 풀이 방식이 비슷한데, for 반복문에서 i값을 이용하면 중복없이 오름..

[BOJ][C++] 백준 15649번: N과 M (1)

문제https://www.acmicpc.net/problem/15649 문제 이해1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열을 모두 구한다. 문제 풀이💡DFS를 이용한 백트래킹    1부터 N까지 재귀함수를 이용해 탐색하며 중복 없이 M개의 수를 선택하고 출력한다.종료 조건: M개의 수를 모두 선택했을 때탐색- 1부터 N까지 탐색을 반복한다.- 수를 중복해서 선택하지 않도록 방문 표기한다.- 탐색한 수를 출력할 배열에 삽입한다.- 탐색이 끝난 수를 배열에서 제거하고 방문하지 않은 수로 표기한다.탐색 종료- 선택한 M개의 수가 담긴 배열을 출력 후 탐색을 종료한다. 코드#include#includeusing namespace std;int N, M;vector v;vector visited;..

[SWEA][C++] 1289. 원재의 메모리 복구하기

문제https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV19AcoKI9sCFAZN SW Expert AcademySW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!swexpertacademy.com 문제 이해초기화 상태(모든 bit가 0)에서 원래 상태로 복구해야 한다.복구할 때는 bit 중 하나를 골라 0 또는 1을 결정하고, 해당 값이 메모리의 끝까지 덮어씌워진다.초기화 상태에서 원래 상태로 복구할 때 최소 수정 횟수를 구한다. 입출력 예시입력: 00110000에서 3번째 bit를 골라 1로 설정하면 0011이 되므로, 출력값은 1이다.입력: 100000 → 111 → 100로, 출력값은 ..