Algorithm
Programmers - 문자열 압축, 타겟 넘버, 오픈 채팅방
HI2
2021. 6. 15. 14:56
[ 문자열 압축 ] : < LV2 / 11968명 >
더보기
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int Compress(string s, int unit)
{
vector<string> v;
string res = "";
int i = 0, count = 1;
//
while(true)
{
v.push_back(s.substr(i, unit));
i += unit;
if(i >= s.size())
break;
}
//
for(int j = 0; j < v.size(); ++j)
{
if(j == v.size()-1)
{
if(v[j-1] == v[j])
res += to_string(count) + v[j];
else
res += v[j];
//
break;
}
//
if(v[j] == v[j+1])
++count;
else
{
if(count > 1)
res += to_string(count) + v[j];
else
res += v[j];
//
count = 1;
}
}
//
return res.size();
}
int solution(string s)
{
int answer = 0; // min length
//
int length = s.size();
int maxUnit = length / 2;
int compLength = length;
//
for(int i = 1; i <= maxUnit; ++i)
{
compLength = Compress(s, i);
if(compLength < length)
length = compLength;
}
answer = length;
//
return answer;
}
#
[ 타겟 넘버 ] : < LV2 / 18093명 >
더보기
#include <string>
#include <vector>
#include <deque>
#include <cmath>
using namespace std;
int solution(vector<int> numbers, int target)
{
int answer = 0;
int count = numbers.size();
// target을 구할 수 없는 경우 예외처리
int max, min = 0;
for(int i = 0; i < count; ++i)
{
max += numbers[i];
min -= numbers[i];
}
if(target > max || target < min)
return 0;
else if(target == max || target == min)
return 1;
// 모든 경우의 수 계산
deque<int> dq;
dq.push_back(0);
for(int i = 0; i < count; ++i)
{
for(int j = 0; j < pow(2, i); ++j)
{
int temp = dq.front();
dq.pop_front();
//
dq.push_back(temp + numbers[i]);
dq.push_back(temp - numbers[i]);
}
}
// 원소 갯수는 2의 배수이고, [대칭구조]이므로
// (size / 2) 까지만 탐색하고, -target인 경우도 포함시킨다.
for(int i = 0; i < dq.size() / 2; ++i)
{
if(dq[i] == target || dq[i] == -target)
++answer;
}
//
return answer;
}
# deque, pop_front()
[ 오픈 채팅방 ] : < LV2 / 10163명 >
더보기
#include <string>
#include <vector>
#include <map>
using namespace std;
vector<string> SplitSpace(string s)
{
vector<string> result;
//
string space = " ";
int pos = 0;
while (pos != string::npos)
{
pos = s.find(space);
result.push_back(s.substr(0, pos));
s.erase(0, pos + space.length());
}
//
return result;
}
vector<string> solution(vector<string> record)
{
vector<string> answer;
//
map<string, string> mID; // key : id , value : name
//
vector<string> msg;
for(int i = 0; i < record.size(); ++i)
{
msg.clear();
msg = SplitSpace(record[i]);
if(msg.size() > 2)
mID[msg[1]] = msg[2];
}
//
map<string, string> mAction;
mAction["Enter"] = "들어왔습니다.";
mAction["Leave"] = "나갔습니다.";
//
for(int i = 0; i < record.size(); ++i)
{
msg.clear();
msg = SplitSpace(record[i]);
if(msg[0] == "Enter" || msg[0] == "Leave")
{
string temp = mID[msg[1]] + "님이 " + mAction[msg[0]];
answer.push_back(temp);
}
}
return answer;
}
# 공백제거 : substr(pos, space(" ")), string::npos
# map