๋ฌธ์ ๋งํฌ
https://school.programmers.co.kr/learn/courses/30/lessons/60060
ํค์๋๊ฐ ๋ด๊ธด ๋ฐฐ์ด์ด ์ฃผ์ด์ก์ ๋, ๊ฐ ํค์๋ ๋ณ๋ก ๋งค์น๋ ๋จ์ด๊ฐ ๋ช ๊ฐ์ธ์ง ๋ฆฌํดํ์.
์ค๋ต
๋๋ ๋จ์ด์ ํค์๋๋ฅผ ์ง์ ๋น๊ต๋ฅผ ํ๋ ๋ฐฉ์์ ์ ํํ๋ค.
๋จผ์ ๋จ์ด๋ฅผ ์์ํ๋ ์ํ๋ฒณ, ๋จ์ด์ ๊ธธ์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ถ๋ฅํ๋ค.
๋จ์ด์ ๊ธธ์ด์ ํค์๋์ ๊ธธ์ด๊ฐ ์ผ์นํ์ง ์์ผ๋ฉด ๋น๊ตํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ ํค์๋์ ๋ฌผ์ํ๊ฐ ๋ค์ ๋ถ์ด์๋ค๋ฉด, ๋ฌธ์๋ฅผ ์์์๋ถํฐ ๋น๊ตํ๊ณ ๋ฌผ์ํ๊ฐ ๋์ค๋ ์๊ฐ๋ถํฐ๋ ๋น๊ต๋ฅผ ๊ทธ๋งํ๋ค.
๋ฐ๋๋ก ๋ฌผ์ํ๊ฐ ์์ ๋ถ์ด์๋ค๋ฉด, ๋ฌธ์๋ฅผ ๋ค์์๋ถํฐ ๋น๊ตํด์ ๋ฌผ์ํ๊ฐ ๋์ค๊ธฐ ์ ๊น์ง ๋น๊ตํ๋ค.
์ด๋ ๊ฒํด์ ๋งค์น๋๋ ๋จ์ด์ ์๋ฅผ ๋ฆฌํดํ๋๋ก ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ค๋ณต๋ ํค์๋๊ฐ ์์ ์ ์๋ค๋ ์กฐ๊ฑด์ด ์๊ธฐ ๋๋ฌธ์, ํค์๋๋ณ๋ก ์ธ๋ฑ์ค๋ฅผ ๋ถ์ฌํด์ ํค์๋๋ณ๋ก ๋งค์น๋ ๋จ์ด์ ๊ฐ์๋ฅผ ์ ์ฅํด๋์๋ค.
๋ง์ฝ ํด๋น ํค์๋์ ๋งค์น๋ ๋จ์ด์ ์๊ฐ ์ด๋ฏธ ์ ์ฅ๋์ด์์ผ๋ฉด ๊ทธ ๊ฐ์ ๊บผ๋ด์ ๋ฆฌํดํ๋๋ก ํจ์๋ฅผ ์์ฑํ๋ค.
์ด๋ ๊ฒ ์์ฑํ ์ฝ๋๊ฐ ์๋์ ๊ฐ๋ค.
์ค๋ต ์ฝ๋
|
#include <bits/stdc++.h>
using namespace std;
map<string, int> Index;
int Count[100000 + 5];
vector<string> start_with[26][100000 + 1];
vector<string> end_with[26][100000 + 1];
int Find(vector<string> words, string str){
if(Count[Index[str]] != -1) //์ด๋ฏธ ํ๋ ํค์๋๋ผ๋ฉด
return Count[Index[str]];
if(str[0] == '?' && str[str.length() - 1] == '?')
return words.size();
if(str[0] == '?'){
//๋ค์์๋ถํฐ ๋น๊ต
int cnt = 0;
for(auto Cmp : end_with[str[str.length() - 1] - 'a'][str.length()]){
bool chk = true;
for(int i = str.length() - 1; i > 0; i--){
if(str[i] == '?')
break;
if(str[i] != Cmp[i]){
chk = false;
break;
}
}
if(chk)
cnt++;
}
Count[Index[str]] = cnt;
return cnt;
}
else{
//์์์๋ถํฐ ๋น๊ต
int cnt = 0;
for(auto Cmp : start_with[str[0]- 'a'][str.length()]){
bool chk = true;
for(int i = 0; i<str.length(); i++){
if(str[i] == '?')
break;
if(str[i] != Cmp[i]){
chk = false;
break;
}
}
if(chk)
cnt++;
else{
if(cnt)
break;
}
}
Count[Index[str]] = cnt;
return cnt;
}
}
vector<int> solution(vector<string> words, vector<string> queries) {
vector<int> answer;
memset(Count, -1, sizeof(Count));
sort(words.begin(), words.end());
for(auto str : words){
start_with[str[0] - 'a'][str.length()].push_back(str);
end_with[str[str.length() - 1] - 'a'][str.length()].push_back(str);
}
int idx = 0;
for(auto str : queries){
if(Index.find(str) == Index.end()){
Index.insert({str, idx++});
}
}
for(auto str : queries)
answer.push_back(Find(words, str));
return answer;
}
|
cs |
๋ชจ๋ ๋จ์ด๋ฅผ ์ง์ ๋น๊ตํด์ผํ๊ธฐ ๋๋ฌธ์ ๋จ์ด์ ์์ด ๋ง์์ง์๋ก, ๋จ์ด์ ๊ธธ์ด๊ฐ ๊ธธ์ด์ง์๋ก ์๊ฐ์ด ์ค๋๊ฑธ๋ฆฐ๋ค๋ ๋จ์ ์ด ์๋ค.
๊ทธ๋์ ํจ์จ์ฑํ ์คํธ 1,2,3์์ ์๊ฐ์ด๊ณผ๋ฅผ ๋ฐ์๋ค.
ํ์ด
์กฐ๊ธ ๋ ํจ์จ์ ์ผ๋ก ๋น๊ตํ ํ์๊ฐ ์์๋ค.
์ด๋ถํ์์ ์ด์ฉํด๋ฉด ๋๋ค๊ณ ํ๋๋ฐ, ๋ฌธ์์ด์์ ์ด๋ถํ์์ ์ด๋ป๊ฒ ์ด์ฉํ๋์ง ๋์ ํ ๊ฐ์ด ์กํ์ง ์์์ ์ค๋๋ ๊ณ ์๋ถ๋ค์ ์์ด๋์ด๋ฅผ ์ฐธ๊ณ ํ๋ค.
์ค๋๋ "๊ณต๋ถํ๋ ์๋นต๋ง" ๋์ ํด์ค์ ์ฐธ๊ณ ํ๋ค.
์ด๋ถํ์์ ์ง์ ์ ์ผ๋ก ์ด์ฉํ๋ ๊ฒ์ด ์๋๋ผ, upper_bound์ lower_bound๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด์๋ค. ์์ด๋์ด๊ฐ ์ ๋ง ์ฐธ์ ํ ๊ฒ ๊ฐ๋ค.
๋ง์ฝ ํค์๋๊ฐ "fro??" ๋ผ๋ฉด "frost", "frodo", "froze" ๋ฑ๋ฑ "fro"๋ก ์์ํ๋ 5๊ธ์ ๋จ์ด๋ฉด ๋ชจ๋ ๋งค์น๊ฐ ๋๋ค.
์ฌ์ ์์ผ๋ก ํ์ ๋, "fro"๋ก ์์ํ๋ 5๊ธ์ ๋จ์ด์ค์ ๊ฐ์ฅ ์ฒซ๋ฒ์งธ ๋จ์ด๋ "froaa"๊ฐ ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ์ฅ ๋ง์ง๋ง ๋จ์ด๋ "frozz"๊ฐ ๋ ๊ฒ์ด๋ค.
์ฐ๋ฆฌ๋ "froaa"์ "frozz" ์ฌ์ด์ ์๋ ๋จ์ด์ ๊ฐ์๋ฅผ ์ฐพ์์ฃผ๋ฉด ๋๋ค.
์ํ์ ์ upper_bound๋ฅผ ์ด์ฉํด์ "frozz"๋ณด๋ค ํฐ ๋ฌธ์์ ์ธ๋ฑ์ค๋ก ์ค์ ํ๋ค.
ํํ์ ์ lower_bound๋ฅผ ์ด์ฉํด์ ์ฒ์์ผ๋ก "froaa"๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ๋ฌธ์์ ์ธ๋ฑ์ค๋ก ์ค์ ํ๋ค.
์ํ์ ๊ณผ ํํ์ ์ฌ์ด์ ์๋ ๋ฌธ์๋ค์ด "fro??"๋ก ๊ฒ์๊ฐ๋ฅํ ๋จ์ด๋ค์ด๋ค.
ํค์๋๊ฐ "????o" ์ฒ๋ผ ๋ฌผ์ํ๋ก ์์ํ๋ ๊ฒฝ์ฐ์๋ ๋ง์ด ๋ฌ๋ผ์ง๋ค.
์์ ์์์ฒ๋ผ "aaaao"์ "zzzzo" ์ฌ์ด์ ์๋ ๋จ์ด๋ค์ด๋ผ๊ณ ํ๋ฉด
์กฐ๊ฑด์ ๋ง์ง์๋ "froze"์ ๊ฐ์ ๋จ์ด๋ ํฌํจ์ด ๋๋ค.
์ด ๊ฒฝ์ฐ์๋ ๋ชจ๋ ๋จ์ด์ ํค์๋๋ฅผ ๋ค์ง์ด์ ์์ ์์์ ๋๊ฐ์ด ๋๋๋ก ํ๋ค.
"o????"๋ก ๋ค์ง๊ณ ๋จ์ด๋ "kakao" -> "oakak", "frodo" -> "odorf" ๋ก ๋ค์ง์ผ๋ฉด
upper_bound, lower_bound๋ฅผ ์ด์ฉํด์ ์ํ์ ํํ์ ์ ์ก์ ์ ์๋ค.
์ด๋ ๋จ์ด๋ฅผ ๋ค์ง๋ ๊ฒ์ reverseํจ์๋ฅผ ์ด์ฉํ๋ฉด ๋๋ค.
์ด๋ฒ ๋ฌธ์ ๋ฅผ ํตํด์ reverse๋ผ๋ ํจ์๊ฐ ์๋ค๋ ๊ฒ์ ์ฒ์ ์๊ฒ๋์๋ค.
์ฝ๋ ์์ฑ
|
#include <bits/stdc++.h>
using namespace std;
bool cmp(const string& a, const string& b){
if(a.length() < b.length())
return true;
else if(a.length() == b.length()){
if(a < b)
return true;
}
return false;
}
vector<int> Find(vector<string> words, vector<string> reversed, vector<string> queries){
vector<int> ans;
for(auto key_word : queries){
if(key_word[0] == '?'){ //๋งจ ์์ ๋ฌผ์ํ
reverse(key_word.begin(), key_word.end());
string from = "";
string to = "";
for(int i = 0; i<key_word.length(); i++){
if(key_word[i] == '?'){
from += "a";
to += "z";
}
else{
from += key_word[i];
to += key_word[i];
}
}
ans.push_back(upper_bound(reversed.begin(), reversed.end(), to, cmp)
- lower_bound(reversed.begin(), reversed.end(), from, cmp));
}
else if(key_word[key_word.length() - 1] == '?'){
string from = "";
string to = "";
for(int i = 0; i<key_word.length(); i++){
if(key_word[i] == '?'){
from += "a";
to += "z";
}
else{
from += key_word[i];
to += key_word[i];
}
}
ans.push_back(upper_bound(words.begin(), words.end(), to, cmp)
- lower_bound(words.begin(), words.end(), from, cmp));
}
}
return ans;
}
vector<int> solution(vector<string> words, vector<string> queries) {
vector<int> answer;
vector<string> reversed(words);
for(int i = 0; i<reversed.size(); i++)
reverse(reversed[i].begin(), reversed[i].end());
sort(words.begin(), words.end(), cmp);
sort(reversed.begin(), reversed.end(), cmp);
answer = Find(words, reversed, queries);
return answer;
}
|
cs |
๋จ์ํ sortํจ์๋ฅผ ์ด์ฉํ๊ฒ๋๋ฉด ์ฌ์ ์์ผ๋ก๋ง ์ ๋ ฌํ๊ธฐ ๋๋ฌธ์ ๋ฌธ์์ด์ ๊ธธ์ด์ ์๊ด์์ด ์ฌ์ ์์ผ๋ก ์ ๋ ฌ์ด ๋๋ค.
๋น๊ตํจ์๋ฅผ ๋ฐ๋ก ์ ์ธ ํด์ฃผ์ด์ ๋ฌธ์์ด์ ๊ธธ์ด๊ฐ ๊ธด ๋ฌธ์์ด์ด ๋ฐ๋์ ๋ค๋ก ๊ฐ๋๋ก ํด์ค๋ค.
upper_bound์ lower_bound๋ฅผ ์ด๋ฐ์์ผ๋ก๋ ์ด์ฉํ ์ ์๋ค๋ ๊ฒ์ ํ ์ ๋ฐฐ์ ๋ค.
๋ฌผ์ํ๋ฅผ a์ z๋ก ์ ํํ๋ ์์ด๋์ด๋ ๋๋ฌด ๊ธฐ๋ฐํ๋ค.
'ํ๋ก๊ทธ๋๋จธ์ค > 4๋จ๊ณ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค Lv4] : ๋ฌด์ง์ ๋จน๋ฐฉ ๋ผ์ด๋ธ (0) | 2022.07.13 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค Lv4] : ๋จ์ด ํผ์ฆ (0) | 2022.07.11 |
[ํ๋ก๊ทธ๋๋จธ์ค Lv4] : ์งํ ์ด๋ (0) | 2022.07.11 |
[ํ๋ก๊ทธ๋๋จธ์ค Lv4] : ๋๋์ง (0) | 2022.06.29 |
[ํ๋ก๊ทธ๋๋จธ์ค Lv4] : ์ง๊ฒ๋ค๋ฆฌ (0) | 2022.06.21 |