목록코딩테스트 (119)
Deff_Dev
문제 w * h 크기의 건물에 불이 났을 때, 상근이가 얼마나 빨리 탈출할 수 있는지 출력하는 문제이다. 입력'.': 빈 공간'#': 벽'@': 상근이의 시작 위치'*': 불풀이입력을 받을 때, 상근이의 시작위치, 불 위치는 각각의 큐에 저장하고, 탈출 지점 좌표를 벡터에 저장한다. 이후, 각각의 큐를 바탕으로 BFS를 진행하고, 각각의 map 정보를 저장한다. 탈출 지점 좌표를 탐색하여, 불 위치를 BFS한 맵, 상근이 위치를 BFS한 맵의 값을 비교하고 상근이 위치를 BFS한 맵의 탈출 지점 값이 더 작다면 최솟값을 비교한다. #include using namespace std;int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};int n, h, w;vecto..
문제M * N * H로 이루어진 박스에 토마토들이 담겨 있는데, 익은 토마토가 되기 위해서는 안 익은 토마토 근처에 익은 토마토가 있을 때, 하루가 지나면 익은 토마토가 된다. 박스에 모든 토마토가 익은 토마토가 될려면 며칠이 지나야하는지 출력하는 문제이다. 입력 조건은 -1(토마토가 없는 박스), 0(안익은 토마토), 1(익은 토마토)이다.풀이3차원 배열에 박스 정보를 입력받고, 익은 토마토 좌표를 큐에 저장한 뒤, BFS를 이용하여 날짜를 계산했다. 큐가 비었을 때 BFS가 끝나므로 출력할 땐, count - 1를 한다.#include using namespace std;int dx[6] = {0, 0, 1, -1,0,0 };int dz[6] = {1, -1, 0, 0,0,0};int dy[6] = ..
문제 n * n 크기의 R, G, B로이루어진 그림의 구역 수를 구하는 문제이다. 이때, 적록색약 유무에 따른 그림 영역의 갯수를 출력하면 된다. 적록 색약이 있는 사람은 R, G의 구분을 못한다.ex) 적록 색약 X ▶ R (1), G(1), B(1) = 3개, 적록 색약 O ▶ RG(1), B(1) = 2개풀이일반적인 그림이 담겨있는 2차원 벡터와 적록색약을 가진 사람이 보는 그림이 담긴 2차원 벡터 2개를 만들고, 이를 BFS를 이용하여 탐색했다. #include using namespace std;int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};int n ;void BFS(pair startPoint,vector> &arr,bool visited[1..
문제풀이간단한 BFS 문제로, BFS이용하여 그림 영역과 넓이를 구한 뒤, 출력했다.#include using namespace std;int n, m, pictureCount = 0 ,maxWidth = 0;int arr[500][500] = {0 ,};int dx[4] = {-1, 0, 1, 0};int dy[4] = {0, 1, 0, -1};bool visited[500][500] = {false, };void BFS(pair startPoint){ queue> q; q.push(startPoint); visited[startPoint.first][startPoint.second] = true; int count = 1; while (!q.empty()) { pair point = q.front(..
문제 이 문제는 아래의 규칙에 따라 ( , ) , [ , ] 로 이루어진 입력의 결과 값을 출력하는 문제이다. 규칙'()’ 인 괄호열의 값은 2이다.‘[]’ 인 괄호열의 값은 3이다.‘(X)’ 의 괄호값은 2×값(X) 으로 계산된다.‘[X]’ 의 괄호값은 3×값(X) 으로 계산된다.올바른 괄호열 X와 Y가 결합된 XY의 괄호값은 값(XY)= 값(X)+값(Y) 로 계산된다.이때, 올바르지 않은 괄호열일 경우 반드시 0을 출력한다.풀이이 문제를 실제 수식 연산처럼 풀이하기엔 괄호가 겹쳐있거나 했을 때, 변수가 많아 어려웠다.ex) "(()[[]])([])" ▶ 2 * (2 + 3 * 3) + 2 * 3 = 28 그래서 실제 연산이 아닌 분배 법칙을 이용하여 이 문제를 풀이했다. 위 식을 분배 법칙으로 바꿔본..
문제풀이이 문제는 쇠막대기를 레이저로 자를 떄, 몇 개의 막대기가 나오는지 출력하는 문제이다. 입력은 ' ( ' , ' ) ' 두 가지이다.' ( ' 뒤에 바로 ' ) '가 온다면 해당 자리에 레이저를 쏜다는 것이고, 이외의 입력은 막대기를 의미한다. ex) "(())" 입력은 ㅡ ㅡ 처럼 막대기 2개가 나온다.예제의 입력을 본다면 위 그림과 같이 17개의 막대기가 나온다. 해결 방법스택을 이용하여 풀이했고 입력을 받은 뒤, 입력된 문자열을 탐색하면서 레이저를 감별하고 막대기를 자른다.' ( ' 이라면 bar 갯수를 + 1 한 뒤, 스택에 푸시한다. (flag 변수 true)' ) '이라면 막대기 끝 or 레이저이기 때문에 bar 갯수를 - 1 한다.flag 변수가 true일 때는 레이저이기 때문에..
문제풀이getline 함수를 이용하여, 공백을 포함하여 입력을 받은 뒤, Stack을 이용하여 균형잡인 문자열인지 판단했다. 이때, stack에 임의 값 '0'를 삽입(empty 처리를 피하기 위해)하고 모든 연산이 끝난 뒤, stack의 크기가 1일 경우에 yes, 아니라면 no를 출력한다.#include using namespace std;int main() { ios_base::sync_with_stdio(0); cin.tie(0); while(true) { string input; getline(cin, input); if(input == ".") break; stack stack; stack.push('0'); for(int i = 0; i
문제문제 설명 지민이는 N개의 원소를 포함하고 있는 양방향 순환 큐를 가지고 있다. 지민이는 이 큐에서 몇 개의 원소를 뽑아내려고 한다.지민이는 이 큐에서 다음과 같은 3가지 연산을 수행할 수 있다.첫 번째 원소를 뽑아낸다. 이 연산을 수행하면, 원래 큐의 원소가 a1, ..., ak이었던 것이 a2, ..., ak와 같이 된다.왼쪽으로 한 칸 이동시킨다. 이 연산을 수행하면, a1, ..., ak가 a2, ..., ak, a1이 된다.오른쪽으로 한 칸 이동시킨다. 이 연산을 수행하면, a1, ..., ak가 ak, a1, ..., ak-1이 된다.큐에 처음에 포함되어 있던 수 N이 주어진다. 그리고 지민이가 뽑아내려고 하는 원소의 위치가 주어진다. (이 위치는 가장 처음 큐에서의 위치이다.) 이때, 그..