처음 for문을 돌면서 id에 매칭되는 최종 닉네임을 구했고.
두번째 for문을 돌면서 enter, leave에 대한 문자열을 생성했다.
map을 사용하여 id에 대한 중복검사를 안해도 되지만..
C++ map 사용법이 익숙하지 않아서... hash를 사용했다.
hash 함수는 소문자 or 대문자 문자열만 있었다면 27법을 사용했겠지만..
대소문자+숫자까지 있기때문에 대충 곱하기로 구했다.
해쉬 함수는 큰 의미가 있지 않으니, 참고하지 않았으면 좋겠다.
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 | #include <iostream> #include <string> #include <string.h> #include <vector> #include <sstream> #define HASH_TABLE_MAX 3000 using namespace std; char* parseStr[100000][3]; struct _user { char *id; char *nickname; }; _user user[100000]; vector<int> hashTable[HASH_TABLE_MAX]; int getHash(char* name) { unsigned int hash = 31; for (int i = 0; name[i]; i++) { hash *= name[i]; } return hash % HASH_TABLE_MAX; } int userCnt = 0; int add(char* id, char* nickname) { int hashValue = getHash(id); for (int i = 0; i < hashTable[hashValue].size(); i++) { int idx = hashTable[hashValue][i]; if (strcmp(user[idx].id, id) == 0) { user[idx].nickname = nickname; return idx; } } user[userCnt].id = id; hashTable[hashValue].push_back(userCnt); user[userCnt].nickname = nickname; userCnt++; return userCnt - 1; } int get(char* id) { int hashValue = getHash(id); for (int i = 0; i < hashTable[hashValue].size(); i++) { int idx = hashTable[hashValue][i]; if (strcmp(user[idx].id, id) == 0) { return idx; } } } vector<string> solution(vector<string> record) { vector<string> answer; int actionCnt = record.size(); for (int i = 0; i < actionCnt; i++) { int strIdx = 0; parseStr[i][strIdx] = &record[i][strIdx]; strIdx++; for (int j = 0; record[i][j]; j++) { if (record[i][j] == ' ') { record[i][j] = 0; parseStr[i][strIdx] = &record[i][j + 1]; strIdx++; } } if (*parseStr[i][0] == 'E') { add(parseStr[i][1], parseStr[i][2]); } else if (*parseStr[i][0] == 'C') { add(parseStr[i][1], parseStr[i][2]); } //printf("%s %s %s\n", parseStr[i][0], parseStr[i][1], parseStr[i][2]); } for (int i = 0; i < actionCnt; i++) { if (*parseStr[i][0] == 'E') { int idx = get(parseStr[i][1]); answer.push_back(string(user[idx].nickname) + "님이 들어왔습니다."); } else if (*parseStr[i][0] == 'L') { int idx = get(parseStr[i][1]); answer.push_back(string(user[idx].nickname) + "님이 나갔습니다."); } } return answer; } | cs |