아래 모든 문제들은 프로그래머스에서 제공 되는 문제를 이용하였습니다, 감사합니다.
땅따먹기 게임을 하려고 합니다. 땅따먹기 게임의 땅(land)은 총 N행 4열로 이루어져 있고, 모든 칸에는 점수가 쓰여 있습니다. 1행부터 땅을 밟으며 한 행씩 내려올 때, 각 행의 4칸 중 한 칸만 밟으면서 내려와야 합니다. 단, 땅따먹기 게임에는 한 행씩 내려올 때, 같은 열을 연속해서 밟을 수 없는 특수 규칙이 있습니다.
예를 들면,
| 1 | 2 | 3 | 5 |
| 5 | 6 | 7 | 8 |
| 4 | 3 | 2 | 1 |
로 땅이 주어졌다면, 1행에서 네번째 칸 (5)를 밟았으면, 2행의 네번째 칸 (8)은 밟을 수 없습니다.
마지막 행까지 모두 내려왔을 때, 얻을 수 있는 점수의 최대값을 return하는 solution 함수를 완성해 주세요. 위 예의 경우, 1행의 네번째 칸 (5), 2행의 세번째 칸 (7), 3행의 첫번째 칸 (4) 땅을 밟아 16점이 최고점이 되므로 16을 return 하면 됩니다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int solution(vector<vector<int> > land)
{
int answer = 0;
// [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
int s_len = land.size();
int i = 0;
while(i < s_len - 1)
{
land[1+i][0] += max(max(land[i][1], land[i][2]), land[i][3]);
land[1+i][1] += max(max(land[i][0], land[i][2]), land[i][3]);
land[1+i][2] += max(max(land[i][0], land[i][1]), land[i][3]);
land[1+i][3] += max(max(land[i][0], land[i][1]), land[i][2]);
i++;
}
answer = *max_element(land[s_len - 1].begin(), land[s_len-1].end());
return answer;
}
ROR 게임은 두 팀으로 나누어서 진행하며, 상대 팀 진영을 먼저 파괴하면 이기는 게임입니다. 따라서, 각 팀은 상대 팀 진영에 최대한 빨리 도착하는 것이 유리합니다.
지금부터 당신은 한 팀의 팀원이 되어 게임을 진행하려고 합니다. 다음은 5 x 5 크기의 맵에, 당신의 캐릭터가 (행: 1, 열: 1) 위치에 있고, 상대 팀 진영은 (행: 5, 열: 5) 위치에 있는 경우의 예시입니다.
위 그림에서 검은색 부분은 벽으로 막혀있어 갈 수 없는 길이며, 흰색 부분은 갈 수 있는 길입니다. 캐릭터가 움직일 때는 동, 서, 남, 북 방향으로 한 칸씩 이동하며, 게임 맵을 벗어난 길은 갈 수 없습니다.
아래 예시는 캐릭터가 상대 팀 진영으로 가는 두 가지 방법을 나타내고 있습니다.
게임 맵의 상태 maps가 매개변수로 주어질 때, 캐릭터가 상대 팀 진영에 도착하기 위해서 지나가야 하는 칸의 개수의 최솟값을 return 하도록 solution 함수를 완성해주세요. 단, 상대 팀 진영에 도착할 수 없을 때는 -1을 return 해주세요.
첫 번쨰 풀이
#include<vector>
#include <iostream>
using namespace std;
int dfs(vector<vector<int>> maps, int max_n, int max_m, int &answer, int n, int m, int count)
{
if (answer != -1 && answer <= count)
return 0;
maps[n][m] = 0;
if(n == max_n - 1 && m == max_m - 1)
{
if(answer == -1 || answer > count)
answer = count;
return 0;
}
if(n - 1 >= 0 && maps[n - 1][m])
dfs(maps, max_n, max_m, answer, n - 1, m, count + 1);
if(n + 1 < max_n && maps[n + 1][m])
dfs(maps, max_n, max_m, answer, n + 1, m, count + 1);
if(m - 1 >= 0 && maps[n][m - 1])
dfs(maps, max_n, max_m, answer, n, m - 1, count + 1);
if(m + 1 < max_m && maps[n][m + 1])
dfs(maps, max_n, max_m, answer, n, m + 1, count + 1);
return 0;
}
int solution(vector<vector<int>> maps)
{
int n = 0;
int m = 0;
int answer = -1;
dfs(maps, maps.size(), maps[0].size(), answer, n, m, 1);
return answer;
}
두 번쨰 풀이
#include<vector>
#include <queue>
#include <iostream>
using namespace std;
typedef struct t_pos_nm{
int n;
int m;
int c;
} s_pos_nm;
void bfs(vector<vector<int>> &maps, s_pos_nm &pos_nm, queue<s_pos_nm> &q, int *max_n, int *max_m, int &answer, s_pos_nm &tmp)
{
if(q.size() == 0)
return ;
pos_nm = q.front();
if(pos_nm.n == (*max_n) - 1 && pos_nm.m == (*max_m) - 1)
{
answer = pos_nm.c + 1;
return ;
}
q.pop();
if (maps[pos_nm.n][pos_nm.m]) {
maps[pos_nm.n][pos_nm.m] = 0;
if(pos_nm.n - 1 >= 0 && maps[pos_nm.n - 1][pos_nm.m])
{
tmp.n = pos_nm.n - 1;
tmp.m = pos_nm.m;
tmp.c = pos_nm.c + 1;
if(tmp.n == (*max_n) - 1 && tmp.m == (*max_m) - 1)
{
answer = tmp.c + 1;
return;
}
q.push(tmp);
}
if(pos_nm.n + 1 < (*max_n) && maps[pos_nm.n + 1][pos_nm.m])
{
tmp.n = pos_nm.n + 1;
tmp.m = pos_nm.m;
tmp.c = pos_nm.c + 1;
if(tmp.n == (*max_n) - 1 && tmp.m == (*max_m) - 1)
{
answer = tmp.c + 1;
return;
}
q.push(tmp);
}
if(pos_nm.m - 1 >= 0 && maps[pos_nm.n][pos_nm.m - 1])
{
tmp.n = pos_nm.n;
tmp.m = pos_nm.m - 1;
tmp.c = pos_nm.c + 1;
if(tmp.n == (*max_n) - 1 && tmp.m == (*max_m) - 1)
{
answer = tmp.c + 1;
return;
}
q.push(tmp);
}
if(pos_nm.m + 1 < (*max_m) && maps[pos_nm.n][pos_nm.m + 1])
{
tmp.n = pos_nm.n;
tmp.m = pos_nm.m + 1;
tmp.c = pos_nm.c + 1;
if(tmp.n == (*max_n) - 1 && tmp.m== (*max_m) - 1)
{
answer = tmp.c + 1;
return;
}
q.push(tmp);
}
}
bfs(maps, pos_nm, q, max_n, max_m, answer, tmp);
return ;
}
int solution(vector<vector<int>> maps)
{
queue<s_pos_nm> q;
s_pos_nm pos_nm = {0,0,0};
s_pos_nm tmp = {0,0,0};
//문제는 이렇게 접근하게 되면, pos_nm와 tmp를 vector로 넘겨주었을때 시간초과가 나온다.
// 젤 좋은 방법은 세진님이 하신 방법대로 pair로 포스 위치를 넘기고,
// 지나온 맵인지 확인하는 값은, pos_nm의 c나 3번쨰 인덱스가 아니라, 따로 맵을 을 만들어서 넘기는게 좋을거 같다.
// queue<vector<int>> q;
// vector<int> pos_nm (3,0);
// vector<int> tmp(3,0);
int answer = -1;
int n = maps.size();
int m = maps[0].size();
q.push(pos_nm);
bfs(maps, pos_nm, q, &n, &m, answer , tmp);
return answer;
}
세 번쨰 풀이
typedef struct t_pos_nm{
int n;
int m;
int c;
} s_pos_nm;
//wndrksdptj 11 까지 가는거, 마지막까지 가는거
int solution(vector<vector<int>> maps)
{
queue<s_pos_nm> q;
s_pos_nm pos_nm = {0,0,0};
q.push(pos_nm);
s_pos_nm tmp = {0,0,0};
int answer = -1;
// bfs(maps, pos_nm, q, maps.size(), maps[0].size(), answer , tmp);
int max_m = maps[0].size();
int max_n = maps.size();
while(!q.empty())
{
pos_nm = q.front();
if(pos_nm.n == max_n - 1 && pos_nm.m == max_m - 1)
{
answer = pos_nm.c + 1;
break;
}
if (maps[pos_nm.n][pos_nm.m]) {
maps[pos_nm.n][pos_nm.m] = 0;
// q.pop();
if(pos_nm.n - 1 >= 0 && maps[pos_nm.n - 1][pos_nm.m])
{
tmp.n = pos_nm.n - 1;
tmp.m = pos_nm.m;
tmp.c = pos_nm.c + 1;
// if(tmp.n == max_n - 1 && tmp.m == max_m - 1)
// {
// answer = tmp.c + 1;
// break;
// }
q.push(tmp);
}
if(pos_nm.n + 1 < max_n && maps[pos_nm.n + 1][pos_nm.m])
{
tmp.n = pos_nm.n + 1;
tmp.m = pos_nm.m;
tmp.c = pos_nm.c + 1;
// if(tmp.n == max_n - 1 && tmp.m == max_m - 1)
// {
// answer = tmp.c + 1;
// break;
// }
q.push(tmp);
}
if(pos_nm.m - 1 >= 0 && maps[pos_nm.n][pos_nm.m - 1])
{
tmp.n = pos_nm.n;
tmp.m = pos_nm.m - 1;
tmp.c = pos_nm.c + 1;
// if(tmp.n == max_n - 1 && tmp.m == max_m - 1)
// {
// answer = tmp.c + 1;
// break;
// }
q.push(tmp);
}
if(pos_nm.m + 1 < max_m && maps[pos_nm.n][pos_nm.m + 1])
{
tmp.n = pos_nm.n;
tmp.m = pos_nm.m + 1;
tmp.c = pos_nm.c + 1;
// if(tmp.n == max_n - 1 && tmp.m == max_m - 1)
// {
// answer = tmp.c + 1;
// break;
// }
q.push(tmp);
}
}
q.pop();
}
return answer;
}
첫 번쨰 코드
두 번쨰 코드
세 번째 코드
* 그외 정리
게임 캐릭터를 4가지 명령어를 통해 움직이려 합니다. 명령어는 다음과 같습니다.
U: 위쪽으로 한 칸 가기
D: 아래쪽으로 한 칸 가기
R: 오른쪽으로 한 칸 가기
L: 왼쪽으로 한 칸 가기
캐릭터는 좌표평면의 (0, 0) 위치에서 시작합니다. 좌표평면의 경계는 왼쪽 위(-5, 5), 왼쪽 아래(-5, -5), 오른쪽 위(5, 5), 오른쪽 아래(5, -5)로 이루어져 있습니다.
#include <string>
#include <iostream>
#include <vector>
using namespace std;
int solution(string dirs) {
int answer = 0;
// vector<int> vec(3,-1)
vector<int> vec(2,0);
vector<vector<int>> row_LR(10, vector<int>(10, 0));
for (int i = 0; i < dirs.size(); i++)
{
if(dirs[i] == 'L')
{
if (vec[0] == -5)
continue;
vec[0]--;
if(row_LR[vec[1] + 5][vec[0] + 5] != 1)
{
row_LR[vec[1] + 5][vec[0] + 5] = 1;
answer++;
}
}
else if(dirs[i] == 'R')
{
if(vec[0] == 5)
continue;
vec[0]++;
if(row_LR[vec[1] + 5][vec[0] + 5] != 1)
{
row_LR[vec[1] + 5][vec[0] + 5] = 1;
answer++;
}
}
else if(dirs[i] == 'U')
{
if(vec[1] == 5)
continue;
vec[1]++;
if(row_LR[vec[1] + 5][vec[0] + 5] != 1)
{
row_LR[vec[1] + 5][vec[0] + 5] = 1;
answer++;
}
}
else if(dirs[i] == 'D')
{
if(vec[1] == -5)
continue;
vec[1]--;
if(row_LR[vec[1] + 5][vec[0] + 5] != 1)
{
row_LR[vec[1] + 5][vec[0] + 5] = 1;
answer++;
}
}
}
for(int i = 0; i < row_LR.size(); i++)
{
for(int j = 0; j < row_LR[i].size(); j++)
{
cout << row_LR[i][j];
}
cout << "\n";
}
return answer;
}
Finn은 요즘 수학공부에 빠져 있습니다. 수학 공부를 하던 Finn은 자연수 n을 연속한 자연수들로 표현 하는 방법이 여러개라는 사실을 알게 되었습니다. 예를들어 15는 다음과 같이 4가지로 표현 할 수 있습니다.
1 + 2 + 3 + 4 + 5 = 15
4 + 5 + 6 = 15
7 + 8 = 15
15 = 15
자연수 n이 매개변수로 주어질 때, 연속된 자연수들로 n을 표현하는 방법의 수를 return하는 solution를 완성해주세요.
#include <string>
#include <vector>
using namespace std;
int solution(int n) {
int answer = 0;
int i = 0;
int j= 1;
int result = 0;
int flag = 0;
while(i <= n)
{
j = 1;
while(j + i <=n && result < n)
{
result += i+j;
j++;
}
if(result == n)
flag++;
result = 0;
i++;
}
return flag;
}
0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.
x의 모든 0을 제거합니다.
x의 길이를 c라고 하면, x를 "c를 2진법으로 표현한 문자열"로 바꿉니다.
예를 들어, x = "0111010"이라면, x에 이진 변환을 가하면 x = "0111010" -> "1111" -> "100" 이 됩니다.
0과 1로 이루어진 문자열 s가 매개변수로 주어집니다. s가 "1"이 될 때까지 계속해서 s에 이진 변환을 가했을 때, 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 각각 배열에 담아 return 하도록 solution 함수를 완성해주세요.
#include <string>
#include <vector>
using namespace std;
vector<int> solution(string s) {
vector<int> answer;
answer.push_back(0);
answer.push_back(0);
int sum = 0;
while(s.size() > 1)
{
sum = 0;
for (int i = 0; i < s.size(); i++)
{
if (s[i] == '1')
sum++;
}
answer[1] += s.size() - sum;
s = "";
while (sum != 0)
{
s += (sum % 2) + '0';
sum = sum / 2;
}
answer[0] += 1;
}
return answer;
}