[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ํ›„๋ณดํ‚ค /ํŒŒ์ด์ฌ /Python /2019 KAKAO BLIND RECRUITMENT /์นด์นด์˜ค ์ฝ”ํ…Œ
Algorithm/Programmers

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ํ›„๋ณดํ‚ค /ํŒŒ์ด์ฌ /Python /2019 KAKAO BLIND RECRUITMENT /์นด์นด์˜ค ์ฝ”ํ…Œ

728x90
๋ฐ˜์‘ํ˜•

 

๐Ÿ’กsolutions )

๐Ÿ’ฌ ํ•ด๋‹น ๋ฌธ์ œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ›„๋ณดํ‚ค ๊ฐœ๋…์„ ์•Œ๊ณ  ์žˆ์œผ๋ฉด ๋” ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค

๐Ÿ’ฌ ๋กœ์ง์€ ํฌ๊ฒŒ 3๋‹จ๊ณ„ => ์ „์ฒด ์กฐํ•ฉ ๊ตฌํ•˜๊ธฐ / ์œ ์ผ์„ฑ ๋งŒ์กฑํ•˜๋Š” ๊ฒฝ์šฐ๋งŒ ๊ฑฐ๋ฅด๊ธฐ / ์ตœ์†Œ์„ฑ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ œ๊ฑฐ

๐Ÿ’ฌ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” itertools ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ, ์ปฌ๋Ÿผ ์ธ๋ฑ์Šค๋ฅผ ์š”์†Œ๋กœ combinations ์กฐํ•ฉ ๊ตฌํ•˜๊ธฐ

๐Ÿ’ฌ ๊ฐ ์ธ๋ฑ์Šค์— ํ•ด๋‹นํ•˜๋Š” ๋ชจ๋“  ์†์„ฑ๋“ค์„ ํŠœํ”Œ ํ˜•ํƒœ๋กœ ๋ฝ‘๊ณ  ๊ทธ ๊ฐœ์ˆ˜๊ฐ€, ์ „์ฒด ํ–‰์˜ ๊ฐœ์ˆ˜์™€ ๋™์ผํ•œ์ง€ ํ™•์ธ ํ›„ ๋งŒ์กฑํ•˜๋Š” ๊ฒฝ์šฐ๋งŒ unique ๋ฆฌ์ŠคํŠธ์— ๋‹ด๊ธฐ (์œ ์ผ์„ฑ์„ ๋งŒ์กฑํ•˜๋Š” ๊ฒฝ์šฐ)

๐Ÿ’ฌ ์ตœ์†Œ์„ฑ์˜ ๊ฒฝ์šฐ unique ๋ฆฌ์ŠคํŠธ์—์„œ ํ•˜๋‚˜์”ฉ ๋ฝ‘๊ณ , ๊ทธ ๋‹ค์Œ ์š”์†Œ๋“ค๊ณผ์˜ ๊ต์ง‘ํ•ฉ์„ ๊ตฌํ•ด์„œ ๊ธธ์ด๋ฅผ ๋น„๊ตํ•œ๋‹ค. ๊ธธ์ด๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ๋งŒ ์š”์†Œ๋“ค์ด ๊ฒน์น˜๋Š” ๊ฒฝ์šฐ์ด๋‹ˆ ์ตœ์†Œ์„ฑ์„ ๋งŒ์กฑํ•˜์ง€ ์•Š์•„ discard๋กœ ์ œ๊ฑฐ. remove์˜ ๊ฒฝ์šฐ ์ง€์šฐ๋ ค๋Š” ์š”์†Œ๊ฐ€ ์—†์œผ๋ฉด KeyError๊ฐ€ ๋‚˜๋ฏ€๋กœ discard๋กœ ์ œ๊ฑฐ

 

๐Ÿ‘‡ ์•„๋ž˜ ์ฐธ๊ณ 

์ด๋ฒˆ ๋ฌธ์ œ์—์„œ๋Š” set ์ž๋ฃŒํ˜•์˜ ํŠน์„ฑ์„ ํ™œ์šฉํ–ˆ๋‹ค. ์•„๋ž˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฉ”์†Œ๋“œ ์ •๋ฆฌ
1. remove() v.s discard() ๋ฉ”์†Œ๋“œ ๋น„๊ต
remove()๋Š” ์ง€์šฐ๋ ค๋Š” element๊ฐ€ ์—†์œผ๋ฉด KeyError ๋ฐœ์ƒ, discard()๋Š” ์ง€์šฐ๋ ค๋Š” element ์—†์–ด๋„ ์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋œ๋‹ค.
2. intersection()
๊ต์ง‘ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋กœ ์•„๋ž˜์ฒ˜๋Ÿผ &๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด, set()& set() ํ˜•ํƒœ๋กœ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
3. set ์ž๋ฃŒํ˜•์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•œ๋‹ค.
list ์ž๋ฃŒํ˜•์—์„œ append()์™€ extend() ์ฐจ์ด
append๋Š” ๋‹จ์ˆœํžˆ ๋งจ ๋’ค์— ํ•ด๋‹น ์š”์†Œ(1๊ฐœ)๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€๋งŒ, extend๋Š” iterableํ•œ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
extend๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ๋Š˜๋ฆฌ๋Š” ๋Š๋‚Œ(ํ™•์žฅ์˜ ์˜๋ฏธ)

 

๐ŸŽซcode )

from itertools import combinations as combi

def solution(relation):
    row = len(relation)
    col = len(relation[0])
    
    # ์ „์ฒด ์กฐํ•ฉ
    candidates = []
    for i in range(1, col + 1):
        candidates.extend(combi(range(col), i))

    # ์œ ์ผ์„ฑ
    unique = []
    for candi in candidates:
        tmp = [tuple([item[i] for i in candi]) for item in relation]
        if len(set(tmp)) == row:
            unique.append(candi)

    # ์ตœ์†Œ์„ฑ
    answer = set(unique)
    for i in range(len(unique)):
        for j in range(i + 1, len(unique)):
            if len(unique[i]) == len(set(unique[i]) & set(unique[j])):
                answer.discard(unique[j])

    return len(answer)

 

 

 

๐Ÿ“Œ description )

๋ฌธ์ œ์ถœ์ฒ˜ : programmers.co.kr/learn/courses/30/lessons/42890?language=python3

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ํ›„๋ณดํ‚ค

[["100","ryan","music","2"],["200","apeach","math","2"],["300","tube","computer","3"],["400","con","computer","4"],["500","muzi","music","3"],["600","apeach","music","2"]] 2

programmers.co.kr

๋ฌธ์ œ ์„ค๋ช…

ํ›„๋ณดํ‚ค

ํ”„๋ Œ์ฆˆ๋Œ€ํ•™๊ต ์ปดํ“จํ„ฐ๊ณตํ•™๊ณผ ์กฐ๊ต์ธ ์ œ์ด์ง€๋Š” ๋„ค์˜ค ํ•™๊ณผ์žฅ๋‹˜์˜ ์ง€์‹œ๋กœ, ํ•™์ƒ๋“ค์˜ ์ธ์ ์‚ฌํ•ญ์„ ์ •๋ฆฌํ•˜๋Š” ์—…๋ฌด๋ฅผ ๋‹ด๋‹นํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

๊ทธ์˜ ํ•™๋ถ€ ์‹œ์ ˆ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฒฝํ—˜์„ ๋˜์‚ด๋ ค, ๋ชจ๋“  ์ธ์ ์‚ฌํ•ญ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋„ฃ๊ธฐ๋กœ ํ•˜์˜€๊ณ , ์ด๋ฅผ ์œ„ํ•ด ์ •๋ฆฌ๋ฅผ ํ•˜๋˜ ์ค‘์— ํ›„๋ณดํ‚ค(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์˜ ๋ชจ๋“  ํŠœํ”Œ์€ ์œ ์ผํ•˜๊ฒŒ ์‹๋ณ„ ๊ฐ€๋Šฅํ•˜๋‹ค.(์ฆ‰, ์ค‘๋ณต๋˜๋Š” ํŠœํ”Œ์€ ์—†๋‹ค.)

์ž…์ถœ๋ ฅ ์˜ˆ

 

์ž…์ถœ๋ ฅ ์˜ˆ #1
๋ฌธ์ œ์— ์ฃผ์–ด์ง„ ๋ฆด๋ ˆ์ด์…˜๊ณผ ๊ฐ™์œผ๋ฉฐ, ํ›„๋ณด ํ‚ค๋Š” 2๊ฐœ์ด๋‹ค.

 

๋ฐ˜์‘ํ˜•