forked from gyoogle/tech-interview-for-developer
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
gyusuk
committed
Aug 3, 2019
1 parent
d47a4c8
commit 40099a2
Showing
1 changed file
with
332 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,332 @@ | ||
# Hash Table ๊ตฌํํ๊ธฐ | ||
|
||
> ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ฅผ ํ๊ธฐ์ํด ํ์์ ์ผ๋ก ์์์ผ ํ ๊ฐ๋ | ||
๋ธ๋ฃจํธ ํฌ์ค(์์ ํ์)์ผ๋ก๋ ์๊ฐ์ด๊ณผ์ ๋น ์ง๊ฒ ๋๋ ๋ฌธ์ ์์๋ ํด์๋ฅผ ์ ์ฉ์์ผ์ผ ํ๋ค. | ||
|
||
<br> | ||
|
||
[์ฐ์ต ๋ฌธ์ ๋งํฌ](<https://codeforces.com/contest/4/problem/C>) | ||
|
||
<br> | ||
|
||
N(1~100000)์ ๊ฐ๋งํผ ๋ฌธ์์ด์ด ์ ๋ ฅ๋๋ค. | ||
|
||
์ฒ์ ์ ๋ ฅ๋๋ ๋ฌธ์์ด์ "OK", ๋ค์ด์จ ์ ์ด ์๋ ๋ฌธ์์ด์ "๋ฌธ์์ด+index"๋ก ์ถ๋ ฅํ๋ฉด ๋๋ค. | ||
|
||
ex) | ||
|
||
##### Input | ||
|
||
``` | ||
5 | ||
abcd | ||
abc | ||
abcd | ||
abcd | ||
ab | ||
``` | ||
|
||
##### Output | ||
|
||
``` | ||
OK | ||
OK | ||
abcd1 | ||
abcd2 | ||
OK | ||
``` | ||
|
||
<br> | ||
|
||
๋ฌธ์ ๋ฅผ ์ดํดํ๋ ๊ฑด ์ฝ๋ค. ๋๊ฐ์ ๋ฌธ์์ด์ด ๋ค์ด์๋์ง ์ฒดํฌํด๋ณด๊ณ , ๋ค์ด์จ ๋ฌธ์์ด์ ์ธ๋ฑ์ค ๋ฒํธ๋ฅผ ๋ถ์ฌํด์ ์ถ๋ ฅํด์ฃผ๋ฉด ๋๋ค. | ||
|
||
<br> | ||
|
||
ํ์ง๋ง, ํ์ฌ N๊ฐ์ ์ต๋ 10๋ง์ด๋ค. ๋ธ๋ฃจํธ ํฌ์ค๋ก ์ ๊ทผํ๋ฉด N^2์ด ๋๋ฏ๋ก 100์ต๋ฒ์ ์ฐ์ฐ์ด ํ์ํด์ ์๊ฐ์ด๊ณผ์ ๋น ์ง ๊ฒ์ด๋ค. ๋ฐ๋ผ์ **'ํด์ ํ ์ด๋ธ'**์ ์ด์ฉํด ํด๊ฒฐํด์ผ ํ๋ค. | ||
|
||
<br> | ||
|
||
์ ๋ ฅ๋ ๋ฌธ์์ด ๊ฐ์ ํด์ ํค๋ก ๋ณํ์์ผ ์ ์ฅํ๋ฉด์ ์ต๋ํ ์๊ฐ์ ์ค์ฌ๋๊ฐ๋๋ก ๊ตฌํํด์ผ ํ๋ค. | ||
|
||
์ด ๋ฌธ์ ๋ ํด์ ํ ์ด๋ธ์ ์๊ณ ๋ฆฌ์ฆ์์ ์ ์ฉ์์ผ๋ณด๊ธฐ ์ํด ์ฐ์ตํ๊ธฐ์ ์์ฃผ ์ข์ ๋ฌธ์ ๊ฐ๋ค. ํนํ ์ผ์ฑ ์์ SW์ญ๋ํ ์คํธ Bํ์ ์ค๋นํ๋ ์ฌ๋๋ค์๊ฒ ์ถ์ฒํ๊ณ ์ถ์ ๋ฌธ์ ๋ค. ํด์ ํ ์ด๋ธ ๊ตฌํ์ ์ฐ์ตํ๊ธฐ ๋ฑ ์ข๋ค. | ||
|
||
<br> | ||
|
||
<br> | ||
|
||
#### **ํด์ ํ ์ด๋ธ ๊ตฌํ** | ||
|
||
ํด์ ํ ์ด๋ธ์ ํ์์ ์ต๋ํ ์ค์ฌ์ฃผ๊ธฐ ์ํด, input์ ๋ํ key ๊ฐ์ ์ป์ด๋ด์ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ด๋ค. | ||
|
||
ํ์ฌ ์ต๋ N ๊ฐ์ 10๋ง์ด๋ค. ์ด์ฐจ์ ๋ฐฐ์ด๋ก 1000/100์ผ๋ก ๋๋์ด ๊ด๋ฆฌํ๋ฉด, ๋ ํจ์จ์ ์ผ ๊ฒ์ด๋ค. | ||
|
||
์ถฉ๋ ๊ฐ์ด ๋ค์ด์ค๋ ๊ฒ์ ๊ฐ์ํด ์ต๋ํ ๊ณ ๋ คํด์, ๋๋ ๋๋ฒ์งธ ๋ฐฐ์ด ๊ฐ์ 4๋ฅผ ๊ณฑํด์ ์ ์ธํ๋ค. | ||
|
||
<br> | ||
|
||
``` | ||
key ๊ฐ์ ์ป์ด์ ์ ์ฅํ ๋, ์๋ก๋ค๋ฅธ ๋ฌธ์์ด์ด๋ผ๋ ๊ฐ์ key ๊ฐ์ผ๋ก ๋ค์ด์ฌ ์ ์๋ค. | ||
(์ด๊ฒ์ด ํด์์ ๋ํ ์ด๋ก ์ ๋ฐฐ์ธ ๋ ๋์ค๋ ์ถฉ๋ ํ์์ด๋ค.) | ||
์ถฉ๋์ด ์ผ์ด๋๋ ๊ฒ์ ์ต๋ํ ํผํด์ผํ์ง๋ง, ๋ฌด์กฐ๊ฑด ํผํ ์ ์๋ค๋ ๋ณด์ฅ์ ์๋ค. ๊ทธ๋์ ๋๋ฒ์งธ ๋ฐฐ์ด ๊ฐ์ ์กฐ๊ธ ๋๋ํ ์ ์ธํด๋๋ ๊ฒ์ด๋ค. | ||
``` | ||
|
||
์ด๋ฅผ ๊ณ ๋ คํด final ๊ฐ์ผ๋ก ์ ์ธํ ํด์ ๊ฐ์ ์๋์ ๊ฐ๋ค. | ||
|
||
```java | ||
static final int HASH_SIZE = 1000; | ||
static final int HASH_LEN = 400; | ||
static final int HASH_VAL = 17; // ์์๋ก ํ ๊ฒ | ||
``` | ||
|
||
HASH_VAL ๊ฐ์ ์ฐ๋ฆฌ๊ฐ input ๊ฐ์ ๋ฐ์์ ๋ ํด๋นํ๋ key ๊ฐ์ ์ป์ ๋ ํ์ฉํ๋ค. | ||
|
||
์ต๋ํ input ๊ฐ๋ค๋ง๋ค key ๊ฐ์ด ๊ฒน์น์ง ์๊ธฐ ์ํด ํ๊ธฐ ์ํด์๋ ์์๋ก ์ ์ธํด์ผํ๋ค. (๊ทธ๋์ ๋ณดํต 17, 19, 23์ผ๋ก ์ ์ธํ๋ ๊ฒ ๊ฐ๋ค.) | ||
|
||
<br> | ||
|
||
key ๊ฐ์ ์ป๋ ๋ฉ์๋ ๊ตฌํ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค. ( ๊ฐ์ ์ฌ๋๋ง๋ค ๋ค๋ฅด๋ฏ๋ก ๊ผญ ์ด๊ฒ ์ ๋ต์ ์๋๋ค ) | ||
|
||
```java | ||
public static int getHashKey(String str) { | ||
|
||
int key = 0; | ||
|
||
for (int i = 0; i < str.length(); i++) { | ||
key = (key * HASH_VAL) + str.charAt(i); | ||
} | ||
|
||
if(key < 0) key = -key; // ๋ง์ฝ key ๊ฐ์ด ์์๋ฉด ์์๋ก ๋ฐ๊ฟ์ฃผ๊ธฐ | ||
|
||
return key % HASH_SIZE; | ||
|
||
} | ||
``` | ||
|
||
input ๊ฐ์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๋๋ค. ๋ง์ฝ string ๊ฐ์ผ๋ก ๋ค์ด์จ๋ค๊ณ ๊ฐ์ ํด๋ณด์. | ||
|
||
string ๊ฐ์ ํ๊ธ์(character)๋ง๋ค intํ ๊ฐ์ ์ป์ด๋ผ ์ ์๋ค. ์ด๋ฅผ ํ์ฉํด string ๊ฐ์ length๋งํผ ๋ฐ๋ณต๋ฌธ์ ๋๋ฉด์, ๊ทธ ๋ฌธ์์ด๋ง์ key ๊ฐ์ ๋ง๋ค์ด๋ด๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค. | ||
|
||
์ฐ๋ฆฌ๋ ์ด key ๊ฐ์ ๋ฐฐ์ด ์ธ๋ฑ์ค๋ก ํ์ฉํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์์๋ฉด ์๋๋ค. ๋ง์ฝ key ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ์์๋ฉด ์์๋ก ๋ฐ๊ฟ์ฃผ๋ ์กฐ๊ฑด๋ฌธ์ด ํ์ํ๋ค. | ||
|
||
<br> | ||
|
||
๋ง์ง๋ง์ผ๋ก return ๊ฐ์ผ๋ก key๋ฅผ ์ฐ๋ฆฌ๊ฐ ์ ์ธํ HASH_SIZE๋ก ๋๋ ๋๋จธ์ง ๊ฐ์ ์ป๋๋ก ํ๋ค. | ||
|
||
ํ์ฌ ๊ณ์ฐ๋ key ๊ฐ์ ๋งค์ฐ ํฌ๊ธฐ ๋๋ฌธ์ HASH_SIZE๋ก ๋๋ ๋๋จธ์ง ๊ฐ์ผ๋ก key๋ฅผ ํ์ฉํ ๊ฒ์ด๋ค. (์ด ๋๋ฌธ์ ๋ฐ์ดํฐ๊ฐ ๋ง์ผ๋ฉด ๋ง์์๋ก ์ถฉ๋๋๋ key๊ฐ์ด ์กด์ฌํ ์ ๋ฐ์ ์๋ค. - ์ฐ๋ฆฌ๋ ์ต๋ํ ์ถฉ๋์ ์ค์ด๋ฉด์ ์ต์ ํ์ํค๊ธฐ ์ํ ๊ฒ..!) | ||
|
||
<br> | ||
|
||
์ด์ ์ฐ๋ฆฌ๋ input์ผ๋ก ๋ฐ์ string ๊ฐ์ key ๊ฐ์ ์ป์๋ค. | ||
|
||
ํด๋น key ๊ฐ์ ๋ฐฐ์ด์์ ์ด ๊ฐ์ด ๋ค์ด์จ ์ ์ด ์๋์ง ํ์ธํ๋ ๊ณผ์ ์ด ํ์ํ๋ค. | ||
|
||
<br> | ||
|
||
์ด์ ์ฐ๋ฆฌ๋ ๋ชจ๋ ๊ณณ์ ํ์ํ ํ์์์ด, ์ด key์ ํด๋นํ๋ ๋ฐฐ์ด์์๋ง ํ์ธํ๋ฉด ๋๋ฏ๋ก ์๊ฐ์ด ์~~์ฒญ ์ ์ฝ๋๋ค. | ||
|
||
<br> | ||
|
||
```java | ||
static int[][] data = new int[HASH_SIZE][HASH_LEN]; | ||
|
||
string str = "apple"; | ||
|
||
int key = getHashKey(str); // apple์ ๋ํ key ๊ฐ ์ป์ | ||
|
||
data[key][index]; // ์ด๊ณณ์ apple์ ์ ์ฅํด์ ๊ด๋ฆฌํ๋ฉด ์ฐพ๋ ์๊ฐ์ ์ค์ผ ์ ์๋ ๊ฒ | ||
``` | ||
|
||
์ฌ๊ธฐ์ HASH_SIZE๊ฐ 1000์ด์๊ณ , ์ฐ๋ฆฌ๊ฐ key ๊ฐ์ ๋ฆฌํดํ ๋ 1000์ผ๋ก ๋๋ ๋๋จธ์ง๋ก ์ ์ฅํ์ผ๋ฏ๋ก ์ด ์์์๋ง key ๊ฐ์ด ๋ค์ด์ค๊ฒ ๋๋ค๋ ๊ฒ์ ์ดํดํ ์ ์๋ค. | ||
|
||
<br> | ||
|
||
ArrayList๋ก 2์ฐจ์๋ฐฐ์ด์ ๊ด๋ฆฌํ๋ฉด, ๊ทธ๋ฅ ๊ณ์ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ฏ๋ก ๊ตฌํ์ด ๊ฐํธํ๋ค. | ||
|
||
ํ์ง๋ง ์ผ์ฑ sw ์ญ๋ํ ์คํธ Bํ์ฒ๋ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ์๋, ๋ฐฐ์ด๋ก ์ ์ธํด์ ์ถ๊ฐํด๋๊ฐ์ผ ํ๋ค. ๋ํ ArrayList ํ์ฉ๋ณด๋ค ๋ฐฐ์ด์ด ํจ์ฌ ์๊ฐ์ ์ค์ผ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋๋ก์ด๋ฉด ๋ฐฐ์ด์ ์ด์ฉํ๋๋ก ํ์ | ||
|
||
<br> | ||
|
||
์ฌ๊ธฐ์ ๋์ ์๋๋ค. ์ด์ ์ฐ๋ฆฌ๋ ๋จ์ํ key ๊ฐ๋ง ๋ฐ์์จ ๊ฒ ๋ฟ์ด๋ค. | ||
|
||
ํด๋น key ๋ฐฐ์ด์์, apple์ด ๋ค์ด์จ์ ์ด ์๋์ง ์๋์ง ์ฒดํฌํด์ผํ๋ค. (๋ฌธ์ ์์ ๋ค์ด์จ์ ์๋๊ฑด ์ซ์๋ฅผ ๋ถ์ฌ์ ์ถ๋ ฅํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.) | ||
|
||
<br> | ||
|
||
๋ฐ์ดํฐ์ ์๊ฐ ๋ง์ผ๋ฉด key ๋ฐฐ์ด ์์์ ๋ค๋ฅธ ๋ฌธ์์ด์ด๋ผ๋ ๊ฐ์ key๋ก ์ ์ฅ๋๋ ๊ฐ๋ค์ด ์กด์ฌํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ํด๋น key ๋ฐฐ์ด์ ๋๋ฉด์ apple๊ณผ ์ผ์นํ๋ ๋ฌธ์์ด์ด ์๋์ง ํ์ธํ๋ ๊ณผ์ ์ด ํ์ํ๋ค. | ||
|
||
<br> | ||
|
||
๋ฐ๋ผ์ key ๊ฐ์ ๋งค๊ฐ๋ณ์๋ก ๋ฃ๊ณ ๋ฌธ์์ด์ด ๋ค์ด์๋ ์ ์ด ์๋์ง ์ฒดํฌํ๋ ํจ์๋ฅผ ๊ตฌํํ์ | ||
|
||
```java | ||
public static int checking(int key) { | ||
|
||
int len = length[key]; // ํ์ฌ key์ ๋ด๊ธด ์ (๊ฐ์ key ๊ฐ์ผ๋ก ๋ค์ด์ค๋ ๋ฌธ์์ด์ด ์์ ์ ์๋ค) | ||
|
||
if(len != 0) { // ์ด๋ฏธ ๋ค์ด์จ ์ ์์ | ||
|
||
for (int i = 0; i < len; i++) { // ์ด๋ฏธ ๋ค์ด์จ ๋ฌธ์์ด์ด ํด๋น key ๋ฐฐ์ด์ ์๋์ง ํ์ธ | ||
if(str.equals(s_data[key][i])) { | ||
data[key][i]++; | ||
return data[key][i]; | ||
} | ||
} | ||
|
||
} | ||
|
||
// ๋ค์ด์จ ์ ์ด ์์์ผ๋ฉด ํด๋น key๋ฐฐ์ด์์ ๋ฌธ์์ด์ ์ ์ฅํ๊ณ ๊ธธ์ด 1 ๋๋ฆฌ๊ธฐ | ||
s_data[key][length[key]++] = str; | ||
|
||
return -1; // ์ฒ์์ผ๋ก ๋ค์ด๊ฐ๋ ๊ฒฝ์ฐ -1 ๋ฆฌํด | ||
} | ||
``` | ||
|
||
length[] ๋ฐฐ์ด์ HASH_SIZE๋งํผ ์ ์ธ๋ ๊ฒ์ผ๋ก, key ๊ฐ์ ์ป์ ํ, ์ฒ์ ๋ค์ด์จ ๋ฌธ์์ด์ผ ๋๋ง๋ค ์ซ์๋ฅผ 1์ฉ ๋๋ ค์ ํด๋น key ๋ฐฐ์ด์ ๋ช๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋์ด์๋์ง ํ์ธํ๋ ๊ณต๊ฐ์ด๋ค. | ||
|
||
<br> | ||
|
||
**์ฐ๋ฆฌ๊ฐ ์ถ๋ ฅํด์ผํ๋ ์กฐ๊ฑด์ ์ฒ์ ๋ค์ด์จ๊ฑด "OK" ๋ค์ ๋ ๋ค์ด์จ๊ฑด "data + ๋ค์ด์จ ์"์๋ค.** | ||
|
||
<br> | ||
|
||
- "OK"๋ก ์ถ๋ ฅํด์ผ ํ๋ ์กฐ๊ฑด | ||
|
||
> ํด๋น key์ ๋ฐฐ์ด length๊ฐ 0์ผ ๋๋ ๋ฌด์กฐ๊ฑด ์ฒ์ ๋ค์ด์ค๋ ๋ฐ์ดํฐ๋ค. | ||
> | ||
> ๋ํ 1์ด์์ผ ๋, ๊ทธ key ๋ฐฐ์ด ์์์ ๋ง์ฝ apple์ ์ฐพ์ง ๋ชปํ๋ค๋ฉด ์ด ๋ํ ์ฒ์ ๋ค์ด์ค๋ ๋ฐ์ดํฐ๋ค. | ||
<br> | ||
|
||
- "data + ๋ค์ด์จ ์"๋ก ์ถ๋ ฅํด์ผ ํ๋ ์กฐ๊ฑด | ||
|
||
> ๋ง์ฝ 1์ด์์ผ ๋ key ๋ฐฐ์ด์์ apple ๊ฐ์ ์ฐพ์๋ค๋ฉด ์ด์ 'apple+๋ค์ด์จ ์'๋ฅผ ์ถ๋ ฅํ๋๋ก ๊ตฌํํด์ผํ๋ค. | ||
<br> | ||
|
||
๊ทธ๋์ ๋๋ 3๊ฐ์ ๋ฐฐ์ด์ ์ ์ธํด์ ํ์ฉํ๋ค. | ||
|
||
```java | ||
static int[][] data = new int[HASH_SIZE][HASH_LEN]; | ||
static int[] length = new int[HASH_SIZE]; | ||
static String[][] s_data = new String[HASH_SIZE][HASH_LEN]; | ||
``` | ||
|
||
data[][] ๋ฐฐ์ด : input์ผ๋ก ๋ฐ๋ ๋ฌธ์์ด์ด ๋ค์ด์จ ์๋ฅผ ์ ์ฅํ๋ ๊ณณ | ||
|
||
length[] ๋ฐฐ์ด : key ๊ฐ๋ง๋ค ๋ค์ด์จ ์๋ฅผ ์ ์ฅํ๋ ๊ณณ | ||
|
||
s_data[][] ๋ฐฐ์ด : input์ผ๋ก ๋ฐ์ ๋ฌธ์์ด์ ์ ์ฅํ๋ ๊ณณ | ||
|
||
<br> | ||
|
||
์งํ ๊ณผ์ ์ ์ค๋ช ํ๋ฉด ์๋์ ๊ฐ๋ค. (apple - banana - abc - abc ์์ผ๋ก ์ ๋ ฅ๋๊ณ , apple๊ณผ abc์ key๊ฐ์ 5๋ก ๊ฐ๋ค๊ณ ๊ฐ์ ํ๊ฒ ๋ค.) | ||
|
||
<br> | ||
|
||
``` | ||
1. apple์ด ๋ค์ด์ด. key ๊ฐ์ ์ป์ผ๋ 5๊ฐ ๋์ด. length[5]๋ 0์ด๋ฏ๋ก ์ฒ์ ๋ค์ด์จ ๋ฐ์ดํฐ์. length[5]++ํ๊ณ "OK"์ถ๋ ฅ | ||
2. banana๊ฐ ๋ค์ด์ด. key ๊ฐ์ ์ป์ผ๋ 3์ด ๋์ด. length[3]์ 0์ด๋ฏ๋ก ์ฒ์ ๋ค์ด์จ ๋ฐ์ดํฐ์. length[3]++ํ๊ณ "OK"์ถ๋ ฅ | ||
<< ์ค์ >> | ||
3. abc๊ฐ ๋ค์ด์ด. key ๊ฐ์ ์ป์ผ๋ 5๊ฐ ๋์ด. length[5]๋ 0์ด ์๋. ํด๋น key ๊ฐ์ ๋๊ฐ ๋ค์ด์จ์ ์ด ์์. | ||
length[5]๋งํผ ๋ฐ๋ณต๋ฌธ์ ๋๋ฉด์ s_data[key]์ ๋ฐฐ์ด๊ณผ abc๊ฐ ์ผ์นํ๋ ๊ฐ์ด ์๋์ง ํ์ธํจ. ํ์ฌ length[5]๋ 1์ด๊ณ , s_data[key][0] = "apple"์ด๋ฏ๋ก ์ผ์นํ๋ ๊ฐ์ด ์๊ธฐ ๋๋ฌธ์ length[5]๋ฅผ 1 ์ฆ๊ฐ์ํค๊ณ s_data[key][length[5]]์ abc๋ฅผ ๋ฃ๊ณ "OK"์ถ๋ ฅ | ||
<< ์ค์ >> | ||
4. abc๊ฐ ๋ค์ด์ด. key ๊ฐ์ ์ป์ผ๋ 5๊ฐ ๋์ด. length[5] = 2์. | ||
s_data[key]๋ฅผ 2๋งํผ ๋ฐ๋ณต๋ฌธ์ ๋๋ฉด์ abc๊ฐ ์๋์ง ์ฐพ์. 1๋ฒ์งธ ์ธ๋ฑ์ค ๊ฐ์๋ apple์ด ์ ์ฅ๋์ด ์๊ณ 2๋ฒ์งธ ์ธ๋ฑ์ค ๊ฐ์์ abc๊ฐ ์ผ์นํจ์ ์ฐพ์์!! | ||
๋ฐ๋ผ์ ํด๋น data[key][index] ๊ฐ์ 1 ์ฆ๊ฐ์ํค๊ณ ์ด ๊ฐ์ return ํด์ฃผ๋ฉด์ ๋ฉ์๋๋ฅผ ๋๋ | ||
โ ๋ฉ์ธํจ์์์ input์ผ๋ก ๋ค์ด์จ abc ๊ฐ๊ณผ ๋ฆฌํด๊ฐ์ผ๋ก ๋์จ 1์ ๋ถ์ฌ์ ์ถ๋ ฅํด์ฃผ๋ฉด ๋จ (abc1) | ||
``` | ||
|
||
<br> | ||
|
||
์งํ๊ณผ์ ์ ํตํด ์ด๋ค ๋ฐฉ์์ผ๋ก ๊ตฌํ๋๋์ง ์ถฉ๋ถํ ์ดํดํ ์ ์์ ๊ฒ์ด๋ค. | ||
|
||
<br> | ||
|
||
#### ์ ์ฒด ์์ค์ฝ๋ | ||
|
||
```java | ||
package CodeForces; | ||
|
||
import java.io.BufferedReader; | ||
import java.io.InputStreamReader; | ||
|
||
public class Solution { | ||
|
||
static final int HASH_SIZE = 1000; | ||
static final int HASH_LEN = 400; | ||
static final int HASH_VAL = 17; // ์์๋ก ํ ๊ฒ | ||
|
||
static int[][] data = new int[HASH_SIZE][HASH_LEN]; | ||
static int[] length = new int[HASH_SIZE]; | ||
static String[][] s_data = new String[HASH_SIZE][HASH_LEN]; | ||
static String str; | ||
static int N; | ||
|
||
public static void main(String[] args) throws Exception { | ||
|
||
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); | ||
StringBuilder sb = new StringBuilder(); | ||
|
||
N = Integer.parseInt(br.readLine()); // ์ ๋ ฅ ์ (1~100000) | ||
|
||
for (int i = 0; i < N; i++) { | ||
|
||
str = br.readLine(); | ||
|
||
int key = getHashKey(str); | ||
int cnt = checking(key); | ||
|
||
if(cnt != -1) { // ์ด๋ฏธ ๋ค์ด์๋ ๋ฌธ์์ด | ||
sb.append(str).append(cnt).append("\n"); | ||
} | ||
else sb.append("OK").append("\n"); | ||
} | ||
|
||
System.out.println(sb.toString()); | ||
} | ||
|
||
public static int getHashKey(String str) { | ||
|
||
int key = 0; | ||
|
||
for (int i = 0; i < str.length(); i++) { | ||
key = (key * HASH_VAL) + str.charAt(i) + HASH_VAL; | ||
} | ||
|
||
if(key < 0) key = -key; // ๋ง์ฝ key ๊ฐ์ด ์์๋ฉด ์์๋ก ๋ฐ๊ฟ์ฃผ๊ธฐ | ||
|
||
return key % HASH_SIZE; | ||
|
||
} | ||
|
||
public static int checking(int key) { | ||
|
||
int len = length[key]; // ํ์ฌ key์ ๋ด๊ธด ์ (๊ฐ์ key ๊ฐ์ผ๋ก ๋ค์ด์ค๋ ๋ฌธ์์ด์ด ์์ ์ ์๋ค) | ||
|
||
if(len != 0) { // ์ด๋ฏธ ๋ค์ด์จ ์ ์์ | ||
|
||
for (int i = 0; i < len; i++) { // ์ด๋ฏธ ๋ค์ด์จ ๋ฌธ์์ด์ด ํด๋น key ๋ฐฐ์ด์ ์๋์ง ํ์ธ | ||
if(str.equals(s_data[key][i])) { | ||
data[key][i]++; | ||
return data[key][i]; | ||
} | ||
} | ||
|
||
} | ||
|
||
// ๋ค์ด์จ ์ ์ด ์์์ผ๋ฉด ํด๋น key๋ฐฐ์ด์์ ๋ฌธ์์ด์ ์ ์ฅํ๊ณ ๊ธธ์ด 1 ๋๋ฆฌ๊ธฐ | ||
s_data[key][length[key]++] = str; | ||
|
||
return -1; // ์ฒ์์ผ๋ก ๋ค์ด๊ฐ๋ ๊ฒฝ์ฐ -1 ๋ฆฌํด | ||
} | ||
|
||
} | ||
``` | ||
|