일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 카카오
- 프로그래머스
- c++
- 2018 KAKAO BLIND RECRUITMENT
- 자바
- 2019 카카오 개발자 겨울 인턴십 코딩테스트
- 삼성 SW 기출문제
- 카카오 공채
- 2019 KAKAO BLIND RECRUITMENT
- 2019 카카오 공채
- bfs
- 2018 카카오 공채
- 부스트코스
- gradle
- CS 스터디
- set
- 삼성 SW 역량테스트
- dfs
- 알고리즘
- Java
- Baekjoon
- 2018 카카오
- 백준
- 2020 KAKAO BLIND RECRUITMENT
- gcp
- 2020 카카오 공채
- 2018 KAKAO BLIND RECRUITMENT 1차
- 젠킨스
- 비트마스크
- map
Archives
- Today
- Total
아무코딩
[2020 KAKAO BLIND RECRUITMENT] 가사 검색 본문
문제풀이
트라이를 이용한 문제이다.
실제 공채때는 이렇게 풀지 못해서 많이 효율성 부분에서 점수가 많이 깎였었다.
특이한 점은 ?가 있다는 점인데 트라이를 이용하기 좋게 접미사나 접두사로만 물음표가 주어진다.
자리수 별, 앞뒤 별 트라이 구조를 모두 만들어서 ?가 나오자마자 카운트를 반환하게 한다.
끝의 ?유무를 확인하여 reverse한 트라이를 쓸지 그냥 쓸지 정하면 된다.
소스코드
더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
#include <string>
#include <vector>
#include <string.h>
#include <algorithm>
using namespace std;
typedef struct Trie* TriePointer;
typedef struct Trie{
TriePointer next[26];
int count;
bool finish;
Trie(){
finish = false;
count = 1;
memset(next,0,sizeof(next));
}
~Trie(){
}
void insert(const char* key){//삽입시 finish처리, 카운트처리
if(*key == '\0') //입력끝일때
finish = true;
else{
int curr = *key - 'a';
if(next[curr]==NULL){
next[curr] = new Trie();
}
else{
next[curr]->count++;
}
next[curr]->insert(key+1);
}
}
int find(const char* key){
int curr = *key -'a';
if(*key == '?'){ //물음표 나오면 아래 가지에있는 카운트 다더하면됨.
int temp = 0;
for(int k=0;k<26;k++){
if(next[k]!=NULL){
temp += next[k]->count;
}
}
return temp;
}
if(next[curr] == NULL)return 0;
if(*(key+1)=='?') return next[curr]->count;
return next[curr]->find(key+1);
}
}Trie;
//글자수 별로 다로 저장한다.
TriePointer root[10001];
TriePointer reroot[10001];
vector<int> solution(vector<string> words, vector<string> queries) {
vector<int> answer;
answer.assign(queries.size(), 0);
for(int i=0;i<words.size();i++){
string word = words[i];
int size = word.size();
const char *c = word.c_str();
if(root[size]==NULL)
root[size] = new Trie();
root[size]->insert(c);
string reversed_string = word;
reverse(reversed_string.begin(), reversed_string.end());
const char *k = reversed_string.c_str();
if(reroot[size]==NULL)reroot[size] = new Trie();
reroot[size]->insert(k);
}
int idx = 0;
for(int i=0;i<queries.size();i++){
string query = queries[i];
int size = query.size();
if(query[size-1]=='?'){ //끝이 물음표일때
const char *c = query.c_str();
if(root[size] == NULL){
idx++;
continue;
}
else{
answer[idx] = root[size]->find(c);
}
}
else{
string re = query;
reverse(re.begin(),re.end());
const char *k = re.c_str();
if(reroot[size] ==NULL){
idx++;
continue;
}
else{
answer[idx]= reroot[size]->find(k);
}
}
idx++;
}
return answer;
}
|
cs |
문제 링크 : www.programmers.co.kr/learn/courses/30/lessons/60060
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[Summer/Winter Coding(~2018)] 스킬트리 (java) (0) | 2020.05.30 |
---|---|
[프로그래머스] 줄 서는 방법 (0) | 2020.05.14 |
[2019 KAKAO BLIND RECRUITMENT] 무지의 먹방 라이브 (0) | 2020.05.08 |
[2019 KAKAO BLIND RECRUITMENT] 후보키 (0) | 2020.05.07 |
[2019 KAKAO BLIND RECRUITMENT] 실패율 (0) | 2020.05.07 |
Comments