분류 전체보기 97

백준 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

백준 13549번 숨바꼭질 3

문제 보러가기 : https://www.acmicpc.net/problem/13549 13549번: 숨바꼭질 3 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 www.acmicpc.net 이번 문제는 너비 우선 탐색(BFS) 문제였습니다. 《문제 풀이》 1. 순간이동을 하는 경우에는 0초가 걸리므로 우선순위 큐를 이용하여 정렬 2. { 0, N } 을 큐에 삽입 (0은 경과 시간) 3. 순간이동을 하는 경우가 경과 시간이 가장 짧으므로 해당 if 문을 가장 위에 작성 4. 큐에 삽입할 때 해당 위치의 visited 배열 true ..

알고리즘/BOJ 2021.01.16

백준 12851번 숨바꼭질 2

문제 보러가기 : https://www.acmicpc.net/problem/12851 12851번: 숨바꼭질 2 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 www.acmicpc.net 이번 문제는 너비 우선 탐색(BFS) 문제였습니다. 《문제 풀이》 1. { N, 0 } 을 큐에 삽입 (0은 경과 시간) 2. 동생을 가장 빠른 시간으로 찾는 방법의 수를 구해야 하므로 pop 이후에 방문 체크 3. 수빈이가 갈 수 있는 세 가지 위치가 범위에 충족되면 큐에 삽입 4. 최초로 동생 위치에 도달한 경우, 경과 시간을 result..

알고리즘/BOJ 2021.01.16

백준 16953번 A → B

문제 보러가기 : https://www.acmicpc.net/problem/16953 16953번: A → B 첫째 줄에 A, B (1 ≤ A < B ≤ 109)가 주어진다. www.acmicpc.net 이번 문제는 너비 우선 탐색(BFS) 문제였습니다. 《문제 풀이》 1. A → B 로 바꾸는 과정에서 int 범위를 벗어날 수 있으므로 long long 자료형 사용 2. { A, 0 } 을 큐에 삽입 (0은 연산횟수) 3. 현재값에 2를 곱한 값과 가장 오른쪽에 1을 더한 값을 큐에 삽입 4. 현재값이 B와 같다면 연산횟수 + 1 반환 5. 현재값이 B보다 크다면, 더 연산해도 B가 나올 수 없으므로 continue 《C++ 코드》 #include #include using namespace std; ..

알고리즘/BOJ 2021.01.16
반응형