๐ธ FrogRiverOne ๋ฌธ์ ํด๊ฒฐ (Codility) โ
๐ ๋ฌธ์ ์ค๋ช โ
๊ฐ๊ตฌ๋ฆฌ๋ ์์น 0
์์ ์ถ๋ฐํ์ฌ ๋ชฉํ ์์น X
๋ก ์ ํํ๋ ค ํฉ๋๋ค. ๊ฐ ์์ N
๊ฐ์ ๋๋ญ์์ด ๋จ์ด์ง๋ฉฐ, ๋ฐฐ์ด A
์ ์ธ๋ฑ์ค๋ ์๊ฐ(time) ์ ๋ํ๋ด๊ณ , ๊ฐ์ ๋๋ญ์์ด ๋จ์ด์ง ์์น(position) ๋ฅผ ์๋ฏธํฉ๋๋ค.
๊ฐ๊ตฌ๋ฆฌ๊ฐ ์์น X
๊น์ง ์ด๋ํ ์ ์๋ ์ต์ ์๊ฐ์ ์ฐพ๋ ๊ฒ์ด ๋ชฉํ์
๋๋ค. ๋ง์ฝ ๊ฑด๋ ์ ์๋ค๋ฉด -1
์ ๋ฐํํด์ผ ํฉ๋๋ค.
๐น ์ ๋ ฅ โ
- ์ ์
X
(๋ชฉํ ์์น) - ๋ฐฐ์ด
A
(๊ฐ ์๊ฐt
์A[t]
์์น์ ๋๋ญ์์ด ๋จ์ด์ง)
๐น ์ถ๋ ฅ โ
- ๊ฐ๊ตฌ๋ฆฌ๊ฐ
X
๊น์ง ๋๋ฌํ ์ ์๋ ์ต์ ์๊ฐ - ๋ง์ฝ ๋๋ฌํ ์ ์๋ค๋ฉด
-1
๋ฐํ
๐ ์์ ๋ถ์ โ
X = 5
A = [1, 3, 1, 4, 2, 3, 5, 4]
๐น ๋ฐฐ์ด ํด์ โ
- ์๊ฐ
0
: ์์น1
์ ์์ด ๋จ์ด์ง โ - ์๊ฐ
1
: ์์น3
์ ์์ด ๋จ์ด์ง โ - ์๊ฐ
2
: ์์น1
์ ๋ ์์ด ๋จ์ด์ง (์ด๋ฏธ ์์) - ์๊ฐ
3
: ์์น4
์ ์์ด ๋จ์ด์ง โ - ์๊ฐ
4
: ์์น2
์ ์์ด ๋จ์ด์ง โ - ์๊ฐ
5
: ์์น3
์ ๋ ์์ด ๋จ์ด์ง (์ด๋ฏธ ์์) - ์๊ฐ
6
: ์์น5
์ ์์ด ๋จ์ด์ง โ (๋ชจ๋ 1~5๊ฐ ์ฑ์์ง)
๐น ๊ฒฐ๊ณผ โ
๊ฐ๊ตฌ๋ฆฌ๋ ์๊ฐ 6
์ ๋ชจ๋ ์์ด ์ฑ์์ ธ์ X=5
๊น์ง ์ ํ ๊ฐ๋ฅ!
๐ ์ต์ ์๊ฐ์ 6
!
๐จ ์ด์ ์ฝ๋ (๋นํจ์จ์ ์ธ O(N * X)) โ
function solution(X: number, A: number[]): number {
const leaves = Array(X + 1).fill(false)
leaves[0] = true
const isFull = () => leaves.every(Boolean)
let leafIdx = 0
while (leafIdx < A.length) {
leaves[A[leafIdx]] = true
if (isFull()) break
leafIdx++
}
return leafIdx
}
๐ ๊ฐ์ ๋ ์ฝ๋ ๊ตฌํ (O(N)) โ
function solution(X: number, A: number[]): number {
const leaves = new Set<number>() // ๊ฐ๊ตฌ๋ฆฌ๊ฐ ๋ฐ์ ์ ์๋ ์์น ์ ์ฅ
for (let time = 0; time < A.length; time++) {
leaves.add(A[time]) // ์๋ก์ด ์ ์์น ์ถ๊ฐ
if (leaves.size === X) return time // X๊ฐ ์์น๊ฐ ๋ชจ๋ ๋ฑ์ฅํ์ผ๋ฉด ๋ฐํ
}
return -1 // ๋๊น์ง ๋ค ํ์ธํ๋๋ฐ X์ ๋๋ฌ ๋ถ๊ฐ๋ฅ
}
๐ก ๊ฐ์ ์ด์ โ
โ ์ด์ ์ฝ๋ ๋ฌธ์ ์ โ
isFull()
ํจ์ (leaves.every(Boolean)
)์ O(X) ๋นํจ์จ์ฑwhile
๋ฃจํ ๋ด์์O(X)
์ ์ฐ์ฐ์ ๋ฐ๋ณต ์ํํ์ฌ O(N * X) ์๊ฐ ๋ณต์ก๋ ๋ฐ์
leaves[0] = true
๋ถํ์ํ ์์- ๊ฐ๊ตฌ๋ฆฌ๋
1~X
๋ง ํ์ํ๋ฏ๋ก0
๋ฒ ์ธ๋ฑ์ค๋ ๋ถํ์ํ ๊ณต๊ฐ ๋ญ๋น
- ๊ฐ๊ตฌ๋ฆฌ๋
๋ฐ๋ณต๋ฌธ ์ค๊ณ ๋นํจ์จ
while
๋์for
๋ฃจํ๋ฅผ ์ฌ์ฉํ์ฌ ๋น ๋ฅด๊ฒ ํ์ถํ๋ ๊ฒ์ด ํจ์จ์
โ ๊ฐ์ ๋ ์ฝ๋ ์ฅ์ โ
- Set์ ์ฌ์ฉํ์ฌ O(N)์ผ๋ก ํด๊ฒฐ ๐
- ๋ฐฐ์ด ์ ์ฒด๋ฅผ ๋งค๋ฒ ํ์ธํ์ง ์๊ณ
Set.size === X
๋ฅผ ๋ง์กฑํ๋ฉด ์ฆ์ ์ข ๋ฃ - ๋ถํ์ํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ์ต์ํ
๐ ์์ ํ ์คํธ โ
console.log(solution(5, [1, 3, 1, 4, 2, 3, 5, 4])) // ์ถ๋ ฅ: 6
console.log(solution(5, [1, 3, 1, 4, 2, 3])) // ์ถ๋ ฅ: -1 (5๊ฐ ์์)
console.log(solution(2, [2, 2, 2, 2, 2, 2])) // ์ถ๋ ฅ: -1 (1์ด ์์)
console.log(solution(1, [1])) // ์ถ๋ ฅ: 0 (๋ฐ๋ก ๊ฑด๋ ์ ์์)
๐ ๊ฒฐ๋ก โ
โ
์ต์ ํ๋ O(N)
ํ์ด๋ก Codility 100% ํต๊ณผ ๊ฐ๋ฅ! ๐
โ
Set
์ ํ์ฉํ์ฌ ๋ถํ์ํ ์ฐ์ฐ ์ต์ํ!
โ
๊ฐ๋ฅํ ๋น ๋ฅด๊ฒ ๊ฐ๊ตฌ๋ฆฌ๊ฐ ๊ฑด๋ ์ ์๋ ์๊ฐ์ ์ฐพ๊ณ ์ฆ์ ๋ฐํ! ๐ฏ
์ด์ ๊ฐ๊ตฌ๋ฆฌ๊ฐ ๊ฐ์ ๊ฑด๋๋ ์ต์ ์๊ฐ์ ์ฝ๊ฒ ๊ตฌํ ์ ์์ต๋๋ค! ๐ธโจ