Skip to content

Commit

Permalink
add Hash Table
Browse files Browse the repository at this point in the history
  • Loading branch information
gyusuk committed Aug 3, 2019
1 parent d47a4c8 commit 40099a2
Showing 1 changed file with 332 additions and 0 deletions.
332 changes: 332 additions & 0 deletions Algorithm/Hash Table ๊ตฌํ˜„ํ•˜๊ธฐ.md
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 ๋ฆฌํ„ด
}

}
```

0 comments on commit 40099a2

Please sign in to comment.