ํ๋ก๊ทธ๋๋จธ์ค
์ฝ๋ ์ค์ฌ์ ๊ฐ๋ฐ์ ์ฑ์ฉ. ์คํ ๊ธฐ๋ฐ์ ํฌ์ง์ ๋งค์นญ. ํ๋ก๊ทธ๋๋จธ์ค์ ๊ฐ๋ฐ์ ๋ง์ถคํ ํ๋กํ์ ๋ฑ๋กํ๊ณ , ๋์ ๊ธฐ์ ๊ถํฉ์ด ์ ๋ง๋ ๊ธฐ์ ๋ค์ ๋งค์นญ ๋ฐ์ผ์ธ์.
programmers.co.kr
ํ๋ก๊ทธ๋๋จธ์ค์ ํ๋ณดํค ๋ฌธ์ ์ ๋๋ค.
2๋ ๋ฒจ ๋ฌธ์ ์์.
๋ง๋งํ ๋ดค๋ค๊ฐ ๋ธ๋ก๊ทธ์ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๋ง๋ค๊ฒ ๋์์ต๋๋ค.
ํ...
๋ฌธ์ ์ค๋ช
ํ๋ ์ฆ๋ํ๊ต ์ปดํจํฐ๊ณตํ๊ณผ ์กฐ๊ต์ธ ์ ์ด์ง๋ ๋ค์ค ํ๊ณผ์ฅ๋์ ์ง์๋ก, ํ์๋ค์ ์ธ์ ์ฌํญ์ ์ ๋ฆฌํ๋ ์ ๋ฌด๋ฅผ ๋ด๋นํ๊ฒ ๋์๋ค.
๊ทธ์ ํ๋ถ ์์ ํ๋ก๊ทธ๋๋ฐ ๊ฒฝํ์ ๋์ด๋ ค, ๋ชจ๋ ์ธ์ ์ฌํญ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฃ๊ธฐ๋ก ํ์๊ณ , ์ด๋ฅผ ์ํด ์ ๋ฆฌ๋ฅผ ํ๋ ์ค์ ํ๋ณดํค(Candidate Key)์ ๋ํ ๊ณ ๋ฏผ์ด ํ์ํ๊ฒ ๋์๋ค.
ํ๋ณดํค์ ๋ํ ๋ด์ฉ์ด ์ ๊ธฐ์ต๋์ง ์๋ ์ ์ด์ง๋, ์ ํํ ๋ด์ฉ์ ํ์ ํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ จ ์์ ์ ํ์ธํ์ฌ ์๋์ ๊ฐ์ ๋ด์ฉ์ ํ์ธํ์๋ค.
๊ด๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฆด๋ ์ด์ (Relation)์ ํํ(Tuple)์ ์ ์ผํ๊ฒ ์๋ณํ ์ ์๋ ์์ฑ(Attribute) ๋๋ ์์ฑ์ ์งํฉ ์ค, ๋ค์ ๋ ์ฑ์ง์ ๋ง์กฑํ๋ ๊ฒ์ ํ๋ณด ํค(Candidate Key)๋ผ๊ณ ํ๋ค.
- ์ ์ผ์ฑ(uniqueness) : ๋ฆด๋ ์ด์ ์ ์๋ ๋ชจ๋ ํํ์ ๋ํด ์ ์ผํ๊ฒ ์๋ณ๋์ด์ผ ํ๋ค.
- ์ต์์ฑ(minimality) : ์ ์ผ์ฑ์ ๊ฐ์ง ํค๋ฅผ ๊ตฌ์ฑํ๋ ์์ฑ(Attribute) ์ค ํ๋๋ผ๋ ์ ์ธํ๋ ๊ฒฝ์ฐ ์ ์ผ์ฑ์ด ๊นจ์ง๋ ๊ฒ์ ์๋ฏธํ๋ค. ์ฆ, ๋ฆด๋ ์ด์ ์ ๋ชจ๋ ํํ์ ์ ์ผํ๊ฒ ์๋ณํ๋ ๋ฐ ๊ผญ ํ์ํ ์์ฑ๋ค๋ก๋ง ๊ตฌ์ฑ๋์ด์ผ ํ๋ค.
์ ์ด์ง๋ฅผ ์ํด, ์๋์ ๊ฐ์ ํ์๋ค์ ์ธ์ ์ฌํญ์ด ์ฃผ์ด์ก์ ๋, ํ๋ณด ํค์ ์ต๋ ๊ฐ์๋ฅผ ๊ตฌํ๋ผ.

์์ ์๋ฅผ ์ค๋ช ํ๋ฉด, ํ์์ ์ธ์ ์ฌํญ ๋ฆด๋ ์ด์ ์์ ๋ชจ๋ ํ์์ ๊ฐ์ ์ ์ผํ "ํ๋ฒ"์ ๊ฐ์ง๊ณ ์๋ค. ๋ฐ๋ผ์ "ํ๋ฒ"์ ๋ฆด๋ ์ด์ ์ ํ๋ณด ํค๊ฐ ๋ ์ ์๋ค.
๊ทธ๋ค์ "์ด๋ฆ"์ ๋ํด์๋ ๊ฐ์ ์ด๋ฆ("apeach")์ ์ฌ์ฉํ๋ ํ์์ด ์๊ธฐ ๋๋ฌธ์, "์ด๋ฆ"์ ํ๋ณด ํค๊ฐ ๋ ์ ์๋ค. ๊ทธ๋ฌ๋, ๋ง์ฝ ["์ด๋ฆ", "์ ๊ณต"]์ ํจ๊ป ์ฌ์ฉํ๋ค๋ฉด ๋ฆด๋ ์ด์ ์ ๋ชจ๋ ํํ์ ์ ์ผํ๊ฒ ์๋ณ ๊ฐ๋ฅํ๋ฏ๋ก ํ๋ณด ํค๊ฐ ๋ ์ ์๊ฒ ๋๋ค.
๋ฌผ๋ก ["์ด๋ฆ", "์ ๊ณต", "ํ๋ "]์ ํจ๊ป ์ฌ์ฉํด๋ ๋ฆด๋ ์ด์ ์ ๋ชจ๋ ํํ์ ์ ์ผํ๊ฒ ์๋ณํ ์ ์์ง๋ง, ์ต์์ฑ์ ๋ง์กฑํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ํ๋ณด ํค๊ฐ ๋ ์ ์๋ค.
๋ฐ๋ผ์, ์์ ํ์ ์ธ์ ์ฌํญ์ ํ๋ณดํค๋ "ํ๋ฒ", ["์ด๋ฆ", "์ ๊ณต"] ๋ ๊ฐ๊ฐ ๋๋ค.
๋ฆด๋ ์ด์ ์ ๋ํ๋ด๋ ๋ฌธ์์ด ๋ฐฐ์ด relation์ด ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ์ด ๋ฆด๋ ์ด์ ์์ ํ๋ณด ํค์ ๊ฐ์๋ฅผ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํ๋ผ.
์ ํ์ฌํญ
- relation์ 2์ฐจ์ ๋ฌธ์์ด ๋ฐฐ์ด์ด๋ค.
- relation์ ์ปฌ๋ผ(column)์ ๊ธธ์ด๋ 1 ์ด์ 8 ์ดํ์ด๋ฉฐ, ๊ฐ๊ฐ์ ์ปฌ๋ผ์ ๋ฆด๋ ์ด์ ์ ์์ฑ์ ๋ํ๋ธ๋ค.
- relation์ ๋ก์ฐ(row)์ ๊ธธ์ด๋ 1 ์ด์ 20 ์ดํ์ด๋ฉฐ, ๊ฐ๊ฐ์ ๋ก์ฐ๋ ๋ฆด๋ ์ด์ ์ ํํ์ ๋ํ๋ธ๋ค.
- relation์ ๋ชจ๋ ๋ฌธ์์ด์ ๊ธธ์ด๋ 1 ์ด์ 8 ์ดํ์ด๋ฉฐ, ์ํ๋ฒณ ์๋ฌธ์์ ์ซ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์๋ค.
- relation์ ๋ชจ๋ ํํ์ ์ ์ผํ๊ฒ ์๋ณ ๊ฐ๋ฅํ๋ค.(์ฆ, ์ค๋ณต๋๋ ํํ์ ์๋ค.)
์๊ฐ ํ๋ฆ
์ฒซ ๋ฒ์งธ ์๋
์ฒ์์๋ dfs๋ก ์์ฑ์ ์กฐํฉ์ ์ ๋ถ ๊ตฌํ๊ณ , ๋ชจ๋ dfs ํธ์ถ ์ ์๋ณ ํจ์๋ฅผ ๋ฐ๋ก ๋์ด์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์กฐํฉ์ ๊ฐ์๋ฅผ ์ธ ์ฃผ๋ฉด ๋๊ฒ ๋ค๊ณ ์๊ฐํ์ด์.
๊ทธ๋ฆฌ๊ณ ์์ฑ์ visited ๋ฐฐ์ด์ ๋ง๋ค์ด์ ๋ชจ๋ ์์ฑ์ ๋ฐฉ๋ฌธํ๊ณ ๋๋ฉด ์ข ๋ฃ๋๋๋ก ๊ตฌํํ์ต๋๋ค.
์ฌ๊ธฐ์์ ํ๋ ํ๋ ธ์ต๋๋ค.
์ค๊ณ๋ ๋ง์๋๋ฐ ์กฐํฉ์ด ์๋๋ผ ์์ด์ ๊ตฌํ๋๋ก ๊ตฌํํ์ด์.
์์ด
์๋ก ๋ค๋ฅธ n๊ฐ ์ค r๊ฐ๋ฅผ ์ ํํ๋ ๊ฒฝ์ฐ์ ์. ์์๋ฅผ ๊ณ ๋ คํ๋ค.
์กฐํฉ
์๋ก ๋ค๋ฅธ n๊ฐ ์ค r๊ฐ๋ฅผ ์ ํํ๋ ๊ฒฝ์ฐ์ ์. ์์๋ฅผ ๊ณ ๋ คํ์ง ์๋๋ค.
์ฝ๋๋ฅผ ์ ๊น ๋ณผ๊น์.
์๋๋ ์ฒ์ ๊ตฌํํ๋ dfs ํจ์์ ๋๋ค.
fun dfs(visited: BooleanArray) {
if (checkCandidateKey(visited)) {
answer++
return
}
for (i in visited.indices) {
if (!visited[i]) {
visited[i] = true
dfs(visited, i)
visited[i] = false
}
}
}
๋ญ๊ฐ ์ด์ํ์ฃ ?
for๋ฌธ ๋ด๋ถ์์ visited ๋ฐฐ์ด๋ก ๋ฐฉ๋ฌธ์ฒดํฌ๋ง ํด์ฃผ๊ณ ์์ต๋๋ค.
์ด๋ฌ๋ฉด ์ด๋ป๊ฒ ๋๋๋.
visited[1] = true, visited[3] = true
์ด ๊ฒฝ์ฐ์
visited[3] = true, visited[1] = true
์ด ๊ฒฝ์ฐ๊ฐ ๋ค๋ฅด๊ฒ ์นด์ดํธ๋ฉ๋๋ค. ์ฆ, ์์ด์ ๊ตฌํ ๊ผด์ด์ฃ .
ํ...
์ ์ถ๋ ฅ ์์ ๊ธฐ๋๊ฐ์ด 2์ธ๋ฐ 43์ ๋ฑ๋๋ผ๊ณ ์.
์ ์ถ๋ ฅ ์์๋ถํฐ ํ๋ ค์ ๋ก์ง์ด ํ๋ ธ๋ ์ถ์์ต๋๋ค.
๊ทธ๋์ ๋ ๋ฒ์งธ ์๋๋ ์ ๋์จ ํ์ธ๋๋ก ํ์ต๋๋ค.
์ ๊ฐ ์ ๊ทธ๋ฌ์๊น์?
์ฌ๊ธฐ์ ์์๋ ์ค๋ ธ์ฐ๋ณผ ๋๋ถ์ 3์ฐจ๊น์ง ๊ตด๋ฌ๊ฐ๋๋ค.
๋ ๋ฒ์งธ ์๋
์ด๋ ๊ฒ ์๊ฐํ ์ด์ ๊ฐ ์์ต๋๋ค.
์ ์ถ๋ ฅ ์์ 1๋ฒ ์กฐํฉ์ด ์ธ๋ฑ์ค๋ก ๋๋ ๋ณด๋ฉด { 0 }, { 1, 2 } ์๊ฑฐ๋ ์.
์ ์ด๊ฑฐ disjoint set์ธ๊ฐ? ๊ทธ๋ผ union-find๋ฅผ ์จ์ผ ํ๋?
๊ทธ๋์ class ๋ง๋ค๊ธฐ๋ ์ข ์ค๋ฒํค๋๋๊น parent IntArray๋ฅผ ๋ง๋ค์ด์ ์ฌ๊ธฐ์ top node index๋ฅผ ์ ์ฅํ ๊น~
ํ์ต๋๋ค.
๋คํํ๋ ๊ธ๋ฐฉ ์ ์ ์ฐจ๋ฆฌ๊ณ ๊ตฌํ์ ํ์ง ์์์ต๋๋ค.
์๋ํ๋ฉด ์ด๋ ๊ฒ ํ๋ฉด ํค ํ๋๊ฐ ์ฌ๋ฌ ์กฐํฉ์ ์ฌ์ฉ๋ ๋ ์ฌ๋ฐ๋ฅด๊ฒ ํ๋ณํ ์ ์์ต๋๋ค.
์์ 1๋ฒ์์ ๋ง์ง๋ง ์ค์ ํ์์ ์ ๊ณต์ computer๋ก ๋ฐ๊ฟ ๋ด ์๋ค.

๊ทธ๋ผ ์๋ณ ๊ฐ๋ฅํ ์์ฑ ์กฐํฉ์ด
- ํ๋ฒ
- ์ด๋ฆ & ์ ๊ณต
- ์ ๊ณต & ํ๋
์ด 3๊ฐ์ง๊ฐ ๋๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ ์ ๊ณต์ ๋ ๋ฒ ์ฌ์ฉ๋๋ ๊ฒ๋ ๋ณด์ด์ฃ .
๊ทธ๋์ disjoint set์ผ๋ก ํ ์ ์์ต๋๋ค.
์ธ ๋ฒ์งธ ์๋ - ์ฑ๊ณต!
์ ์ ์ ์ฐจ๋ฆฌ๊ณ ์ฒซ ๋ฒ์งธ ์๋์ ๋ก์ง์ด ๋ง๋ค๊ณ ํ์ ํ๊ฒ ๋์์ด์.
๊ทธ๋ฐ๋ฐ๋ ํ๋ฆฐ ์ด์ ๋ ์ ํ์ ํ ์ค๋ ฅ ๋๋ฌธ์ด์์ต๋๋ค.
์๋๋ ์ฌ๋ฐ๋ฅธ ์ฒดํฌ ํจ์ ์ฝ๋์ ๋๋ค.
dfs ํธ์ถ ์๋ง๋ค ํธ์ถ๋๋ฉฐ visited ๋ฐฐ์ด๋ก ๋ง๋ค์ด์ง ์กฐํฉ์ด ๋ฌธ์ ์กฐ๊ฑด์ ๋ง๋์ง ๊ฒ์ฌํด ์ฃผ๋ ํจ์์์.
fun checkCandidateKey(visited: BooleanArray): Boolean {
var keys = relation.map { it.filterIndexed { index, _ -> visited[index] } }
// isUnique
for (key in keys) {
if (keys.count { it == key } != 1)
return false
}
// isMinimal
if (visited.count { it } == 1) return true
var count = 0
for (i in 0 until keys[0].size) {
var testKeys = keys.map { it.filterIndexed { index, _ -> index != i } }
for (key in testKeys) {
if (testKeys.count { it == key } != 1) {
count++
break
}
}
}
}
1. array.count() ์ฌ์ฉ ๋ฏธ์ค
์ฝ๋๋ฅผ ๋ณด์๋ฉด array.count() ํจ์๋ฅผ ๊ฝค ์์ฃผ ํธ์ถํ๊ณ ์๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
for๋ฌธ ๋๋ฆฌ๊ธฐ ์ซ์ด์ ํจ์ ํธ์ถ์ ํด ์ฃผ์์ด์.
์ ๊ฑธ ์๋ชป ์ผ์ต๋๋ค.
if (visited.count { true } == 1)
์ด๊ฒ ๋ญ๊น์?
count()๋ { } ๋ด๋ถ์ ๋๋ค์์ด true์ผ ๋์ ๊ฐ์๋ฅผ ๋ฆฌํดํด ์ค๋๋ค.
๋ง์ต๋๋ค...
์์ ์ฝ๋๋ visited ๋ฐฐ์ด์ ์ฌ์ด์ฆ๋ฅผ ๋ฆฌํดํฉ๋๋ค.
true์ธ ์์์ ๊ฐ์๋ฅผ ๋ฆฌํดํ๋ ๊ฒ์ด ์๋๋ผ์...
2. Kotlin์ equals(), ==, ===
java์ ==๋ primitive type์ ๊ฒฝ์ฐ ๊ฐ์ ๋น๊ตํ๊ณ , reference type์ ๊ฒฝ์ฐ ์ฃผ์๋ฅผ ๋น๊ตํฉ๋๋ค.
๋ฌผ๋ก ์๋ฐํ๊ฒ ๋งํ์๋ฉด primitive type์ ๊ฒฝ์ฐ์๋ Constance Pool์ ์กด์ฌํ๋ ํน์ ์์์ ์ฃผ์๊ฐ์ ๋น๊ตํ๋ ๊ฑฐ๋๊น ์ ํํ value๋ฅผ ๋น๊ตํ๋ ๊ฒ์ ์๋๋๋ค.
์๋ฌดํผ ๊ฐ์ฒด๊ฐ ๋ค์ด์ค๋ฉด ๊ฐ์ฒด์ ์ฃผ์๊ฐ์ ๋น๊ตํฉ๋๋ค.
์ด๋ ๊ฐ์ฒด์ ์ฃผ์๊ฐ์ด ๊ฐ์ผ๋ฉด true๋ฅผ ๋ฐํํ๋๋ฐ, ๊ทธ๋ฅ ๊ฐ์ ๊ฐ์ฒด๋ผ๋ ๋ป์ด์ฃ .
์ด๊ฑธ ๋์ผ์ฑ์ด๋ผ๊ณ ํฉ๋๋ค.
์ด๋ ๊ฐ์ฒด์ ๊ฐ์ ๋น๊ตํ๊ธฐ ์ํด์๋ ์ผ๋ฐ์ ์ผ๋ก equals()๋ฅผ ์ฌ์ฉํ๋๋ฐ์.
"์ผ๋ฐ์ ์ธ" String ๊ฐ์ฒด์ ๊ฒฝ์ฐ eqauls()๊ฐ ๋ฏธ๋ฆฌ ์ค๋ฒ๋ผ์ด๋ฉ๋์ด ์์ต๋๋ค.
๊ทธ๋์ ์ฃผ์๊ฐ์ด ์๋๋ผ ๊ฐ ๋น๊ต๋ฅผ ํด ์ค๋๋ค.
์ฃผ์๊ฐ์ด ๋ฌ๋ผ๋ ๊ฐ์ ๋์ผํ ์ ์์ฃ .
์ด๊ฑธ ๋๋ฑ์ฑ์ด๋ผ๊ณ ํฉ๋๋ค.
๋์ผ์ฑ identity
๋์ผํ๋ค๋ ๋ป์ผ๋ก, ๋ ๊ฐ์ ๊ฐ์ฒด๊ฐ ์์ ํ ๊ฐ์ ๊ฒฝ์ฐ๋ฅผ ๋ปํ๋ค.
์ฃผ์๊ฐ์ด ๊ฐ๋ค.
๋๋ฑ์ฑ equality
๋๋ฑํ๋ค๋ ๋ป์ผ๋ก, ๋ ๊ฐ์ ๊ฐ์ฒด๊ฐ ๋๋ฑํ ์ ๋ณด๋ฅผ ๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ๋ปํ๋ค.
์ฃผ์๊ฐ์ด ๋ฌ๋ผ๋ ๊ฐ์ ๋์ผํ ์ ์์ผ๋ฏ๋ก, ๋์ผ์ฑ์ด ์ฑ๋ฆฝํ์ง ์๋๋ผ๋ ๋๋ฑ์ฑ์ด ์ฑ๋ฆฝํ ์ ์๋ค.
๋ค๋ฅธ ๊ฐ์ฒด๋ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ค๋ฅด๊ณ ์ํ๋ ๋์์ ํ์ง ์์ ์๋ ์์ด์ ํ์ํ ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ์ง์ ์ค๋ฒ๋ผ์ด๋ฉํด์ผ ํฉ๋๋ค.
์์ฃผ ๋ถ์น์ ํ์ฃ ?
๊ทธ๋ฌ๋ Kotlin์ ๋ค๋ฆ ๋๋ค.
Kotlin์ == ์ฐ์ฐ์๊ฐ equals()์ ๋๋ค.
์ฆ ๋๋ฑ์ฑ์ ๊ฒ์ฌํฉ๋๋ค.
๊ณต์ ๋ฌธ์์์ ์น์ ํ๊ฒ ์ค๋ช ํด์ฃผ๊ณ ์์ต๋๋ค. ํท๊ฐ๋ฆฌ๋ ์ฌ๋์ด ์ผ๋ง๋ ๋ง์๊ธธ๋...
Equality | Kotlin
kotlinlang.org
๊ทธ๋ฐ๋ฐ ์ด๊ฑธ ๋ณธ ํ์๋ ์ด๊ฒ ๋ง๋ ์ถ์ ๋ถ๋ถ์ด ์์์ต๋๋ค.
// isUnique ์ฃผ์ ๋ฐ์ for๋ฌธ์ ๋ณด์๋ฉด ๋ด๋ถ์์ count() ๋ฅผ ์ฌ์ฉํด์ ์์ ๊ฐ์๋ฅผ ์ธ๊ณ ์๋ ๊ฒ์ ๋ณด์ค ์ ์๋๋ฐ์.
์ด ๋ถ๋ถ์ ๋๋ค.
// isUnique
for (key in keys) {
if (keys.count { it == key } != 1)
return false
}
๊ทธ๋ฐ๋ฐ ์ด ๋๋ค์์์ it๊ณผ key์ type์ List<String>์ ๋๋ค.
ํน๊ฐ Kotlin์ด list์ ๋ด๋ถ ์์๊น์ง ๋ค์ฌ๋ค๋ณด๋ฉด์ ๋๋ฑ์ฑ ์ฒดํฌ๋ฅผ ํด ์ฃผ๋ ๊ฑธ๊น์?
๋๋๊ฒ๋ ๋ง์ต๋๋ค.
equals - Kotlin Programming Language
kotlinlang.org

ํด์ํด ๋๋ฆด๊ฒ์.
ํ๋ผ๋ฏธํฐ๋ก ๋ค์ด์จ ์ธ์คํด์ค๊ฐ "๋๊ฐ์ ์ฌ์ด์ฆ"์ด๊ณ , "๋๊ฐ์ ์์"๋ฅผ "๋๊ฐ์ ์์"๋ก ๊ฐ์ง ๋ฆฌ์คํธ๋ผ๋ฉด return true
์ ๋๋ค.
๊ทธ๋์ ๋จ 4์ค๋ง์ผ๋ก ๊ฐ๋ ์ฑ ๋๋ด์ฃผ๋ for๋ฌธ์ด ์์ฑ๋ฉ๋๋ค. ๋ ์ค์ด๋ฉด ๋ฌด๋ ค 3์ค์ด์์.
์งฑ์ด์ผ!
์ ๋ ์ ์ธํ์ด ๋๋ฌด ์ข์์.
์๋ฌดํผ ์๋ ๋์ถฉ ์งฐ๋๋ฐ ์ผ๋จ๊ฒฐ์ ์ ๋์๊ฐ๊ธธ๋ ์ฅ ์ ๋์๊ฐ์ง ์ถ์ด์ ์์๋ณธ ๋ด์ฉ์ ๋๋ค.
๋ง์์ง๋ง ๊ถ๊ธํ์ด์.
3. ์ ์ผ์ฑ ๊ฒ์ฌ
์์ ์ฝ๋์ // isMinimal ์ฃผ์์ ๋ฌ์์ค ํํธ์์ ์ ์ผ์ฑ ๊ฒ์ฌ๋ฅผ ํ๋๋ฐ์.
์๋์ ๊ฐ์ ์ฝ๋์ ๋๋ค.
// isMinimal
if (visited.count { it } == 1) return true
var count = 0
for (i in 0 until keys[0].size) {
var testKeys = keys.map { it.filterIndexed { index, _ -> index != i } }
for (key in testKeys) {
if (testKeys.count { it == key } != 1) {
count++
break
}
}
}
์ด ์ ์ผ์ฑ ๊ฒ์ฌ๋ ์ด๋ป๊ฒ ๋์๊ฐ์ผ ํ๋๋ฉด, ๋ชจ๋ ์์๊ฐ "์กฐํฉ์์ ๋น ์ง๋ฉด ํ๋ณดํค๊ฐ ๋ ์ ์๋ ์์"์ฌ์ผ ํฉ๋๋ค.
๊ทธ๋์ ์์๊ฐ ๋ ๋น ์ง ์ ์๋ ์กฐํฉ, ์ฆ ์์ 1๊ฐ์ง๋ฆฌ ์กฐํฉ์ผ ๋๋ ๊ทธ๋๋ก ๋ฆฌํดํด ์ฃผ์๊ณ ์.
๊ทธ ์ด์์ผ ๋๋ count ๋ณ์๋ฅผ ๋์์ต๋๋ค.
for๋ฌธ ๋ด๋ถ์ testKeys๋ ๋ฐ๋ณต๋ฌธ์ด ๋ ๋๋ง๋ค "์๋ ์กฐํฉ"์์ ๋ชจ๋ ์์ฑ์ ํ๋์ฉ ๋นผ์ ์๋กญ๊ฒ ๋ง๋ ๋ฐ์ดํฐ์ ๋๋ค.
์ด๋ ๊ฒ ๋ง๋ค์ด์ง ๋ฐ์ดํฐ๋ ๋น์ฐํ ์๋ณ๋๋ฉด ์ ๋ฉ๋๋ค.
์ฆ, ์๋ณ์ด ๋์ง ์๋๋ค๋ฉด ์ฌ๋ฐ๋ฅธ ์กฐํฉ์ ๋๋ค.
๊ทธ๋ฌ๋๊น ๋ชจ๋ ์์ฑ์ ํ๋์ฉ ๋นผ์ ์ ๋ถ ํ ์คํธ๋ฅผ ํ์ ๋ ์ ๋๋ก ์๋ณ๋๋ ๊ฒฝ์ฐ๊ฐ ํ๋๋ผ๋ ์์ผ๋ฉด ์ ๋๋ ๊ฒ์ด์ฃ .
for๋ฌธ์ ๋ค ๋์์ ๋ count์ ๊ฐ์ด visited ๋ฐฐ์ด์ ๊ฐ์ด true์ธ ์์์ ๊ฐ์์ ๋์ผํ๋ฉด ๋ชจ๋ ๊ฒ์ฌ๊ฐ ์ ๋๋ ๊ฒ๋๋ค.
4. ์์ด & ์กฐํฉ
์๊น 1์ฐจ ์๋์์ ์์ด & ์กฐํฉ์ ์๋ชป ๊ตฌํํ์์ฃ .
๋ชฉํ๋ ์กฐํฉ์ ๋๋ค.
๊ทธ๋์ ์์๋ฅผ ์ ๊ฒฝ ์จ ์ค๋๋ค.
fun dfs(visited: BooleanArray, now: Int) {
if (checkCandidateKey(visited)) {
answer++
return
}
for (i in visited.indices) {
if (!visited[i] && now <= i) {
visited[i] = true
dfs(visited, i)
visited[i] = false
}
}
}
dfs ํจ์์ now๋ผ๋ ๋ณ์๋ฅผ ์ถ๊ฐํด์ ํ์ฌ ์ด๋ค ์ธ๋ฑ์ค๋ฅผ ๋ฐฉ๋ฌธํ๋์ง ๊ธฐ๋กํด ์ฃผ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ if๋ฌธ์ ์กฐ๊ฑด์ ํ๋ ๋ ๋ฃ์ด ์ฃผ์์ด์.
now <= i ์ ๋๋ค.
์ด ์กฐ๊ฑด์ ์ถ๊ฐํด ์ฃผ๋ฉด ์กฐํฉ์ด ์ค๋ฆ์ฐจ์์ผ๋ก ํ๋๋ง ์ธ์ด์ง๋๋ค.
๋ฑํธ ๋นผ๋ฉด ์ ๋ฉ๋๋ค.
์ ์ฒด ์ฝ๋ ๋ณด๋ฉด ์์๊ฒ ์ง๋ง dfs(visited, 0)๋ก ํจ์๋ฅผ ํธ์ถํ๋๋ฐ, 0์ด now๋ก ๋ค์ด๊ฐ์ ์์ํ false์ธ ์ํ๋ก ์คํ๋ฉ๋๋ค.
์ ๋ต
class Solution {
fun solution(relation: Array<Array<String>>): Int {
var answer = 0
var visited = BooleanArray(relation[0].size)
fun checkCandidateKey(visited: BooleanArray): Boolean {
var keys = relation.map { it.filterIndexed { index, _ -> visited[index] } }
// isUnique
for (key in keys) {
if (keys.count { it == key } != 1) return false
}
// isMinimal
if (visited.count { it } == 1) return true
var count = 0
for (i in 0 until keys[0].size) {
var testKeys = keys.map { it.filterIndexed { index, _ -> index != i } }
for (key in testKeys) {
if (testKeys.count { it == key } != 1) {
count++
break
}
}
}
return count == visited.count { it }
}
fun dfs(visited: BooleanArray, now: Int) {
if (checkCandidateKey(visited)) {
answer++
return
}
for (i in visited.indices) {
if (!visited[i] && now <= i) {
visited[i] = true
dfs(visited, i)
visited[i] = false
}
}
}
dfs(visited, 0)
return answer
}
}
'๐ ๊ณต๋ถ > ๐ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ Kotlin ํ์ด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค ๊ผฌ์ธ ์ ๊น์ค - boj1365 (0) | 2023.07.27 |
---|---|
๋ฐฑ์ค ํํ์ - boj2932 (0) | 2023.07.11 |
๋ฐฑ์ค N๊ณผ M (9) - boj15663 (1) | 2023.04.24 |
์ฒซ ๊ธ (0) | 2023.04.07 |
ํ๋ก๊ทธ๋๋จธ์ค
์ฝ๋ ์ค์ฌ์ ๊ฐ๋ฐ์ ์ฑ์ฉ. ์คํ ๊ธฐ๋ฐ์ ํฌ์ง์ ๋งค์นญ. ํ๋ก๊ทธ๋๋จธ์ค์ ๊ฐ๋ฐ์ ๋ง์ถคํ ํ๋กํ์ ๋ฑ๋กํ๊ณ , ๋์ ๊ธฐ์ ๊ถํฉ์ด ์ ๋ง๋ ๊ธฐ์ ๋ค์ ๋งค์นญ ๋ฐ์ผ์ธ์.
programmers.co.kr
ํ๋ก๊ทธ๋๋จธ์ค์ ํ๋ณดํค ๋ฌธ์ ์ ๋๋ค.
2๋ ๋ฒจ ๋ฌธ์ ์์.
๋ง๋งํ ๋ดค๋ค๊ฐ ๋ธ๋ก๊ทธ์ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๋ง๋ค๊ฒ ๋์์ต๋๋ค.
ํ...
๋ฌธ์ ์ค๋ช
ํ๋ ์ฆ๋ํ๊ต ์ปดํจํฐ๊ณตํ๊ณผ ์กฐ๊ต์ธ ์ ์ด์ง๋ ๋ค์ค ํ๊ณผ์ฅ๋์ ์ง์๋ก, ํ์๋ค์ ์ธ์ ์ฌํญ์ ์ ๋ฆฌํ๋ ์ ๋ฌด๋ฅผ ๋ด๋นํ๊ฒ ๋์๋ค.
๊ทธ์ ํ๋ถ ์์ ํ๋ก๊ทธ๋๋ฐ ๊ฒฝํ์ ๋์ด๋ ค, ๋ชจ๋ ์ธ์ ์ฌํญ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฃ๊ธฐ๋ก ํ์๊ณ , ์ด๋ฅผ ์ํด ์ ๋ฆฌ๋ฅผ ํ๋ ์ค์ ํ๋ณดํค(Candidate Key)์ ๋ํ ๊ณ ๋ฏผ์ด ํ์ํ๊ฒ ๋์๋ค.
ํ๋ณดํค์ ๋ํ ๋ด์ฉ์ด ์ ๊ธฐ์ต๋์ง ์๋ ์ ์ด์ง๋, ์ ํํ ๋ด์ฉ์ ํ์ ํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ จ ์์ ์ ํ์ธํ์ฌ ์๋์ ๊ฐ์ ๋ด์ฉ์ ํ์ธํ์๋ค.
๊ด๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฆด๋ ์ด์ (Relation)์ ํํ(Tuple)์ ์ ์ผํ๊ฒ ์๋ณํ ์ ์๋ ์์ฑ(Attribute) ๋๋ ์์ฑ์ ์งํฉ ์ค, ๋ค์ ๋ ์ฑ์ง์ ๋ง์กฑํ๋ ๊ฒ์ ํ๋ณด ํค(Candidate Key)๋ผ๊ณ ํ๋ค.
- ์ ์ผ์ฑ(uniqueness) : ๋ฆด๋ ์ด์ ์ ์๋ ๋ชจ๋ ํํ์ ๋ํด ์ ์ผํ๊ฒ ์๋ณ๋์ด์ผ ํ๋ค.
- ์ต์์ฑ(minimality) : ์ ์ผ์ฑ์ ๊ฐ์ง ํค๋ฅผ ๊ตฌ์ฑํ๋ ์์ฑ(Attribute) ์ค ํ๋๋ผ๋ ์ ์ธํ๋ ๊ฒฝ์ฐ ์ ์ผ์ฑ์ด ๊นจ์ง๋ ๊ฒ์ ์๋ฏธํ๋ค. ์ฆ, ๋ฆด๋ ์ด์ ์ ๋ชจ๋ ํํ์ ์ ์ผํ๊ฒ ์๋ณํ๋ ๋ฐ ๊ผญ ํ์ํ ์์ฑ๋ค๋ก๋ง ๊ตฌ์ฑ๋์ด์ผ ํ๋ค.
์ ์ด์ง๋ฅผ ์ํด, ์๋์ ๊ฐ์ ํ์๋ค์ ์ธ์ ์ฌํญ์ด ์ฃผ์ด์ก์ ๋, ํ๋ณด ํค์ ์ต๋ ๊ฐ์๋ฅผ ๊ตฌํ๋ผ.

์์ ์๋ฅผ ์ค๋ช ํ๋ฉด, ํ์์ ์ธ์ ์ฌํญ ๋ฆด๋ ์ด์ ์์ ๋ชจ๋ ํ์์ ๊ฐ์ ์ ์ผํ "ํ๋ฒ"์ ๊ฐ์ง๊ณ ์๋ค. ๋ฐ๋ผ์ "ํ๋ฒ"์ ๋ฆด๋ ์ด์ ์ ํ๋ณด ํค๊ฐ ๋ ์ ์๋ค.
๊ทธ๋ค์ "์ด๋ฆ"์ ๋ํด์๋ ๊ฐ์ ์ด๋ฆ("apeach")์ ์ฌ์ฉํ๋ ํ์์ด ์๊ธฐ ๋๋ฌธ์, "์ด๋ฆ"์ ํ๋ณด ํค๊ฐ ๋ ์ ์๋ค. ๊ทธ๋ฌ๋, ๋ง์ฝ ["์ด๋ฆ", "์ ๊ณต"]์ ํจ๊ป ์ฌ์ฉํ๋ค๋ฉด ๋ฆด๋ ์ด์ ์ ๋ชจ๋ ํํ์ ์ ์ผํ๊ฒ ์๋ณ ๊ฐ๋ฅํ๋ฏ๋ก ํ๋ณด ํค๊ฐ ๋ ์ ์๊ฒ ๋๋ค.
๋ฌผ๋ก ["์ด๋ฆ", "์ ๊ณต", "ํ๋ "]์ ํจ๊ป ์ฌ์ฉํด๋ ๋ฆด๋ ์ด์ ์ ๋ชจ๋ ํํ์ ์ ์ผํ๊ฒ ์๋ณํ ์ ์์ง๋ง, ์ต์์ฑ์ ๋ง์กฑํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ํ๋ณด ํค๊ฐ ๋ ์ ์๋ค.
๋ฐ๋ผ์, ์์ ํ์ ์ธ์ ์ฌํญ์ ํ๋ณดํค๋ "ํ๋ฒ", ["์ด๋ฆ", "์ ๊ณต"] ๋ ๊ฐ๊ฐ ๋๋ค.
๋ฆด๋ ์ด์ ์ ๋ํ๋ด๋ ๋ฌธ์์ด ๋ฐฐ์ด relation์ด ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ์ด ๋ฆด๋ ์ด์ ์์ ํ๋ณด ํค์ ๊ฐ์๋ฅผ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํ๋ผ.
์ ํ์ฌํญ
- relation์ 2์ฐจ์ ๋ฌธ์์ด ๋ฐฐ์ด์ด๋ค.
- relation์ ์ปฌ๋ผ(column)์ ๊ธธ์ด๋ 1 ์ด์ 8 ์ดํ์ด๋ฉฐ, ๊ฐ๊ฐ์ ์ปฌ๋ผ์ ๋ฆด๋ ์ด์ ์ ์์ฑ์ ๋ํ๋ธ๋ค.
- relation์ ๋ก์ฐ(row)์ ๊ธธ์ด๋ 1 ์ด์ 20 ์ดํ์ด๋ฉฐ, ๊ฐ๊ฐ์ ๋ก์ฐ๋ ๋ฆด๋ ์ด์ ์ ํํ์ ๋ํ๋ธ๋ค.
- relation์ ๋ชจ๋ ๋ฌธ์์ด์ ๊ธธ์ด๋ 1 ์ด์ 8 ์ดํ์ด๋ฉฐ, ์ํ๋ฒณ ์๋ฌธ์์ ์ซ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์๋ค.
- relation์ ๋ชจ๋ ํํ์ ์ ์ผํ๊ฒ ์๋ณ ๊ฐ๋ฅํ๋ค.(์ฆ, ์ค๋ณต๋๋ ํํ์ ์๋ค.)
์๊ฐ ํ๋ฆ
์ฒซ ๋ฒ์งธ ์๋
์ฒ์์๋ dfs๋ก ์์ฑ์ ์กฐํฉ์ ์ ๋ถ ๊ตฌํ๊ณ , ๋ชจ๋ dfs ํธ์ถ ์ ์๋ณ ํจ์๋ฅผ ๋ฐ๋ก ๋์ด์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์กฐํฉ์ ๊ฐ์๋ฅผ ์ธ ์ฃผ๋ฉด ๋๊ฒ ๋ค๊ณ ์๊ฐํ์ด์.
๊ทธ๋ฆฌ๊ณ ์์ฑ์ visited ๋ฐฐ์ด์ ๋ง๋ค์ด์ ๋ชจ๋ ์์ฑ์ ๋ฐฉ๋ฌธํ๊ณ ๋๋ฉด ์ข ๋ฃ๋๋๋ก ๊ตฌํํ์ต๋๋ค.
์ฌ๊ธฐ์์ ํ๋ ํ๋ ธ์ต๋๋ค.
์ค๊ณ๋ ๋ง์๋๋ฐ ์กฐํฉ์ด ์๋๋ผ ์์ด์ ๊ตฌํ๋๋ก ๊ตฌํํ์ด์.
์์ด
์๋ก ๋ค๋ฅธ n๊ฐ ์ค r๊ฐ๋ฅผ ์ ํํ๋ ๊ฒฝ์ฐ์ ์. ์์๋ฅผ ๊ณ ๋ คํ๋ค.
์กฐํฉ
์๋ก ๋ค๋ฅธ n๊ฐ ์ค r๊ฐ๋ฅผ ์ ํํ๋ ๊ฒฝ์ฐ์ ์. ์์๋ฅผ ๊ณ ๋ คํ์ง ์๋๋ค.
์ฝ๋๋ฅผ ์ ๊น ๋ณผ๊น์.
์๋๋ ์ฒ์ ๊ตฌํํ๋ dfs ํจ์์ ๋๋ค.
fun dfs(visited: BooleanArray) {
if (checkCandidateKey(visited)) {
answer++
return
}
for (i in visited.indices) {
if (!visited[i]) {
visited[i] = true
dfs(visited, i)
visited[i] = false
}
}
}
๋ญ๊ฐ ์ด์ํ์ฃ ?
for๋ฌธ ๋ด๋ถ์์ visited ๋ฐฐ์ด๋ก ๋ฐฉ๋ฌธ์ฒดํฌ๋ง ํด์ฃผ๊ณ ์์ต๋๋ค.
์ด๋ฌ๋ฉด ์ด๋ป๊ฒ ๋๋๋.
visited[1] = true, visited[3] = true
์ด ๊ฒฝ์ฐ์
visited[3] = true, visited[1] = true
์ด ๊ฒฝ์ฐ๊ฐ ๋ค๋ฅด๊ฒ ์นด์ดํธ๋ฉ๋๋ค. ์ฆ, ์์ด์ ๊ตฌํ ๊ผด์ด์ฃ .
ํ...
์ ์ถ๋ ฅ ์์ ๊ธฐ๋๊ฐ์ด 2์ธ๋ฐ 43์ ๋ฑ๋๋ผ๊ณ ์.
์ ์ถ๋ ฅ ์์๋ถํฐ ํ๋ ค์ ๋ก์ง์ด ํ๋ ธ๋ ์ถ์์ต๋๋ค.
๊ทธ๋์ ๋ ๋ฒ์งธ ์๋๋ ์ ๋์จ ํ์ธ๋๋ก ํ์ต๋๋ค.
์ ๊ฐ ์ ๊ทธ๋ฌ์๊น์?
์ฌ๊ธฐ์ ์์๋ ์ค๋ ธ์ฐ๋ณผ ๋๋ถ์ 3์ฐจ๊น์ง ๊ตด๋ฌ๊ฐ๋๋ค.
๋ ๋ฒ์งธ ์๋
์ด๋ ๊ฒ ์๊ฐํ ์ด์ ๊ฐ ์์ต๋๋ค.
์ ์ถ๋ ฅ ์์ 1๋ฒ ์กฐํฉ์ด ์ธ๋ฑ์ค๋ก ๋๋ ๋ณด๋ฉด { 0 }, { 1, 2 } ์๊ฑฐ๋ ์.
์ ์ด๊ฑฐ disjoint set์ธ๊ฐ? ๊ทธ๋ผ union-find๋ฅผ ์จ์ผ ํ๋?
๊ทธ๋์ class ๋ง๋ค๊ธฐ๋ ์ข ์ค๋ฒํค๋๋๊น parent IntArray๋ฅผ ๋ง๋ค์ด์ ์ฌ๊ธฐ์ top node index๋ฅผ ์ ์ฅํ ๊น~
ํ์ต๋๋ค.
๋คํํ๋ ๊ธ๋ฐฉ ์ ์ ์ฐจ๋ฆฌ๊ณ ๊ตฌํ์ ํ์ง ์์์ต๋๋ค.
์๋ํ๋ฉด ์ด๋ ๊ฒ ํ๋ฉด ํค ํ๋๊ฐ ์ฌ๋ฌ ์กฐํฉ์ ์ฌ์ฉ๋ ๋ ์ฌ๋ฐ๋ฅด๊ฒ ํ๋ณํ ์ ์์ต๋๋ค.
์์ 1๋ฒ์์ ๋ง์ง๋ง ์ค์ ํ์์ ์ ๊ณต์ computer๋ก ๋ฐ๊ฟ ๋ด ์๋ค.

๊ทธ๋ผ ์๋ณ ๊ฐ๋ฅํ ์์ฑ ์กฐํฉ์ด
- ํ๋ฒ
- ์ด๋ฆ & ์ ๊ณต
- ์ ๊ณต & ํ๋
์ด 3๊ฐ์ง๊ฐ ๋๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ ์ ๊ณต์ ๋ ๋ฒ ์ฌ์ฉ๋๋ ๊ฒ๋ ๋ณด์ด์ฃ .
๊ทธ๋์ disjoint set์ผ๋ก ํ ์ ์์ต๋๋ค.
์ธ ๋ฒ์งธ ์๋ - ์ฑ๊ณต!
์ ์ ์ ์ฐจ๋ฆฌ๊ณ ์ฒซ ๋ฒ์งธ ์๋์ ๋ก์ง์ด ๋ง๋ค๊ณ ํ์ ํ๊ฒ ๋์์ด์.
๊ทธ๋ฐ๋ฐ๋ ํ๋ฆฐ ์ด์ ๋ ์ ํ์ ํ ์ค๋ ฅ ๋๋ฌธ์ด์์ต๋๋ค.
์๋๋ ์ฌ๋ฐ๋ฅธ ์ฒดํฌ ํจ์ ์ฝ๋์ ๋๋ค.
dfs ํธ์ถ ์๋ง๋ค ํธ์ถ๋๋ฉฐ visited ๋ฐฐ์ด๋ก ๋ง๋ค์ด์ง ์กฐํฉ์ด ๋ฌธ์ ์กฐ๊ฑด์ ๋ง๋์ง ๊ฒ์ฌํด ์ฃผ๋ ํจ์์์.
fun checkCandidateKey(visited: BooleanArray): Boolean {
var keys = relation.map { it.filterIndexed { index, _ -> visited[index] } }
// isUnique
for (key in keys) {
if (keys.count { it == key } != 1)
return false
}
// isMinimal
if (visited.count { it } == 1) return true
var count = 0
for (i in 0 until keys[0].size) {
var testKeys = keys.map { it.filterIndexed { index, _ -> index != i } }
for (key in testKeys) {
if (testKeys.count { it == key } != 1) {
count++
break
}
}
}
}
1. array.count() ์ฌ์ฉ ๋ฏธ์ค
์ฝ๋๋ฅผ ๋ณด์๋ฉด array.count() ํจ์๋ฅผ ๊ฝค ์์ฃผ ํธ์ถํ๊ณ ์๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
for๋ฌธ ๋๋ฆฌ๊ธฐ ์ซ์ด์ ํจ์ ํธ์ถ์ ํด ์ฃผ์์ด์.
์ ๊ฑธ ์๋ชป ์ผ์ต๋๋ค.
if (visited.count { true } == 1)
์ด๊ฒ ๋ญ๊น์?
count()๋ { } ๋ด๋ถ์ ๋๋ค์์ด true์ผ ๋์ ๊ฐ์๋ฅผ ๋ฆฌํดํด ์ค๋๋ค.
๋ง์ต๋๋ค...
์์ ์ฝ๋๋ visited ๋ฐฐ์ด์ ์ฌ์ด์ฆ๋ฅผ ๋ฆฌํดํฉ๋๋ค.
true์ธ ์์์ ๊ฐ์๋ฅผ ๋ฆฌํดํ๋ ๊ฒ์ด ์๋๋ผ์...
2. Kotlin์ equals(), ==, ===
java์ ==๋ primitive type์ ๊ฒฝ์ฐ ๊ฐ์ ๋น๊ตํ๊ณ , reference type์ ๊ฒฝ์ฐ ์ฃผ์๋ฅผ ๋น๊ตํฉ๋๋ค.
๋ฌผ๋ก ์๋ฐํ๊ฒ ๋งํ์๋ฉด primitive type์ ๊ฒฝ์ฐ์๋ Constance Pool์ ์กด์ฌํ๋ ํน์ ์์์ ์ฃผ์๊ฐ์ ๋น๊ตํ๋ ๊ฑฐ๋๊น ์ ํํ value๋ฅผ ๋น๊ตํ๋ ๊ฒ์ ์๋๋๋ค.
์๋ฌดํผ ๊ฐ์ฒด๊ฐ ๋ค์ด์ค๋ฉด ๊ฐ์ฒด์ ์ฃผ์๊ฐ์ ๋น๊ตํฉ๋๋ค.
์ด๋ ๊ฐ์ฒด์ ์ฃผ์๊ฐ์ด ๊ฐ์ผ๋ฉด true๋ฅผ ๋ฐํํ๋๋ฐ, ๊ทธ๋ฅ ๊ฐ์ ๊ฐ์ฒด๋ผ๋ ๋ป์ด์ฃ .
์ด๊ฑธ ๋์ผ์ฑ์ด๋ผ๊ณ ํฉ๋๋ค.
์ด๋ ๊ฐ์ฒด์ ๊ฐ์ ๋น๊ตํ๊ธฐ ์ํด์๋ ์ผ๋ฐ์ ์ผ๋ก equals()๋ฅผ ์ฌ์ฉํ๋๋ฐ์.
"์ผ๋ฐ์ ์ธ" String ๊ฐ์ฒด์ ๊ฒฝ์ฐ eqauls()๊ฐ ๋ฏธ๋ฆฌ ์ค๋ฒ๋ผ์ด๋ฉ๋์ด ์์ต๋๋ค.
๊ทธ๋์ ์ฃผ์๊ฐ์ด ์๋๋ผ ๊ฐ ๋น๊ต๋ฅผ ํด ์ค๋๋ค.
์ฃผ์๊ฐ์ด ๋ฌ๋ผ๋ ๊ฐ์ ๋์ผํ ์ ์์ฃ .
์ด๊ฑธ ๋๋ฑ์ฑ์ด๋ผ๊ณ ํฉ๋๋ค.
๋์ผ์ฑ identity
๋์ผํ๋ค๋ ๋ป์ผ๋ก, ๋ ๊ฐ์ ๊ฐ์ฒด๊ฐ ์์ ํ ๊ฐ์ ๊ฒฝ์ฐ๋ฅผ ๋ปํ๋ค.
์ฃผ์๊ฐ์ด ๊ฐ๋ค.
๋๋ฑ์ฑ equality
๋๋ฑํ๋ค๋ ๋ป์ผ๋ก, ๋ ๊ฐ์ ๊ฐ์ฒด๊ฐ ๋๋ฑํ ์ ๋ณด๋ฅผ ๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ๋ปํ๋ค.
์ฃผ์๊ฐ์ด ๋ฌ๋ผ๋ ๊ฐ์ ๋์ผํ ์ ์์ผ๋ฏ๋ก, ๋์ผ์ฑ์ด ์ฑ๋ฆฝํ์ง ์๋๋ผ๋ ๋๋ฑ์ฑ์ด ์ฑ๋ฆฝํ ์ ์๋ค.
๋ค๋ฅธ ๊ฐ์ฒด๋ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ค๋ฅด๊ณ ์ํ๋ ๋์์ ํ์ง ์์ ์๋ ์์ด์ ํ์ํ ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ์ง์ ์ค๋ฒ๋ผ์ด๋ฉํด์ผ ํฉ๋๋ค.
์์ฃผ ๋ถ์น์ ํ์ฃ ?
๊ทธ๋ฌ๋ Kotlin์ ๋ค๋ฆ ๋๋ค.
Kotlin์ == ์ฐ์ฐ์๊ฐ equals()์ ๋๋ค.
์ฆ ๋๋ฑ์ฑ์ ๊ฒ์ฌํฉ๋๋ค.
๊ณต์ ๋ฌธ์์์ ์น์ ํ๊ฒ ์ค๋ช ํด์ฃผ๊ณ ์์ต๋๋ค. ํท๊ฐ๋ฆฌ๋ ์ฌ๋์ด ์ผ๋ง๋ ๋ง์๊ธธ๋...
Equality | Kotlin
kotlinlang.org
๊ทธ๋ฐ๋ฐ ์ด๊ฑธ ๋ณธ ํ์๋ ์ด๊ฒ ๋ง๋ ์ถ์ ๋ถ๋ถ์ด ์์์ต๋๋ค.
// isUnique ์ฃผ์ ๋ฐ์ for๋ฌธ์ ๋ณด์๋ฉด ๋ด๋ถ์์ count() ๋ฅผ ์ฌ์ฉํด์ ์์ ๊ฐ์๋ฅผ ์ธ๊ณ ์๋ ๊ฒ์ ๋ณด์ค ์ ์๋๋ฐ์.
์ด ๋ถ๋ถ์ ๋๋ค.
// isUnique
for (key in keys) {
if (keys.count { it == key } != 1)
return false
}
๊ทธ๋ฐ๋ฐ ์ด ๋๋ค์์์ it๊ณผ key์ type์ List<String>์ ๋๋ค.
ํน๊ฐ Kotlin์ด list์ ๋ด๋ถ ์์๊น์ง ๋ค์ฌ๋ค๋ณด๋ฉด์ ๋๋ฑ์ฑ ์ฒดํฌ๋ฅผ ํด ์ฃผ๋ ๊ฑธ๊น์?
๋๋๊ฒ๋ ๋ง์ต๋๋ค.
equals - Kotlin Programming Language
kotlinlang.org

ํด์ํด ๋๋ฆด๊ฒ์.
ํ๋ผ๋ฏธํฐ๋ก ๋ค์ด์จ ์ธ์คํด์ค๊ฐ "๋๊ฐ์ ์ฌ์ด์ฆ"์ด๊ณ , "๋๊ฐ์ ์์"๋ฅผ "๋๊ฐ์ ์์"๋ก ๊ฐ์ง ๋ฆฌ์คํธ๋ผ๋ฉด return true
์ ๋๋ค.
๊ทธ๋์ ๋จ 4์ค๋ง์ผ๋ก ๊ฐ๋ ์ฑ ๋๋ด์ฃผ๋ for๋ฌธ์ด ์์ฑ๋ฉ๋๋ค. ๋ ์ค์ด๋ฉด ๋ฌด๋ ค 3์ค์ด์์.
์งฑ์ด์ผ!
์ ๋ ์ ์ธํ์ด ๋๋ฌด ์ข์์.
์๋ฌดํผ ์๋ ๋์ถฉ ์งฐ๋๋ฐ ์ผ๋จ๊ฒฐ์ ์ ๋์๊ฐ๊ธธ๋ ์ฅ ์ ๋์๊ฐ์ง ์ถ์ด์ ์์๋ณธ ๋ด์ฉ์ ๋๋ค.
๋ง์์ง๋ง ๊ถ๊ธํ์ด์.
3. ์ ์ผ์ฑ ๊ฒ์ฌ
์์ ์ฝ๋์ // isMinimal ์ฃผ์์ ๋ฌ์์ค ํํธ์์ ์ ์ผ์ฑ ๊ฒ์ฌ๋ฅผ ํ๋๋ฐ์.
์๋์ ๊ฐ์ ์ฝ๋์ ๋๋ค.
// isMinimal
if (visited.count { it } == 1) return true
var count = 0
for (i in 0 until keys[0].size) {
var testKeys = keys.map { it.filterIndexed { index, _ -> index != i } }
for (key in testKeys) {
if (testKeys.count { it == key } != 1) {
count++
break
}
}
}
์ด ์ ์ผ์ฑ ๊ฒ์ฌ๋ ์ด๋ป๊ฒ ๋์๊ฐ์ผ ํ๋๋ฉด, ๋ชจ๋ ์์๊ฐ "์กฐํฉ์์ ๋น ์ง๋ฉด ํ๋ณดํค๊ฐ ๋ ์ ์๋ ์์"์ฌ์ผ ํฉ๋๋ค.
๊ทธ๋์ ์์๊ฐ ๋ ๋น ์ง ์ ์๋ ์กฐํฉ, ์ฆ ์์ 1๊ฐ์ง๋ฆฌ ์กฐํฉ์ผ ๋๋ ๊ทธ๋๋ก ๋ฆฌํดํด ์ฃผ์๊ณ ์.
๊ทธ ์ด์์ผ ๋๋ count ๋ณ์๋ฅผ ๋์์ต๋๋ค.
for๋ฌธ ๋ด๋ถ์ testKeys๋ ๋ฐ๋ณต๋ฌธ์ด ๋ ๋๋ง๋ค "์๋ ์กฐํฉ"์์ ๋ชจ๋ ์์ฑ์ ํ๋์ฉ ๋นผ์ ์๋กญ๊ฒ ๋ง๋ ๋ฐ์ดํฐ์ ๋๋ค.
์ด๋ ๊ฒ ๋ง๋ค์ด์ง ๋ฐ์ดํฐ๋ ๋น์ฐํ ์๋ณ๋๋ฉด ์ ๋ฉ๋๋ค.
์ฆ, ์๋ณ์ด ๋์ง ์๋๋ค๋ฉด ์ฌ๋ฐ๋ฅธ ์กฐํฉ์ ๋๋ค.
๊ทธ๋ฌ๋๊น ๋ชจ๋ ์์ฑ์ ํ๋์ฉ ๋นผ์ ์ ๋ถ ํ ์คํธ๋ฅผ ํ์ ๋ ์ ๋๋ก ์๋ณ๋๋ ๊ฒฝ์ฐ๊ฐ ํ๋๋ผ๋ ์์ผ๋ฉด ์ ๋๋ ๊ฒ์ด์ฃ .
for๋ฌธ์ ๋ค ๋์์ ๋ count์ ๊ฐ์ด visited ๋ฐฐ์ด์ ๊ฐ์ด true์ธ ์์์ ๊ฐ์์ ๋์ผํ๋ฉด ๋ชจ๋ ๊ฒ์ฌ๊ฐ ์ ๋๋ ๊ฒ๋๋ค.
4. ์์ด & ์กฐํฉ
์๊น 1์ฐจ ์๋์์ ์์ด & ์กฐํฉ์ ์๋ชป ๊ตฌํํ์์ฃ .
๋ชฉํ๋ ์กฐํฉ์ ๋๋ค.
๊ทธ๋์ ์์๋ฅผ ์ ๊ฒฝ ์จ ์ค๋๋ค.
fun dfs(visited: BooleanArray, now: Int) {
if (checkCandidateKey(visited)) {
answer++
return
}
for (i in visited.indices) {
if (!visited[i] && now <= i) {
visited[i] = true
dfs(visited, i)
visited[i] = false
}
}
}
dfs ํจ์์ now๋ผ๋ ๋ณ์๋ฅผ ์ถ๊ฐํด์ ํ์ฌ ์ด๋ค ์ธ๋ฑ์ค๋ฅผ ๋ฐฉ๋ฌธํ๋์ง ๊ธฐ๋กํด ์ฃผ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ if๋ฌธ์ ์กฐ๊ฑด์ ํ๋ ๋ ๋ฃ์ด ์ฃผ์์ด์.
now <= i ์ ๋๋ค.
์ด ์กฐ๊ฑด์ ์ถ๊ฐํด ์ฃผ๋ฉด ์กฐํฉ์ด ์ค๋ฆ์ฐจ์์ผ๋ก ํ๋๋ง ์ธ์ด์ง๋๋ค.
๋ฑํธ ๋นผ๋ฉด ์ ๋ฉ๋๋ค.
์ ์ฒด ์ฝ๋ ๋ณด๋ฉด ์์๊ฒ ์ง๋ง dfs(visited, 0)๋ก ํจ์๋ฅผ ํธ์ถํ๋๋ฐ, 0์ด now๋ก ๋ค์ด๊ฐ์ ์์ํ false์ธ ์ํ๋ก ์คํ๋ฉ๋๋ค.
์ ๋ต
class Solution {
fun solution(relation: Array<Array<String>>): Int {
var answer = 0
var visited = BooleanArray(relation[0].size)
fun checkCandidateKey(visited: BooleanArray): Boolean {
var keys = relation.map { it.filterIndexed { index, _ -> visited[index] } }
// isUnique
for (key in keys) {
if (keys.count { it == key } != 1) return false
}
// isMinimal
if (visited.count { it } == 1) return true
var count = 0
for (i in 0 until keys[0].size) {
var testKeys = keys.map { it.filterIndexed { index, _ -> index != i } }
for (key in testKeys) {
if (testKeys.count { it == key } != 1) {
count++
break
}
}
}
return count == visited.count { it }
}
fun dfs(visited: BooleanArray, now: Int) {
if (checkCandidateKey(visited)) {
answer++
return
}
for (i in visited.indices) {
if (!visited[i] && now <= i) {
visited[i] = true
dfs(visited, i)
visited[i] = false
}
}
}
dfs(visited, 0)
return answer
}
}
'๐ ๊ณต๋ถ > ๐ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ Kotlin ํ์ด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค ๊ผฌ์ธ ์ ๊น์ค - boj1365 (0) | 2023.07.27 |
---|---|
๋ฐฑ์ค ํํ์ - boj2932 (0) | 2023.07.11 |
๋ฐฑ์ค N๊ณผ M (9) - boj15663 (1) | 2023.04.24 |
์ฒซ ๊ธ (0) | 2023.04.07 |