문제의 핵심은 A 문자열에서 한 문자를 선택하여 문자열의 가장 앞으로 가져오는 방식으로 B 문자열을 만드는 것입니다. 그러기 위해 최소한으로 문자열을 바꿔야 하는 횟수를 찾아야 합니다. 만약 A 문자열을 B 문자열로 변경할 수 없는 경우 -1을 출력해야 합니다.
#전체 코드
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
string A, B;
cin >> A >> B;
int ans = 0;
int B_index = B.length() - 1;
for (int i = A.length()-1; i >= 0; i--) {
if (A[i] == B[B_index]) {
B_index --;
}
else ans++;
}
sort(A.begin(), A.end());
sort(B.begin(), B.end());
if (A == B) cout << ans;
else cout << -1;
return 0;
}
이 문제는 주어진 토마토의 상태에 따라 모든 토마토가 익게 되는 최소 일수를 찾는 문제입니다. 문제에서 요구하는 답을 찾기 위해 BFS(Breadth-First Search) 탐색 알고리즘을 사용합니다.
#전체 코드
#include <iostream>
#include <queue>
using namespace std;
int a[1000][1000];
int d[1000][1000];
int dx[] = { 0,0,1,-1 };
int dy[] = { 1,-1,0,0 };
struct tomato {
int x, y;
};
int main() {
int n, m;
cin >> m >> n;
queue<tomato> q;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> a[i][j];
d[i][j] = -1;
if (a[i][j] == 1) {
q.push({i,j});
d[i][j] = 0;
}
}
}
while (!q.empty()) {
int x = q.front().x;
int y = q.front().y;
q.pop();
for (int k = 0; k < 4; k++) {
int nx = x + dx[k];
int ny = y + dy[k];
if (0 <= nx && nx < n && 0 <= ny && ny < m) {
if (a[nx][ny] == 0 && d[nx][ny] == -1) {
d[nx][ny] = d[x][y] + 1;
q.push({nx,ny});
}
}
}
}
int ans = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (ans < d[i][j]) {
ans = d[i][j];
}
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (a[i][j] == 0 && d[i][j] == -1) {
ans = -1;
}
}
}
cout << ans << endl;
return 0;
}
#코드설명
코드 설명
변수 선언
a[1000][1000]: 각 토마토의 초기 상태를 저장하는 2D 배열
d[1000][1000]: 각 토마토가 익게 되는 데 걸리는 일수를 저장하는 2D 배열. 초기값은 -1로 설정
dx[], dy[]: 토마토의 인접한 위치를 찾기 위해 현재 위치에 더할 값들을 저장하는 배열
tomato: 토마토의 위치를 나타내는 구조체
입력 받기
m, n: 상자의 가로와 세로 크기
상자의 토마토 상태를 입력 받으면서, 이미 익어 있는 토마토의 위치를 큐에 넣고, 해당 위치의 d[][] 값을 0으로 설정합니다.
BFS 탐색
BFS 탐색을 시작합니다. 큐가 비어있지 않은 동안, 현재 토마토의 위치에서 인접한 네 방향을 확인하며 다음을 수행합니다:
인접한 위치가 상자 내부에 있는지 확인합니다.
인접한 위치의 토마토가 아직 익지 않았고, 방문하지 않은 상태라면, 현재 토마토가 익는 데 걸린 일수에 1을 더한 값을 인접한 위치의 토마토가 익는 데 걸리는 일수로 설정합니다.
인접한 위치의 토마토를 큐에 넣습니다.
결과 찾기
BFS 탐색이 끝나면, d[][] 배열에서 가장 큰 값을 찾아 ans에 저장합니다. 이 값이 모든 토마토가 익게 되는 데 필요한 최소 일수입니다.
하지만, 상자 안에 아직 익지 않은 토마토가 있는지 확인하고, 있다면 -1을 출력해야 합니다. 이를 위해 a[][] 배열을 탐색하며 아직 익지 않은 토마토가 있는지 확인합니다. 익지 않은 토마토가 있으면 ans 값을 -1로 설정합니다.
결과 출력
ans 값을 출력합니다.
이 코드는 BFS 탐색을 사용하여 모든 토마토가 익게 되는 최소 일수를 효율적으로 찾습니다.
체스판 위에서 나이트가 이동하는 최소 횟수를 계산하는 문제를 해결하기 위한 코드입니다. 코드는 입력으로 주어지는 테스트 케이스를 처리하고, 각 테스트 케이스에 대해 나이트가 최소 몇 번 움직여야 하는지를 출력합니다. 코드는 너비 우선 탐색(BFS)을 사용하여 문제를 해결합니다
#전체 코드
#include <iostream>
#include <queue>
using namespace std;
int dx[] = { 2, 1, -1, -2, -2 ,-1,1,2, };
int dy[] = { 1,2,2,1,-1,-2,-2,-1 };
struct point {
int x, y;
};
int main() {
int N; cin >> N;
while (N--) {
int I;
cin >> I;
point now, target;
cin >> now.x >> now.y >> target.x >> target.y;
if (now.x == target.x && now.y == target.y) {
cout << '0' << endl;
continue;
}
int chessBoard[300][300] = { 0, };
queue<point> q;
q.push(now);
chessBoard[q.front().x][q.front().y] = 0;
while (!q.empty()) {
int x = q.front().x;
int y = q.front().y;
q.pop();
for (int i = 0; i < 8; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (0 <= nx && nx < I && 0 <= ny && ny < I) {
if (chessBoard[nx][ny] == 0) {
q.push({ nx,ny });
chessBoard[nx][ny] = chessBoard[x][y] + 1;
}
}
}
}
cout << chessBoard[target.x][target.y]<< endl;
}
return 0;
}
#문제 해결 방법
해당 문제는 나이트의 이동을 최소한의 움직임으로 목표 위치까지 가는 최단 거리를 찾는 문제입니다. 이를 위해 BFS(Breadth-First Search)를 사용합니다.
문제 해설:
나이트의 이동 나이트는 8가지 방향으로 움직일 수 있습니다. 문제에서 제시한 그림을 참고하면, 나이트의 모든 움직임을 (dx, dy)의 형태로 나타낼 수 있습니다.
BFS BFS는 시작 지점부터 가장 가까운 지점들부터 차례대로 탐색하는 알고리즘입니다. 체스판에서의 나이트 이동도 이 알고리즘으로 효율적으로 해결할 수 있습니다. BFS를 사용하면, 각 칸에 도달하는 데 필요한 최소한의 움직임 횟수를 찾을 수 있습니다.
코드 설명:
변수
dx, dy: 나이트의 이동 방향을 저장한 배열입니다.
point: x, y 좌표를 갖는 구조체입니다.
chessBoard: 각 위치에 도달하기 위한 최소 움직임 횟수를 저장하는 체스판입니다.
프로세스
테스트 케이스의 수를 입력 받습니다.
각 테스트 케이스마다
체스판의 크기, 시작 위치, 목표 위치를 입력 받습니다.
시작 위치와 목표 위치가 같다면, 움직일 필요가 없으므로 0을 출력하고 다음 테스트 케이스로 넘어갑니다.
그렇지 않다면, BFS로 최단 거리를 찾습니다.
BFS를 진행하며, 체스판에 각 칸까지 도달하기 위한 최소 움직임 횟수를 저장합니다.
목표 위치까지의 최소 움직임 횟수를 출력합니다.
BFS를 사용하여 문제를 해결하면, 체스판의 각 칸까지 도달하는 데 필요한 최소 움직임 횟수를 효율적으로 찾을 수 있습니다.
#include<vector>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int arr[10001] = { 0, };
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
int input;
cin >> input;
arr[input]++;
}
for (int i = 1; i <= 10000; i++) {
if (arr[i] != 0) {
for (int j = 1; j <= arr[i]; j++) {
cout << i << "\n";
}
}
}
}
정렬문제 아마도 내장함수를 사용하지 않는다면 n logN의 시간복잡도를 갖는 정렬로 풀어야한다.
문제 해결 방법
sort 내장함수 사용 ><
전체 코드
#include<vector>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
vector<int> vec;
int n;
cin >> n;
for (int i = 0; i < n; i++) {
int input;
cin >> input;
vec.push_back(input);
}
sort(vec.begin(), vec.end());
for (int a : vec) {
cout << a << "\n";
}
}