짬뽕얼큰하게의 맨땅에 헤딩 :: '오픈채팅방' 태그의 글 목록

'오픈채팅방'에 해당되는 글 1건

처음 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
블로그 이미지

짬뽕얼큰하게

,