#include <string>
#include <vector>
#include <map>
using namespace std;
int solution(vector<vector<string>> clothes) {
int answer = 1;
map<string, int> map_tmp;
for (int i = 0; i < clothes.size(); i++)
map_tmp[clothes[i][1]]++;
for (auto it = map_tmp.begin(); it != map_tmp.end(); it++)
answer *= (it->second + 1);
return (answer - 1);
}
#include <string>
#include <vector>
using namespace std;
void DFS(int *answer, int target, int sum, int depth, vector<int> numbers, int tmp)
{
sum += (numbers[depth - 1] * tmp);
if (depth != numbers.size())
{
depth++;
DFS(answer, target, sum, depth, numbers, -1);
DFS(answer, target, sum, depth, numbers, 1);
}
else
{
if (sum == target)
(*answer)++;
}
}
int solution(vector<int> numbers, int target) {
int sum = 0;
int answer = 0;
int depth = 1;
DFS(&answer, target, sum, depth, numbers, -1);
DFS(&answer, target, sum, depth, numbers, 1);
return answer;
}
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
void check(vector<vector<char>> vec_tmp, vector<string> data, int *answer)
{
int flag;
for (int i = 0; i < vec_tmp.size(); i++)
{
flag = 0;
for (int j = 0; j < data.size(); j++)
{
auto a = find(vec_tmp[i].begin(), vec_tmp[i].end(), data[j][0]);
auto b = find(vec_tmp[i].begin(), vec_tmp[i].end(), data[j][2]);
if (data[j][3] == '=')
{
if (abs(b - a) - 1 != data[j][4] - '0')
{
flag = 1;
break;
}
}
else if (data[j][3] == '>')
{
if (abs(b - a) - 1 <= data[j][4] - '0')
{
flag = 1;
break;
}
}
else if (data[j][3] == '<')
{
if (abs(b - a) - 1 >= data[j][4] - '0')
{
flag = 1;
break;
}
}
}
if (flag == 0)
(*answer)++;
}
}
int solution(int n, vector<string> data) {
vector<char> character = {'A', 'C', 'F', 'J', 'M', 'N', 'R', 'T'};
vector<vector<char>> vec_tmp;
int answer = 0;
do {
vec_tmp.push_back(character);
} while (next_permutation(character.begin(), character.end()));
check(vec_tmp, data, &answer);
return answer;
}
#include <string>
using namespace std;
bool solution(string s)
{
bool answer = true;
int tmp = 0;
for (int i = 0; i < s.size(); i++)
{
if (s[i] == '(')
tmp++;
else if (s[i] == ')')
tmp--;
if (tmp < 0)
break;
}
if (tmp != 0)
answer = false;
return answer;
}
#include <string>
#include <vector>
using namespace std;
int solution(string dirs) {
vector<pair<int, int>> vec_tmp; // pos가 지나온 노드 저장
pair<int, int> pos(0, 0); // pos의 좌표 표현
int answer = 0;
int flag;
vec_tmp.push_back(pos);
for (int i = 0; i < dirs.size(); i++)
{
flag = 0;
if (dirs[i] == 'U') // pos 이동
pos.second++;
else if (dirs[i] == 'D')
pos.second--;
else if (dirs[i] == 'L')
pos.first--;
else if (dirs[i] == 'R')
pos.first++;
if (pos.first > 5) // pos 최대 최솟값 제한
pos.first--;
else if (pos.first < -5)
pos.first++;
else if (pos.second > 5)
pos.second--;
else if (pos.second < -5)
pos.second++;
for (int j = 0; j < vec_tmp.size(); j++)
{
if (pos.first == vec_tmp[j].first && pos.second == vec_tmp[j].second) // pos가 지나온 적 있는 노드인지 확인
{
if (vec_tmp[vec_tmp.size() - 1].first == vec_tmp[j - 1].first && vec_tmp[vec_tmp.size() - 1].second == vec_tmp[j - 1].second) // 지나온적 있는 노드라면 간선도 지나왔던 간선인지 확인
flag = 1;
else if (vec_tmp[vec_tmp.size() - 1].first == vec_tmp[j + 1].first && vec_tmp[vec_tmp.size() - 1].second == vec_tmp[j + 1].second)
flag = 1;
}
}
if (!(vec_tmp[vec_tmp.size() - 1].first == pos.first && vec_tmp[vec_tmp.size() - 1].second == pos.second)) // 움직인 후의 위치와 전의 위치가 같은지 확인 (좌표의 최대 최솟값 제한으로 인해 차이가 없을 수도 있음)
vec_tmp.push_back(pos);
else
flag = 1;
if (flag == 0) // flag가 0일때는 지나온 간선이 처음 지난 간선을 의미
answer++;
}
return answer;
}
#include <string>
#include <vector>
using namespace std;
string ft_to_digit(int n)
{
string result = "";
string tmp;
while (n)
{
if (n % 2 == 0)
tmp = "0";
else
tmp = "1";
result = tmp + result;
n /= 2;
}
return (result);
}
vector<int> solution(string s) {
vector<int> answer(2, 0);
int int_tmp;
while (1)
{
for (int i = 0; i < s.size(); i++)
{
if (s[i] == '0')
{
s.erase(s.begin() + i--);
answer[1]++;
}
}
int_tmp = s.size();
s = ft_to_digit(int_tmp);
answer[0]++;
if (s == "1")
break;
}
return answer;
}
#include <string>
#include <vector>
using namespace std;
vector<int> solution(int brown, int yellow) {
vector<int> answer;
int int_tmp = (brown - 4) / 2;
int result1;
int result2;
for (int i = 1; i <= int_tmp / 2; i++)
{
if (yellow == (int_tmp - i) * i)
{
result1 = int_tmp - i + 2;
result2 = i + 2;
break;
}
}
answer.push_back(result1);
answer.push_back(result2);
return answer;
}
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool compare(pair<int, int> a, pair<int, int> b)
{
return (a.second > b.second);
}
vector<int> solution(string s) {
vector<int> answer;
vector<int> tmp;
vector<vector<int>> intvec_tmp;
vector<pair<int, int>> vec_tmp;
pair<int, int> pair_tmp;
string str_tmp = "";
int flag = 0;
for (int i = 0; i < s.size(); i++)
{
if (s[i] >= '0' && s[i] <= '9')
str_tmp += s[i];
else if (s[i] == ',' && flag == 2)
{
tmp.push_back(stoi(str_tmp));
str_tmp = "";
}
else if (s[i] == '}' && flag == 2)
{
tmp.push_back(stoi(str_tmp));
intvec_tmp.push_back(tmp);
str_tmp = "";
tmp.clear();
flag--;
}
else if (s[i] == '{')
flag++;
}
for (int i = 0; i < intvec_tmp.size(); i++)
{
for (int j = 0; j < intvec_tmp[i].size(); j++)
{
flag = 0;
for (int z = 0; z < vec_tmp.size(); z++)
{
if (intvec_tmp[i][j] == vec_tmp[z].first)
{
vec_tmp[z].second++;
flag = 1;
break;
}
}
if (flag == 0)
{
pair_tmp.first = intvec_tmp[i][j];
pair_tmp.second = 1;
vec_tmp.push_back(pair_tmp);
}
}
}
sort(vec_tmp.begin(), vec_tmp.end(), compare);
for (int i = 0; i < vec_tmp.size(); i++)
answer.push_back(vec_tmp[i].first);
return answer;
}
#include <string>
#include <vector>
using namespace std;
int one_num(string digit)
{
int result = 0;
for (int i = 0; i < digit.size(); i++)
{
if (digit[i] == '1')
result++;
}
return (result);
}
string to_digit(int n)
{
string result = "";
while (n)
{
result = to_string(n % 2) + result;
n /= 2;
}
return (result);
}
int solution(int n) {
int answer = 0;
string n_digit = to_digit(n);
string str_tmp;
int int_tmp;
int one = one_num(n_digit);
int i = n + 1;
while (1)
{
str_tmp = to_digit(i);
int_tmp = one_num(str_tmp);
if (int_tmp == one)
{
answer = i;
break;
}
i++;
}
return answer;
}
using namespace std;
int solution(int n) {
int answer = 0;
int tmp;
for (int i = 0; i <= n; i++)
{
tmp = 0;
for (int j = i; n > tmp; j++)
{
tmp += j;
if (n == tmp)
answer++;
}
}
return answer;
}
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int compare(string s1, string s2)
{
if (s1[0] == '-' && s2[0] != '-')
return (0);
else if (s1[0] != '-' && s2[0] == '-')
return (1);
else if (s1[0] == '-' && s2[0] == '-')
{
if (s1.length() == s2.length())
{
for (int i = 1; i < s1.size(); i++)
{
if (s1[i] > s2[i])
return (0);
else if (s1[i] < s2[i])
return (1);
}
}
else
{
if (s1.length() > s2.length())
return (0);
else
return (1);
}
}
else if (s1[0] != '-' && s2[0] != '-')
{
if (s1.length() == s2.length())
{
for (int i = 0; i < s1.size(); i++)
{
if (s1[i] < s2[i])
return (0);
else if (s1[i] > s2[i])
return (1);
}
}
else
{
if (s1.length() < s2.length())
return (0);
else
return (1);
}
}
return (0);
}
string solution(string s) {
string answer = "";
vector<string> vec_tmp;
string str_tmp = "";
for (int i = 0; i < s.size(); i++)
{
if (s[i] == ' ')
{
vec_tmp.push_back(str_tmp);
str_tmp = "";
}
else
str_tmp += s[i];
}
vec_tmp.push_back(str_tmp);
for (int i = 0; i < vec_tmp.size(); i++)
cout << vec_tmp[i] << endl;
for (int i = 0; i < vec_tmp.size() - 1; i++)
{
for (int j = i + 1; j < vec_tmp.size(); j++)
{
if (compare(vec_tmp[i], vec_tmp[j]))
{
str_tmp = vec_tmp[i];
vec_tmp[i] = vec_tmp[j];
vec_tmp[j] = str_tmp;
}
}
}
answer += vec_tmp[0];
answer += " ";
answer += vec_tmp[vec_tmp.size() - 1];
return answer;
}
#include <string>
#include <vector>
using namespace std;
vector<vector<int>> solution(vector<vector<int>> arr1, vector<vector<int>> arr2) {
vector<vector<int>> answer;
vector<int> vec_tmp;
int int_tmp;
for (int i = 0; i < arr1.size(); i++)
{
for (int j = 0; j < arr2[0].size(); j++)
{
int_tmp = 0;
for (int z = 0; z < arr1[i].size(); z++)
int_tmp += arr1[i][z] * arr2[z][j];
vec_tmp.push_back(int_tmp);
}
answer.push_back(vec_tmp);
vec_tmp.clear();
}
return answer;
}
#include <string>
#include <vector>
using namespace std;
string solution(string s) {
string answer = "";
int flag = 1;
for (int i = 0; i < s.size(); i++)
{
if (s[i] == ' ')
flag = 1;
else
{
if (flag == 1 && s[i] >= 'a' && s[i] <= 'z')
s[i] -= 32;
else if (flag == 0 && s[i] >= 'A' && s[i] <= 'Z')
s[i] += 32;
flag = 0;
}
}
answer = s;
return answer;
}
#include <iostream>
#include <cmath>
using namespace std;
int solution(int n, int a, int b)
{
int answer = 1;
while (1)
{
if (abs(b - a) == 1 && a / 2 != b / 2)
break;
else
answer++;
if (a % 2 == 0)
a /= 2;
else
a = (a / 2 + 1);
if (b % 2 == 0)
b /= 2;
else
b = (b / 2 + 1);
}
return answer;
}
DFS(Depth-First Search)는 하나의 정점에서 시작하여 모든 정점들을 하나씩 방문하는
그래프 탐색알고리즘이다. 이름 그대로 하나의 경로를 완전히 탐색한 후에 다음 경로를 완전히 탐색하는 방식으로 모든 정점을 방문한다. 특정 도시에서 다른 도시로 갈 수 있는지 파악하는 문제나 전자회로에서 특정 단자 간에 연결을 확인하는 문제에서 주로 사용된다.

#include <string>
#include <vector>
using namespace std;
void DFS(int *answer, int target, int sum, int depth, vector<int> numbers, int tmp)
{
sum += (numbers[depth - 1] * tmp);
if (depth != numbers.size())
{
depth++;
DFS(answer, target, sum, depth, numbers, -1);
DFS(answer, target, sum, depth, numbers, 1);
}
else
{
if (sum == target)
(*answer)++;
}
}
int solution(vector<int> numbers, int target) {
int sum = 0;
int answer = 0;
int depth = 1;
DFS(&answer, target, sum, depth, numbers, -1);
DFS(&answer, target, sum, depth, numbers, 1);
return answer;
}
타겟 넘버 문제이다. 해당 문제는 재귀를 활용한 DFS로 풀 수 있는 가장 쉬운 문제이다.BFS(Breadth-First Search)는 하나의 정점에서 시작하여 모든 정점들을 하나씩 방문하는
그래프 탐색알고리즘이다. 이름 그대로 가장 인접한 정점을 우선적으로 탐색하는 알고리즘이다. 최단경로 문제에 주로 활용된다.

#include <string>
#include <vector>
#include <queue>
using namespace std;
int check(vector<int> num)
{
for (int i = 0; i < num.size(); i++)
{
if (num[i] == 0)
return (i);
}
return (-1);
}
void BFS(vector<vector<int>> computers, vector<int> &visit, int start)
{
int node;
queue<int> q;
q.push(start);
visit[start] = 1;
while (!q.empty())
{
node = q.front();
q.pop();
for (int i = 0; i < computers[node].size(); i++)
{
if (node != i && visit[i] == 0 && computers[node][i] == 1)
{
q.push(i);
visit[i] = 1;
}
}
}
}
int solution(int n, vector<vector<int>> computers) {
vector<int> visit(computers.size(), 0);
int answer = 0;
int start;
while (1)
{
start = check(visit);
if (start > -1)
{
BFS(computers, visit, start);
answer++;
}
else
break;
}
return answer;
}
네트워크라는 문제의 코드이다. 노드간 완전히 연결되어 있는 네트워크의 수가 몇 개인지 구하는 문제이다.BFS 알고리즘을 숙련시키기 위해
단어 변환문제와게임 맵 최단거리문제를 더 풀어보았다.
단어변환 문제 : https://programmers.co.kr/learn/courses/30/lessons/43163
게임 맵 최단거리 문제 : https://programmers.co.kr/learn/courses/30/lessons/1844
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <algorithm>
using namespace std;
int check(string s1, string s2)
{
int result = 0;
for (int i = 0; i < s1.size(); i++)
{
if (s1[i] != s2[i])
result++;
}
return (result);
}
int visit_fn(string s, vector<pair<string, int>> visit)
{
for (int i = 0; i < visit.size(); i++)
{
if (s == visit[i].first)
return (1);
}
return (0);
}
int solution(string begin, string target, vector<string> words) {
int answer = 0;
int flag = 0;
pair<string, int> pos;
queue<pair<string, int>> q;
vector<pair<string, int>> visit;
pair<string, int> tmp;
tmp.first = begin;
tmp.second = 0;
visit.push_back(tmp);
q.push(tmp);
while (!q.empty() && flag == 0)
{
pos = q.front();
q.pop();
for (int i = 0; i < words.size(); i++)
{
if (check(pos.first, words[i]) == 1)
{
if (words[i] == target)
{
answer = pos.second + 1;
flag = 1;
break;
}
if (!visit_fn(words[i], visit))
{
tmp.first = words[i];
tmp.second = pos.second + 1;
visit.push_back(tmp);
q.push(tmp);
}
}
}
}
return answer;
}
원래는 DFS 알고리즘을 활용하여 풀었으나 효율성이 없는 방식이었다.(시간 초과) 그래서 BFS 알고리즘을 활용하였고, 시간을 단축시킬 수 있었다.
#include <vector>
#include <queue>
using namespace std;
int solution(vector<vector<int>> maps)
{
int answer = -1;
int n = maps[0].size();
int m = maps.size();
pair<int, int> pos(0, 0);
pair<int, int> after_pos;
queue<pair<int, int>> q;
vector<vector<int>> visit(m, vector<int>(n, 0)); // **
q.push(pos);
visit[pos.second][pos.first] = 1;
while (!q.empty())
{
pos = q.front();
q.pop();
if (maps[pos.second + 1][pos.first] == 1)
{
if (pos.second + 1 < m && visit[pos.second + 1][pos.first] == 0)
{
after_pos.first = pos.first;
after_pos.second = pos.second + 1;
visit[pos.second + 1][pos.first] = (visit[pos.second][pos.first] + 1);
if (after_pos.first == n - 1 && after_pos.second == m - 1)
{
answer = visit[after_pos.second][after_pos.first];
break;
}
q.push(after_pos);
}
}
if (maps[pos.second - 1][pos.first] == 1)
{
if (pos.second - 1 >= 0 && visit[pos.second - 1][pos.first] == 0)
{
after_pos.first = pos.first;
after_pos.second = pos.second - 1;
visit[pos.second - 1][pos.first] = (visit[pos.second][pos.first] + 1);
if (after_pos.first == n - 1 && after_pos.second == m - 1)
{
answer = visit[after_pos.second][after_pos.first];
break;
}
q.push(after_pos);
}
}
if (maps[pos.second][pos.first + 1] == 1)
{
if (pos.first + 1 < n && visit[pos.second][pos.first + 1] == 0)
{
after_pos.first = pos.first + 1;
after_pos.second = pos.second;
visit[pos.second][pos.first + 1] = (visit[pos.second][pos.first] + 1);
if (after_pos.first == n - 1 && after_pos.second == m - 1)
{
answer = visit[after_pos.second][after_pos.first];
break;
}
q.push(after_pos);
}
}
if (maps[pos.second][pos.first - 1] == 1)
{
if (pos.first - 1 >= 0 && visit[pos.second][pos.first - 1] == 0)
{
after_pos.first = pos.first - 1;
after_pos.second = pos.second;
visit[pos.second][pos.first - 1] = (visit[pos.second][pos.first] + 1);
if (after_pos.first == n - 1 && after_pos.second == m - 1)
{
answer = visit[after_pos.second][after_pos.first];
break;
}
q.push(after_pos);
}
}
}
return answer;
}
vector<vector<int>> visit(m, vector<int>(n, 0));형태로 초기화가 가능하다.