알고리즘 78

백준 12865번 평범한 배낭

문제 보러가기 : https://www.acmicpc.net/problem/12865 12865번: 평범한 배낭 첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의 가치 V(0 ≤ V ≤ 1,000) www.acmicpc.net 이번 문제는 다이나믹 프로그래밍(DP) 문제였습니다. 《문제 풀이》 1. 물건의 무게와 가치를 쌍으로 묶어서 벡터에 삽입 2. 물건들의 가치합을 담을 배열 dp 초기화 (1) dp 배열의 행은 물건을 나타내고 (첫번째 물건, 두번째 물건, ...) 열은 물건의 무게를 나타냄 (0 ~ K) (2) 첫번째 물건의 무게..

알고리즘/BOJ 2021.01.30

백준 17070번 파이프 옮기기 1

문제 보러가기 : https://www.acmicpc.net/problem/17070 17070번: 파이프 옮기기 1 유현이가 새 집으로 이사했다. 새 집의 크기는 N×N의 격자판으로 나타낼 수 있고, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 (r, c)로 나타낼 수 있다. 여기서 r은 행의 번호, c는 열의 www.acmicpc.net 이번 문제는 그래프 탐색 문제였습니다. DFS / BFS 둘 다 문제 풀이 하겠습니다. 파이프의 한쪽 끝을 (n, n) 으로 이동시키는 방법의 개수를 출력해야하기 때문에 방문 여부를 확인해줄 필요는 없습니다. BFS 설명 《문제 풀이》 1. 집의 상태를 배열로 입력 받고 파이프 옮기기 2. 파이프가 가로 / 세로 / 대각선 방향 중 어느 방향의 파이프인지..

알고리즘/BOJ 2021.01.27

백준 4179번 불!

문제 보러가기 : https://www.acmicpc.net/problem/4179 4179번: 불! 입력의 첫째 줄에는 공백으로 구분된 두 정수 R과 C가 주어진다. 단, 1 ≤ R, C ≤ 1000 이다. R은 미로 행의 개수, C는 열의 개수이다. 다음 입력으로 R줄동안 각각의 미로 행이 주어진다. 각각의 문 www.acmicpc.net 이번 문제는 너비 우선 탐색(BFS) 문제였습니다. 시작점이 두 종류이므로 불을 위한 bfs, 지훈이를 위한 bfs를 각각 돌려야합니다. [필요한 것] 1. 불의 전파 시간을 기록할 배열 dist1 (-1로 초기화) 2. 지훈이의 탈출 시간을 기록할 배열 dist2 (-1로 초기화) 3. 불의 bfs를 위한 큐 q1 4. 지훈이의 bfs를 위한 큐 q2 《문제 풀이..

알고리즘/BOJ 2021.01.26

백준 7576번 토마토

문제 보러가기 : https://www.acmicpc.net/problem/7576 7576번: 토마토 첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토 www.acmicpc.net 이번 문제는 너비 우선 탐색(BFS) 문제였습니다. 《문제 풀이》 1. 익은 토마토라면 해당 좌표를 큐에 삽입 2. 익지 않은 토마토라면 해당 좌표의 dist 배열에 -1 삽입 3. 토마토 익히기 (1) 익은 토마토의 상하좌우를 검사하면서 토마토가 아직 익지 않았다면 (1) 현재 배열값 + 1 을 저장 (2) 해당 좌표를 큐에 삽입 (2) 범위 밖이라면 conti..

알고리즘/BOJ 2021.01.26

백준 2638번 치즈

문제 보러가기 : https://www.acmicpc.net/problem/2638 2638번: 치즈 첫째 줄에는 모눈종이의 크기를 나타내는 두 개의 정수 N, M (5≤N, M≤100)이 주어진다. 그 다음 N개의 줄에는 모눈종이 위의 격자에 치즈가 있는 부분은 1로 표시되고, 치즈가 없는 부분은 0으로 표 www.acmicpc.net 이번 문제는 너비 우선 탐색(BFS) 문제였습니다. 《문제 풀이》 1. 모눈종이의 가장자리는 항상 외부 공기이므로 (0, 0)부터 큐에 삽입 2. 외부 공기 칸의 상하좌우를 검사 (1) 외부 공기이고 아직 방문하지 않았다면 --> 해당 좌표를 큐에 삽입 / visited[nx][ny] = 1 (여기서 visited 배열은 boolean 타입이 아님) (2) 치즈이면 --..

알고리즘/BOJ 2021.01.26

백준 14502번 연구소

문제 보러가기 : https://www.acmicpc.net/problem/14502 14502번: 연구소 인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다. 연구소는 크 www.acmicpc.net 이번 문제는 그래프(DFS, BFS) 문제였습니다. 《문제 풀이》 1. 빈칸인 경우에 연구소를 복사하고 해당 위치에 벽을 세움 2. DFS를 통해 배열 전체를 돌면서 3개의 벽을 세웠다면 BFS 수행 (1) 바이러스가 감염된 연구소를 만들기 위한 배열 secureArea (2) 해당 위치에 바이러스가 있다면 해당 위치를 큐에 삽입 (3) 바이러스가 있는 위치와 인접한 곳이 빈칸이라면 바이러스..

알고리즘/BOJ 2021.01.24

백준 15666번 N과 M (12)

문제 보러가기 : https://www.acmicpc.net/problem/15666 15666번: N과 M (12) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해 www.acmicpc.net 이번 문제는 백트래킹(BackTracking) 문제였습니다. 《문제 풀이》 1. 중복되는 수열을 여러 번 출력하면 안 되므로 set 컨테이너 사용 2. s 에 입력한 숫자가 없을 경우에만 벡터 v 에 해당 숫자 삽입 3. 비내림차순을 위해 (1) 벡터 요소 정렬 (2) 인덱스를 저장할 배열에 자신의 인덱스부터 삽입 4. 현재 인덱스가 M과 같으면 v[arr[i]] 출력 《C+..

알고리즘/BOJ 2021.01.21

백준 11725번 트리의 부모 찾기

문제 보러가기 : https://www.acmicpc.net/problem/11725 11725번: 트리의 부모 찾기 루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오. www.acmicpc.net 이번 문제는 깊이 우선 탐색(DFS) 문제였습니다. 《문제 풀이》 1. 입력 받은 두 정점은 연결되어 있기 때문에 양방향으로 삽입 2. 1번 정점부터 dfs 수행 3. dfs 수행할 때마다 해당 정점의 방문 여부를 true 로 설정 4. 연결된 정점을 방문하지 않았다면 해당 노드 삽입 (이것이 부모 노드 번호) 5. 배열 arr 에 저장된 숫자들 출력 《C++ 코드》 #include #include #define MAX 100001 using..

알고리즘/BOJ 2021.01.19

백준 9663번 N-Queen

문제 보러가기 : https://www.acmicpc.net/problem/9663 9663번: N-Queen N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오. www.acmicpc.net 이번 문제는 전형적인 백트래킹(BackTracking) 문제였습니다. 2차원 배열을 직접 선언하지 않고 1차원 배열을 선언하여 배열의 인덱스는 행을 나타내고 배열에 저장된 값은 열을 나타내도록 해주었습니다. 《문제 풀이》 1. 퀸을 놓을 위치를 찾기 위해 dfs 수행 --> queen(0) 부터 시작 2. 퀸을 놓을 위치가 유망한 위치인지 검사하기 위한 함수 possible (1) chess[1..

알고리즘/BOJ 2021.01.18

백준 10830번 행렬 제곱

문제 보러가기 : https://www.acmicpc.net/problem/10830 10830번: 행렬 제곱 크기가 N*N인 행렬 A가 주어진다. 이때, A의 B제곱을 구하는 프로그램을 작성하시오. 수가 매우 커질 수 있으니, A^B의 각 원소를 1,000으로 나눈 나머지를 출력한다. www.acmicpc.net 이번 문제는 분할 정복 문제였습니다. 《문제 풀이》 1. B의 최댓값이 1000억이므로 long long 자료형으로 선언 2. 2차원 벡터의 공간을 N*N 크기로 할당해줌 --> A(N, vector(N)) 3. 행렬의 곱을 연산하는 부분은 연산자 오버로딩을 통해 구현 --> matrix operator * (const matrix &a, const matrix &b) 4. A의 B제곱 연산횟..

알고리즘/BOJ 2021.01.18
반응형