Skip to content

Conversation

@mj010504
Copy link
Collaborator

@mj010504 mj010504 commented Sep 11, 2025

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ

ํ›„๋ณดํ‚ค
https://school.programmers.co.kr/learn/courses/30/lessons/42890

โœ”๏ธ ์†Œ์š”๋œ ์‹œ๊ฐ„

40๋ถ„

โœจ ์ˆ˜๋„ ์ฝ”๋“œ

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ›„๋ณดํ‚ค์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
  • ์šฐ์„  ์กฐํ•ฉ์„ ํ†ตํ•ด ๋ชจ๋“  ํ‚ค์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์„ ๊ตฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ tv๋ผ๊ณ  ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  tv๊ฐ€ ์œ ์ผ์„ฑ์„ ๋งŒ์กฑํ•˜๋Š” ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” tv์˜ ์†์„ฑ๋“ค๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ๋ฐฐ์—ด์„ ๋งŒ๋“  ํ›„, Set<๋ฐฐ์—ด>์— ๋ชจ๋‘ ์ง‘์–ด๋„ฃ์–ด์„œ, Set์˜ size๊ฐ€ ๋ฆด๋ ˆ์ด์…˜์˜ ํŠœํ”Œ์˜ ์ˆ˜์™€ ๊ฐ™์€์ง€ ํ™•์ธํ•จ์œผ๋กœ์จ ์œ ์ผ์„ฑ์„ ๋งŒ์กฑํ•˜๋Š” ์ง€ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ , ์œ ์ผ์„ฑ์„ ๋งŒ์กฑํ•˜๋Š” ํ‚ค์˜ ์ง‘ํ•ฉ ๋˜ํ•œ Set<๋ฐฐ์—ด>๋กœ ๋งŒ๋“ค์–ด์„œ ์ €์žฅํ•ด๋‘์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ s๋ผ๊ณ  ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ตœ์†Œ์„ฑ์„ ๋งŒ์กฑ์‹œํ‚ค๋Š” ์ง€๋„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.
  • ์ตœ์†Œ์„ฑ์„ ๋งŒ์กฑํ•˜๋Š” ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด isMinimal์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ๋งŒ๋“ค์–ด๋‘์—ˆ๋˜ tv์˜ ๋ชจ๋“  ๋ถ€๋ถ„ ์ง‘ํ•ฉ์„ ๊ตฌํ•˜์—ฌ์„œ ํ•˜๋‚˜๋ผ๋„ s์— ํฌํ•จ๋œ๋‹ค๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์–ด๋–ค tv์˜ ๋ถ€๋ถ„ ์ง‘ํ•ฉ๋„ s์— ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ตœ์†Œ์„ฑ์„ ๋งŒ์กฑํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ตœ์ข…์ ์œผ๋กœ, ์œ ์ผ์„ฑ๊ณผ ์ตœ์†Œ์„ฑ์„ ๋ชจ๋‘ ๋งŒ์กฑํ•œ๋‹ค๋ฉด s์— tv๋ฅผ ์ง‘์–ด๋„ฃ์–ด์„œ s์˜ size๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“š ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ๋œ ๋‚ด์šฉ

  • ์ตœ์†Œ์„ฑ์„ ๋งŒ์กฑํ•˜๋Š” ์ง€ ํ™•์ธํ•˜๋Š” ๋กœ์ง์„ ์งœ๋Š” ๋ถ€๋ถ„์—์„œ tv๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ •์—์„œ๋งŒ s์— ํฌํ•จ๋˜๋Š” ์ง€ ํ™•์ธํ•˜๋Š” ์‹์œผ๋กœ ๋กœ์ง์„ ์งฏ๋Š”๋ฐ ์˜ˆ์™ธ๊ฐ€ ๋งŽ์•˜์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ ์˜ˆ์™ธ๋ฅผ ์ƒ๊ฐํ•˜๊ณ  ํ’€์ด์— ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ์ฝ”๋“œ๋Š” isMinimal ํ•จ์ˆ˜ ์—†์ด ์ฒ˜์Œ์— ์ž˜๋ชป ์งฐ๋˜ ์ตœ์†Œ์„ฑ์„ ํ™•์ธํ•˜๋Š” ๋กœ์ง์ž…๋‹ˆ๋‹ค.

int solution(vector<vector<string>> v) {
    int n = v.size();
    int m = v[0].size();


    for(int i = 0; i < (1 << m); i++) {
        vector<int> tv;
        for(int j = 0; j < m; j++) {
            if(i & (1 << j)) {
                tv.push_back(j);
            }

            if(s.count(tv) == 1) break; // ์ตœ์†Œ์„ฑ ๋งŒ์กฑ
        }

        set<vector<string>> ts;
        for(int k = 0; k < n; k++) {
            vector<string> sv;
            for(int l = 0; l < tv.size(); l++) {
                sv.push_back(v[k][tv[l]]);
            }

            ts.insert(sv);
        }

        if(ts.size() == n) { // ์œ ์ผ์„ฑ ๋งŒ์กฑ
            s.insert(tv);
        }
    }

    return 

Copy link
Collaborator

@Seol-Munhyeok Seol-Munhyeok left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์—ฌ๋Ÿฌ ๋ฒˆ ํ’€์–ด๋ด๋„ ์ข‹์€ ๋ฐฐ์šธ ์ ์ด ๋งŽ์€ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ผ๋‹จ ์ง‘ํ•ฉ ํ‘œํ˜„์„ ์ด์šฉํ•˜์—ฌ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์˜ ๋ชจ๋“  ๋ถ€๋ถ„ ์ง‘ํ•ฉ์„ ๋ฝ‘์•„๋‚ด๊ณ , ๊ทธ ๋ถ€๋ถ„ ์ง‘ํ•ฉ์ด ์œ ์ผ์„ฑ๊ณผ ์ตœ์†Œ์„ฑ์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ์ •์˜ ๊ทธ๋Œ€๋กœ ๊ฒ€์‚ฌํ•˜๋ฉด ๋  ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.
์œ ์ผ์„ฑ๊ณผ ์ตœ์†Œ์„ฑ ๋งŒ์กฑ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•  ๋•Œ, ๋‹ค๋ฅธ ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด์•ผํ•˜๋‚˜ ๊ณ ๋ฏผํ–ˆ์ง€๋งŒ, ์ž…๋ ฅ ํฌ๊ธฐ๊ฐ€ 8, 20 ์ •๋„๋ผ์„œ ํšจ์œจ์„ฑ์€ ์ผ๋‹จ ๋ฌด์‹œํ•˜๊ณ  ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ํ’€๋ฉด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์ผ๋‹จ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

from itertools import combinations

def check_uniqueness(relation, subset):
    card = len(relation)
    check = []
    for i in range(card):
        temp = tuple(relation[i][j] for j in subset)
        check.append(temp)
    
    return len(check) == len(set(check))


def solution(relation):
    deg = len(relation[0])
    subsets = []
    for k in range(1, deg + 1):
        subsets.extend(combinations(range(deg), k))
    
    # ์œ ์ผ์„ฑ ์ฒดํฌ
    cands = []
    for subset in subsets:
        if check_uniqueness(relation, subset):
            cands.append(subset)
    
    # ์ตœ์†Œ์„ฑ ์ฒดํฌ
    result = []
    for cand in cands:
        is_minimal = True
        for key in result:
            if set(key).issubset(cand):
                is_minimal = False
                break
        if is_minimal:
            result.append(cand)
    
    return len(result)

๋ชจ๋“  ๋ถ€๋ถ„์ง‘ํ•ฉ์„ ๊ตฌํ•  ๋•Œ, combinations ๋ชจ๋“ˆ๋กœ ๋ชจ๋“  ๋ถ€๋ถ„ ์ง‘ํ•ฉ์„ ๋งŒ๋“ค๊ณ , ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฐ ๋ถ€๋ถ„ ์ง‘ํ•ฉ์„ ์ด์šฉํ•ด์„œ ์ค‘๋ณต ํŠœํ”Œ์ด ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.
์ค‘๋ณต ํŠœํ”Œ ๊ฒ€์‚ฌ๋Š” ๊ทธ๋ƒฅ ๋ฆฌ์ŠคํŠธ์˜ ํฌ๊ธฐ๋ž‘ set ์ž๋ฃŒํ˜•์œผ๋กœ ๋ฐ”๊พธ์—ˆ์„ ๋•Œ ํฌ๊ธฐ๊ฐ€ ๊ฐ™์œผ๋ฉด ์ค‘๋ณต์ด ์—†๋Š” ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

์ตœ์†Œ์„ฑ ๊ฒ€์‚ฌ๋Š” ์œ ์ผ์„ฑ์„ ๋งŒ์กฑํ•˜๋Š” ํ‚ค๋“ค์˜ ์ง‘ํ•ฉ(์Šˆํผํ‚ค๋ผ๊ณ  ํ•˜์ฃ ) ์ค‘์—์„œ ์ด๋ฏธ ์„ ํƒ๋œ ํ›„๋ณดํ‚ค K๊ฐ€ ํ˜„์žฌ ํ›„๋ณด C์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์ด๋ฉด C๋Š” ์ตœ์†Œ์„ฑ ์œ„๋ฐ˜ ์ด๋‹ค๋Š” ๋…ผ๋ฆฌ๋กœํ•ด์„œ ํ•˜๋‚˜ํ•˜๋‚˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์— ํ•ด๋‹นํ•˜๋Š”์ง€๋ฅผ ๊ฒ€์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ ํ’€์ดํ•  ๋•Œ๋Š” is_subset() ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„์„ ํ•ด์•ผํ•  ๊ฑฐ ๊ฐ™์•˜๋Š”๋ฐ ํŒŒ์ด์ฌ์˜ set ์ž๋ฃŒํ˜•์—๋Š” issubset() ํ•จ์ˆ˜๊ฐ€ ๋‚ด์žฅ๋˜์–ด์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ๋˜์–ด, ๋‚ด์žฅ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ๊ฑฐ๋ผ๋ฉด ์ด๋ ‡๊ฒŒ ํ•  ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค.

def is_subset(small, big):
    for elem in small:
        if elem not in big:
            return False
    return True

๋ณดํ†ต ๋ชจ๋“  ๋ถ€๋ถ„์ง‘ํ•ฉ์„ ๊ตฌํ•ด์•ผํ•˜๋Š” ๋ฌธ์ œ๋Š” dfs ๋˜๋Š” ๋น„ํŠธ๋งˆ์Šคํฌ๊ฐ€ ์ •์‹ ํ’€์ด์— ๊ฐ€๊นŒ์šด ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์€๋ฐ ๋‹ค์Œ์— ํ’€ ๋•Œ๋Š” dfs ๋˜๋Š” ๋น„ํŠธ๋งˆ์Šคํฌ๋กœ๋„ ํ’€์–ด๋ด์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค.

์ˆ˜๊ณ ํ–ˆ์–ด์š”!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants