2019 카카오 개발자 겨울 인턴십
스택 문제. 벡터로 구현했다.
더보기
#include <string>
#include <vector>
using namespace std;
int solution(vector<vector<int>> board, vector<int> moves) {
int answer = 0;
vector<int> v; // as Stack
int N = board.size();
for (int m : moves) {
// Find position
int idx = 0;
while (idx < N && !board[idx][m-1]) idx++;
// Pick Up & Get Answer
if (idx < N) {
int tar = board[idx][m-1];
board[idx][m-1] = 0;
if (!v.empty() && tar == v.back()) v.pop_back(), answer+=2;
else v.push_back(tar);
}
}
return answer;
}
부분 문자열을 먼저 벡터에 넣고 크기 순으로 정렬한 뒤 원소를 차례대로 찾았다.
너무 복잡하게 푼 것 같다,, 인덱스도 헷갈리고 시간도 꽤 오래 걸리는 것 같은데 이 방법 뿐이 없는건지
더보기
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool in[1000001];
vector<int> tup[501];
bool sorttup(vector<int> A, vector<int> B) { return A.size() < B.size(); };
vector<int> solution(string s) {
vector<int> answer;
// {{1,21,3},{21,1},{1,21,445,3},{21}}
// 1 , w(++) 2 1 , w(++) 3 } f(+=2)
// 2 1 , w(++) 1 } f(+=2) 1
// consider i++
// Get Substr
int N = 0, elem;
for (int i = 2; i < s.size(); ++N, i += 2) {
while (s[i] != '}') {
elem = (int)(s[i++]-'0');
while (s[i] != ',' && s[i] != '}') {
elem *= 10, elem += (int)(s[i++] - '0');
}
tup[N].push_back(elem);
if (s[i++] == '}') break;
}
}
// Sort
sort(tup, tup + N, sorttup);
// Get ANS
answer.push_back(tup[0][0]); in[tup[0][0]] = true;
for (int i = 1; i < N; ++i) {
for (int e : tup[i]) {
if (!in[e]) { answer.push_back(e); in[e] = true; break; }
}
}
return answer;
}
1. banned_id마다 짝지을 수 있는 user_id의 인덱스를 idx 배열에 추가한다.
2. 이제 ban은 상관이 없다. idx배열을 사이즈 따라 정렬한다.
3. idx벡터 크기가 1이면 반드시 한 개의 user을 선택할 수 있단 소리다. 그에 맞게 initstate를 만들어준다.
4. 여러 개 선택할 수 있는 경우에 대해 Count한다.
이때 순열이 아닌 조합 수를 세야 하므로 일반적인 recursion으로는 안 됨.
따라서 bitmasking이용, bool배열로 해당 조합이 선택됐는지 체크한다.
N≤8이라서 이렇게 풀었는데 이래도 되는 건가???? 너무 돌아가는 게 아닌가 싶다 ㅠㅠ 왜 모든 문제가 그런 느낌인지
더보기
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool selected[257];
vector<int> idx[8];
bool sortidx(vector<int> A, vector<int> B) {
return A.size() < B.size();
}
void Count(int b, int state, int FIN, int* ans) {
if (b == FIN) {
if (!selected[state]) selected[state]=true, (*ans)++;
return;
}
for (int u : idx[b]) {
if (!(state & (1 << u))) Count(b + 1, state | (1 << u), FIN, ans);
}
}
int solution(vector<string> user_id, vector<string> banned_id) {
int answer = 0;
int B = banned_id.size();
// Find possible pair of ban-user
int b = 0;
for (string ban:banned_id) {
int u = 0;
for (string user:user_id) {
if (ban.size() != user.size()) { ++u; continue; }
int i = 0;
for (; i < ban.size(); ++i) {
if (ban[i] == '*') continue;
else if (ban[i] != user[i]) break;
}
if (i == ban.size()) idx[b].push_back(u);
++u;
}
++b;
}
// Sort for effective recursion
sort(idx, idx + B, sortidx);
// Count ANS use bitmasking
int initstate = 0;
for (b = 0; b < B; ++b) {
if (idx[b].size() == 1) initstate |= (1 << idx[b][0]);
else break;
}
Count(b, initstate, B, &answer);
return answer;
}
프로그래머스 문제는 처음 풀어보는데 여러모로 익숙치 않다
'Probelm Solving > Programmers' 카테고리의 다른 글
2021 카카오 채용연계형 인턴십 ① (0) | 2021.08.18 |
---|---|
2020 카카오 인턴십 문제 ② (0) | 2021.05.10 |
2019 카카오 개발자 겨울 인턴십 문제 ② (0) | 2021.05.05 |
2020 카카오 인턴십 문제 ① (0) | 2021.05.02 |
댓글