Skip to content

프로그래머스 후보키 파이썬 | 카카오 코딩 테스트 – 후보키 (Python 풀이) 293 개의 가장 정확한 답변

카카오 코딩 테스트 - 후보키 (Python 풀이)

당신은 주제를 찾고 있습니까 “프로그래머스 후보키 파이썬 – 카카오 코딩 테스트 – 후보키 (Python 풀이)“? 다음 카테고리의 웹사이트 https://dienbienfriendlytrip.com 에서 귀하의 모든 질문에 답변해 드립니다: https://dienbienfriendlytrip.com/finance/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 ezsw 이(가) 작성한 기사에는 조회수 509회 및 좋아요 13개 개의 좋아요가 있습니다.

프로그래머스 후보키 파이썬 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 카카오 코딩 테스트 – 후보키 (Python 풀이) – 프로그래머스 후보키 파이썬 주제에 대한 세부정보를 참조하세요

2019 카카오 신입 공채 1차코딩 테스트
후보키 (파이썬 풀이)
Bit를 이용한 부분집합, 정렬

프로그래머스 후보키 파이썬 주제에 대한 자세한 내용은 여기를 참조하세요.

[프로그래머스] LEVEL2 후보키 (Python) – velog

[프로그래머스] LEVEL2 후보키. 문제 설명. 나의 풀이. 제한 조건에서 column의 길이가 1이상 8이하여서 combinations를 이용해 columns의 …

+ 여기를 클릭

Source: velog.io

Date Published: 6/10/2021

View: 1178

[프로그래머스] 후보키 /파이썬 /Python /2019 KAKAO BLIND …

[프로그래머스] 후보키 /파이썬 /Python /2019 KAKAO BLIND RECRUITMENT /카카오 코테. 함께 성장하고 싶은 개발자 2020. 9. 17. 16:09. 320×100.

+ 자세한 내용은 여기를 클릭하십시오

Source: whwl.tistory.com

Date Published: 6/4/2022

View: 7013

프로그래머스 2단계 – 후보키 (Python) – 코딩여왕

프로그래머스 2단계 – 후보키 (Python). 코딩여왕 2021. 12. 1. 01:44. https://programmers.co.kr/learn/courses/30/lessons/42890 · 코딩테스트 연습 – 후보키.

+ 여기를 클릭

Source: msiqoc.tistory.com

Date Published: 3/16/2022

View: 1250

[프로그래머스] Level 2 – 후보키 (Python)

[프로그래머스] Level 2 – 후보키 (Python) … 유일성 : 후보키 조합에 따라 relation을 돌면서 값들을 tuple 형태로 저장한 뒤, set(tuple)의 길이 …

+ 여기를 클릭

Source: ye0nn.tistory.com

Date Published: 10/27/2022

View: 3683

[프로그래머스 lv2] 후보키 (파이썬) – 라떼는말이야

2019 KAKAO BLIND RECRUITMENT 문제입니다. 문제 설명 후보키 프렌즈대학교 컴퓨터공학과 조교인 제이지는 네오 학과장님의 지시로, 학생들의 인적 …

+ 여기에 더 보기

Source: latte-is-horse.tistory.com

Date Published: 11/18/2021

View: 9510

프로그래머스 후보키 코드 및 해설 (파이썬) – codlingual

프로그래머스 후보키 코드 및 해설 (파이썬) … candate_keys라는 리스트에 유일성과 최소성을 모두 만족하는 후보키의 인덱스를 저장합니다.

+ 여기에 자세히 보기

Source: codlingual.tistory.com

Date Published: 2/16/2022

View: 8705

[프로그래머스] 후보키/파이썬 – TEAM EDA

그의 학부 시절 프로그래밍 경험을 되살려, 모든 인적사항을 데이터베이스에 넣기로 하였고, 이를 위해 정리를 하던 중에 후보키(Candate Key)에 …

+ 더 읽기

Source: eda-ai-lab.tistory.com

Date Published: 1/5/2021

View: 4626

[Programmers 프로그래머스] 42890 후보키 (PYTHON)

그의 학부 시절 프로그래밍 경험을 되살려, 모든 인적사항을 데이터베이스에 넣기로 하였고, 이를 위해 정리를 하던 중에 후보키(Candate Key)에 대한 …

+ 더 읽기

Source: kunduz.tistory.com

Date Published: 4/12/2022

View: 8113

[프로그래머스 / programmers] 후보키 – python – 산타는 없다

그의 학부 시절 프로그래밍 경험을 되살려, 모든 인적사항을 데이터베이스에 넣기로 하였고, 이를 위해 정리를 하던 중에 후보키(Candate Key)에 …

+ 여기에 더 보기

Source: ledpear.tistory.com

Date Published: 5/4/2022

View: 3550

[프로그래머스] 후보키 – 파이썬(Python) – 컴공생의 다이어리

[프로그래머스] 후보키 – 파이썬(Python). from itertools import combinations def solution(relation): len_key = len(relation[0]) candate_key …

+ 여기에 더 보기

Source: computer-science-student.tistory.com

Date Published: 9/2/2021

View: 3986

주제와 관련된 이미지 프로그래머스 후보키 파이썬

주제와 관련된 더 많은 사진을 참조하십시오 카카오 코딩 테스트 – 후보키 (Python 풀이). 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

카카오 코딩 테스트 - 후보키 (Python 풀이)
카카오 코딩 테스트 – 후보키 (Python 풀이)

주제에 대한 기사 평가 프로그래머스 후보키 파이썬

  • Author: ezsw
  • Views: 조회수 509회
  • Likes: 좋아요 13개
  • Date Published: 2021. 4. 28.
  • Video Url link: https://www.youtube.com/watch?v=7f1yXtfbWKY

[프로그래머스] LEVEL2 후보키 (Python)

[프로그래머스] LEVEL2 후보키

🧐 문제 설명

😍 나의 풀이

제한 조건에서 column의 길이가 1이상 8이하여서 combinations를 이용해 columns의 가능한 모든 인덱스 조합을 구했다. 그렇게 나온 조합들을 대상으로 유일성을 먼저 검사 → 최소성을 검사 해서 나온 값들을 unique라는 리스트에 넣어 그 길이를 출력했다.

유일성 을 검사하는 아이디어는 조합의 인덱스 조합을 릴레이션 item에 해당하는 속성 값을 추출해서 tuple에 담아 리스트로 모아둔 값이 row의 길이와 같은지 체크했다.(중복성 체크)

최소성을 검사하는 아이디어는 유일성을 검사하고 나온 튜플 set들을 set의 부분집합인지 찾는 메소드인 issubset()을 사용해서 아닌 경우들만 unique 리스트에 넣었다.

이 과정에서 발생한 문제점은 최소성을 검사할 때 issubset()을 사용하려고 하니까 자료형이 set이어야 했다. 또, 원래 코드는 유일성 검사된 인덱스 조합만 리스트에 먼저 넣어놓고 리스트를 이중 for문으로 검사하면서 issubset()을 사용하려고 했는데 set()에서는 subscriptable이 허용되지 않았다. 즉, set은 각각의 요소에 접근이 불가능했다. 그렇다고 tuple, list형태에서는 set의 메소드 issubset()을 사용 못해서 어려웠다.

from itertools import combinations def solution ( relation ) : row = len ( relation ) col = len ( relation [ 0 ] ) combi = [ ] for i in range ( 1 , col + 1 ) : combi . extend ( combinations ( range ( col ) , i ) ) unique = [ ] for i in combi : tmp = [ tuple ( [ item [ key ] for key in i ] ) for item in relation ] if len ( set ( tmp ) ) == row : put = True for x in unique : if set ( x ) . issubset ( set ( i ) ) : put = False break if put : unique . append ( i ) return len ( unique )

👏 다른 사람의 풀이

비트 연산을 이용한 풀이. 이 풀이는 4개의 컬럼을 조합하는 모든 경우의 수는 4비트로 표현 가능하다는 점에서 조합부터 비트를 이용했다. 예를 들어 학번만 포함하는 경우 0001, 학번과 이름을 포함하는 경우 0011 이런식… 어떻게 생각하지 이걸

def solution ( relation ) : answer_list = list ( ) for i in range ( 1 , 1 << len ( relation [ 0 ] ) ) : tmp_set = set ( ) for j in range ( len ( relation ) ) : tmp = '' for k in range ( len ( relation [ 0 ] ) ) : if i & ( 1 << k ) : tmp += str ( relation [ j ] [ k ] ) tmp_set . add ( tmp ) if len ( tmp_set ) == len ( relation ) : not_duplicate = True for num in answer_list : if ( num & i ) == num : not_duplicate = False break if not_duplicate : answer_list . append ( i ) return len ( answer_list ) 🥇 Today I Learn append()와 extend() 차이 append()는 리스트에 요소 추가 x = [ 1 , 2 , 3 ] x . append ( [ 4 , 5 ] ) - - - - - - - - - - - - - - - - - - - x = [ 1 , 2 , 3 , [ 4 , 5 ] ] extend()는 리스트에 같은 배열로 추가(확장) x = [ 1 , 2 , 3 ] x . extend ( [ 4 , 5 ] ) - - - - - - - - - - - - - - - - - - x = [ 1 , 2 , 3 , 4 , 5 ] Tuple 요소를 삭제하거나 변경할 수 없다(immutable, 불변성) → 일단 정의되고 나면 값을 추가, 변경할 수 없음. 추가하려면 리스트로 변경해서 append()하고 다시 튜플로 변환하는 것뿐... → 일단 정의되고 나면 값을 추가, 변경할 수 없음. indexing 가능(iterable) 다른 타입의 데이터를 같이 담을 수 있음 ex) ('abc', 1, 2, 3) Set 순서가 없고 중복이 불가능한 자료형 요소들 간 순서가 없어서 indexing이 불가능(Not iterable) 가변성(mutable) Set에서 사용하는 함수 add(값) - 집합에 새로운 값을 추가한다. (중복된 값은 무시) remove(값) - 전달받은 값을 삭제 (없을 때 에러 메시지를 출력) discard(값) - 전달받은 값을 삭제 (없을 때 그냥 무시) clear() - 집합에 있는 모든 값을 삭제 s = { 1 , 2 , 3 , 4 , 5 } s . add ( 6 ) - - - - - - - - - - - - - - - - - - - s = { 1 , 2 , 3 , 4 , 5 , 6 } s . remove ( 7 ) s . discard ( 6 ) - - - - - - - - - - - - - - - - - - - s = { 1 , 2 , 3 , 4 , 5 } s . clear ( ) - - - - - - - - - - - - - - - - - - - s = { } isdisjoint() - 두 집합이 공통 원소를 갖지 않는가? issubset() - 부분집합(subset)인가? issuperset() - 확대집합(superset)인가? → True or False 출력함 union() - 합집합을 만들어 리턴 update() - 합집합을 만들어 원본 데이터를 갱신(수정) difference() - 차집합을 만들어 리턴 intersection() - 교집합을 만들어 리턴

[프로그래머스] 후보키 /파이썬 /Python /2019 KAKAO BLIND RECRUITMENT /카카오 코테

문제 설명 후보키 프렌즈대학교 컴퓨터공학과 조교인 제이지는 네오 학과장님의 지시로, 학생들의 인적사항을 정리하는 업무를 담당하게 되었다. 그의 학부 시절 프로그래밍 경험을 되살려, 모든 인적사항을 데이터베이스에 넣기로 하였고, 이를 위해 정리를 하던 중에 후보키(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개이다.

프로그래머스 2단계 – 후보키 (Python)

https://programmers.co.kr/learn/courses/30/lessons/42890

참고 블로그:

https://whwl.tistory.com/104

알아둬야할 키포인트는 유일성과 최소성이다.

1. 유일성: 릴레이션에 있는 모든 튜플이 유일하게 실별된다. (ex: 학번)

2. 최소성: 릴레이션의 모든 튜플을 유일하게 식별하는 데에 꼭 필요한 속성들로만 구성돼야한다.

(ex: (학번, 이름)으로도 모든 튜플들을 식별 가능하지만 학번만으로도 가능하기 때문에 (학번, 이름)은 최소성을 만족시키지 못한다.)

알고리즘:

1. 조합을 이용해서 열 (학번, 이름, 전공, 학년) 에서의 모든 조합을 알아낸다. ((학번), (이름), …, (학번, 이름), ….)

2. 만약 중복을 제거했는데 원본과 길이가 같다면 유일성을 만족하는 것으로 간주한다. 유일성을 만족하는 것은 final 배열에 담는다.

(이름에서 중복을 제거하면 ryan, apeach, tube, con, muzi로 길이가 5이 되고 원래 길이는 6이였기 때문에 유일성을 만족하지 못한다고 할 수 있다.)

3. 최소성은 교집합을 이용한다. final 배열의 모든 두 원소를 한번씩 비교해서 교집합을 구한다. 예를 들어, 앞선 과정에서 final 배열에는 ((학번), …, (학번, 이름), …) 의 순서대로 저장돼있는데, (학번)과 (학번, 이름)의 교집합을 구하면 (학번)이 나오기 때문에 (학번, 이름)을 제거해주면 된다.

이용한 파이썬 스킬들:

1. set함수는 배열 안에서 중복을 제거해준다.

2. intersection 함수는 교집합을 구해준다. set(배열1).intersection(set(배열2))로 사용하거나 set(배열1) & set(배열2)로 사용할 수도 있다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 from itertools import combinations def solution(relation): answer = 0 rows = len (relation) cols = len (relation[ 0 ]) #유일성 candidates = [] for i in range ( 1 , cols + 1 ): candidates.extend(combinations( range (cols), i)) #(0), (1), … 이렇게 인덱스들이 들어가있다. 0~3까지 모든 조합을 알아내겠다는 뜻이다. final = [] for c in candidates: tmp = [tuple(item[key] for key in c) for item in relation] #인덱스를 객체로 만들어준다. if len (set(tmp)) = = rows: #모든 조합을 만들어준 tmp에서 중복을 제거한게 원래 행 길이와 같을 경우 final.append(c) answer = set(final) #set으로 만들어줘야 나중에 discard가 가능하다. #최소성 #set으로 해주고 순회하면 사전순대로 순회하게 된다는걸 기억해야한다. for i in range ( len (final)): for j in range (i + 1 , len (final)): if len (final[i]) = = len (set(final[i]).intersection(set(final[j]))): answer.discard(final[j]) return len (answer) Colored by Color Scripter cs

[프로그래머스 lv2] 후보키 (파이썬)

반응형

2019 KAKAO BLIND RECRUITMENT 문제입니다.

문제 설명

후보키

프렌즈대학교 컴퓨터공학과 조교인 제이지는 네오 학과장님의 지시로, 학생들의 인적사항을 정리하는 업무를 담당하게 되었다.

그의 학부 시절 프로그래밍 경험을 되살려, 모든 인적사항을 데이터베이스에 넣기로 하였고, 이를 위해 정리를 하던 중에 후보키(Candidate Key)에 대한 고민이 필요하게 되었다.

후보키에 대한 내용이 잘 기억나지 않던 제이지는, 정확한 내용을 파악하기 위해 데이터베이스 관련 서적을 확인하여 아래와 같은 내용을 확인하였다.

관계 데이터베이스에서 릴레이션(Relation)의 튜플(Tuple)을 유일하게 식별할 수 있는 속성(Attribute) 또는 속성의 집합 중, 다음 두 성질을 만족하는 것을 후보 키(Candidate Key)라고 한다. 유일성(uniqueness) : 릴레이션에 있는 모든 튜플에 대해 유일하게 식별되어야 한다. 최소성(minimality) : 유일성을 가진 키를 구성하는 속성(Attribute) 중 하나라도 제외하는 경우 유일성이 깨지는 것을 의미한다. 즉, 릴레이션의 모든 튜플을 유일하게 식별하는 데 꼭 필요한 속성들로만 구성되어야 한다.

제이지를 위해, 아래와 같은 학생들의 인적사항이 주어졌을 때, 후보 키의 최대 개수를 구하라.

위의 예를 설명하면, 학생의 인적사항 릴레이션에서 모든 학생은 각자 유일한 “학번”을 가지고 있다. 따라서 “학번”은 릴레이션의 후보 키가 될 수 있다.

그다음 “이름”에 대해서는 같은 이름(“apeach”)을 사용하는 학생이 있기 때문에, “이름”은 후보 키가 될 수 없다. 그러나, 만약 [“이름”, “전공”]을 함께 사용한다면 릴레이션의 모든 튜플을 유일하게 식별 가능하므로 후보 키가 될 수 있게 된다.

물론 [“이름”, “전공”, “학년”]을 함께 사용해도 릴레이션의 모든 튜플을 유일하게 식별할 수 있지만, 최소성을 만족하지 못하기 때문에 후보 키가 될 수 없다.

따라서, 위의 학생 인적사항의 후보키는 “학번”, [“이름”, “전공”] 두 개가 된다.

릴레이션을 나타내는 문자열 배열 relation이 매개변수로 주어질 때, 이 릴레이션에서 후보 키의 개수를 return 하도록 solution 함수를 완성하라.

제한사항

relation은 2차원 문자열 배열이다.

relation의 컬럼(column)의 길이는 1 이상 8 이하이며, 각각의 컬럼은 릴레이션의 속성을 나타낸다.

1 이상 8 이하이며, 각각의 컬럼은 릴레이션의 속성을 나타낸다. relation의 로우(row)의 길이는 1 이상 20 이하이며, 각각의 로우는 릴레이션의 튜플을 나타낸다.

1 이상 20 이하이며, 각각의 로우는 릴레이션의 튜플을 나타낸다. relation의 모든 문자열의 길이는 1 이상 8 이하이며, 알파벳 소문자와 숫자로만 이루어져 있다.

1 이상 8 이하이며, 알파벳 소문자와 숫자로만 이루어져 있다. relation의 모든 튜플은 유일하게 식별 가능하다.(즉, 중복되는 튜플은 없다.)

입출력 예

입출력 예

입출력 예 설명

입출력 예 #1

문제에 주어진 릴레이션과 같으며, 후보 키는 2개이다.

나의 풀이

사소한 실수 때문에 풀이가 오래걸린 문제였다…

우선 아이디어는 다음과 같다.

속성들을 조합할 수 있는 모든 경우의 수를 구한다. 각 경우의 속성만 가지는 하위 릴레이션을 만든다. 예를 들어 (학번, 전공) 의 경우 학번 속성와 전공 속성만을 가지는 릴레이션을 만든다. 만들어진 하위 릴레이션에 중복되는 row가 있는지 확인 중복되는 row가 없다면 슈퍼키 리스트에 추가한다. (슈퍼키는 유일성을 만족하지만 최소성은 만족하지 않아도 되는 키이다.) 슈퍼키 목록을 순회하며 최소성을 만족하는지 확인한다. 최소성까지 만족하면 해당 키는 유일성 + 최소성을 모두 만족하는 것이므로 후보키이다.

1. 속성들을 조합할 수 있는 모든 경우의 수

from itertoos import combinations def findKeys(relation): answer = [] allAttr = list(range(len(relation[0]))) for i in range(1, len(relation[0]) + 1): answer.extend(list(combinations(allAttr, i))) return answer

모든 속성 조합

조합을 하는 경우는 itertools의 combinations 라이브러리를 사용하여 쉽게 구할 수 있다.

문제에서 속성의 이름이 따로 주어지지 않기 때문에 임의로 속성 이름을 0부터 시작하는 숫자로 지정한다.

우선 allAttr에 속성의 수만큼 range 범위를 설정해 리스트로 만들었다.

예를 들어 속성의 수가 4개라면 [0, 1, 2, 3] 인 리스트를 만든 것이다.

combinations는 리스트에서 몇 개의 요소를 조합할 것인지 정할 수 있다.

문제에서는 모든 경우를 구해야 하기 때문에 1~속성개수 만큼 모두 조합하여 answer에 담을 것이다.

이때 answer.append()를 사용하지 않고 answer.extend()를 사용한 이유는

append는 해당 요소를 그대로 추가하기 때문에 여러 속성 조합 튜플이 담긴 하나의 리스트만 answer에 추가된다.

하지만 extend를 하면 리스트가 통으로 추가되는 것이 아닌 리스트의 요소들이 answer에 추가되는 것이기 때문에 extend를 선택했다.

이러한 과정으로 모든 경우의 수가 담긴 answer 리스트를 리턴한다.

2. 하위 릴레이션 만들기 ~ 3. 슈퍼 키 찾기

def solution(relation): allKeys = findKeys(relation) rSize = len(relation) # 하위 릴레이션 생성 superKeys = [] subRelation = [] for key in allKeys: subRelation.clear() for i in range(rSize): subRelation.append(tuple(relation[i][k] for k in range(len(relation[0])) if k in key)) # 유일성 확인 if len(set(subRelation)) == rSize: superKeys.append(key)

allKeys에 1번에서 만든 모든 경우의 수가 담긴 리스트를 받아온다.

이후부터는 각 조합을 “키”라고 칭한다.

rSize는 릴레이션의 튜플(row) 개수이다.

각 키를 순회하며 하위 릴레이션을 만든다.

그리고 그 subRelation을 set에 넣어 중복을 제거한 후 원래 릴레이션 크기인 rSize와 비교하여 같다면 중복이 없었다는 의미이므로 유일성이 확인된다.

유일성을 만족하는 키를 슈퍼키라고 부르며 슈퍼키를 superKeys 리스트에 저장하고 마지막에 리턴해준다.

유일성을 만족하는 슈퍼키

4. 후보 키 찾기

def findCandidate(superKeys): candidateKeys = [] cSize = len(superKeys) for i, sk in enumerate(superKeys): if sk is False: continue candidateKeys.append(sk) for c in range(i+1, cSize): if superKeys[c] is False: continue current = set(list(sk)) target = set(list(superKeys[c])) if current.issubset(target): superKeys[c] = False return candidateKeys

최종적으로 나온 후보키

위에서 구한 슈퍼 키를 매개변수로 받는다.

키들은 combinations에서 조합한 순서대로 입력이 되어있기 때문에 이미 크기 순으로 정렬되어 있다.

최소성을 만족하는지 확인하기 위한 로직은 다음과 같다.

슈퍼 키들을 크기 순으로 오름차순 정렬한다. 어떤 조합이 키 일 때 그 키를 포함하는 슈퍼 키는 유일성을 만족하지 못한다. 즉, 오름차순으로 순회하며 자신을 포함하는 키를 하나씩 제외시킨다.

예를 들어

문제의 예제에서 지금까지 생성된 슈퍼 키의 목록은 다음과 같다.

[(0,), (0, 1), (0, 2), (0, 3), (1, 2), (0, 1, 2), (0, 1, 3), (0, 2, 3), (1, 2, 3), (0, 1, 2, 3)]

오름차순으로 정렬되어 있고, 왼쪽부터 순회한다.

가장 처음 만나는 0은 후보키로 저장한다.

이후 0을 포함하는 모든 키를 제외한다.

그러면 [(0,), (1, 2), (1, 2, 3)] 이렇게 남는다.

다시 [(0,), (1, 2), (1, 2, 3)] 에서 (1, 2)를 후보키로 저장하고, 이후 (1, 2)를 포함하는 모든 키를 제외한다.

그러면 [(0,), (1, 2)] 이렇게 남는다.

모두 순회 했으므로 최종적으로 유일성과 최소성을 만족하는 후보키는 (0), (1, 2)가 된다.

마지막으로 후보키의 개수를 구하라고 했으니 len() 함수로 개수를 구하면 끝이다.

전체 코드

from itertools import combinations def solution(relation): # 모든 조합 구하기 allKeys = findKeys(relation) # 슈퍼키 구하기 (유일성 만족) superKeys = findSuper(relation, allKeys) # 후보키 구하기 (유일성 + 최소성 만족) candidateKeys = findCandidate(superKeys) return len(candidateKeys) def findKeys(relation): answer = [] allAttr = [i for i in range(len(relation[0]))] for i in range(1, len(relation[0]) + 1): answer.extend(list(combinations(allAttr, i))) return answer def findSuper(relation, keys): superKeys = [] subRelation = [] rSize = len(relation) for key in keys: subRelation.clear() for i in range(rSize): subRelation.append(tuple(relation[i][k] for k in range(rSize) if k in key)) if len(set(subRelation)) == rSize: superKeys.append(key) return superKeys def findCandidate(superKeys): candidateKeys = [] cSize = len(superKeys) for i, sk in enumerate(superKeys): if sk is False: continue candidateKeys.append(sk) for c in range(i+1, cSize): if superKeys[c] is False: continue current = set(list(sk)) target = set(list(superKeys[c])) if current.issubset(target): superKeys[c] = False return candidateKeys

테스트 결과

반응형

프로그래머스 후보키 코드 및 해설 (파이썬)

반응형

https://programmers.co.kr/learn/courses/30/lessons/42890

candidate_keys라는 리스트에 유일성과 최소성을 모두 만족하는 후보키의 인덱스를 저장합니다.

먼저 key, 혹은 column의 개수를 N으로 저장합니다.

그리고 1에서 N까지 증가하며 각 key의 combination을 구합니다. 이 combination에서 선택된 key들만을 이용해 각 학생을 표현하는 리스트인 current_key를 만들고, 이 current_key가 중복되는 경우 다음 combination으로 넘어갑니다.

하나도 중복되지 않는 경우, 최소성을 확인하기 위해 이미 구한 combination이 지금 구한 combination의 부분집합이 아닌지 확인합니다. 부분집합이 아니라면 current_key에 현재 combination을 추가합니다.

마지막으로 current_key의 길이를 반환합니다.

from itertools import combinations def solution(relation): # key의 개수 N = len(relation[0]) key_idx = list(range(N)) candidate_keys = [] for i in range(1,N+1): for comb in combinations(key_idx, i): hist = [] for rel in relation: current_key = [rel[c] for c in comb] # 하나라도 중복되는 경우: 식별 불가능 if current_key in hist: break else: hist.append(current_key) # 하나도 중복 안 된 경우: 식별 가능 else: for ck in candidate_keys: # 최소성 확인 if set(ck).issubset(set(comb)): break else: candidate_keys.append(comb) return len(candidate_keys)

반응형

[프로그래머스] 후보키

후보키

프렌즈대학교 컴퓨터공학과 조교인 제이지는 네오 학과장님의 지시로, 학생들의 인적사항을 정리하는 업무를 담당하게 되었다.

그의 학부 시절 프로그래밍 경험을 되살려, 모든 인적사항을 데이터베이스에 넣기로 하였고, 이를 위해 정리를 하던 중에 후보키(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의 모든 튜플은 유일하게 식별 가능하다.(즉, 중복되는 튜플은 없다.)

입출력 예

relation result [[“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

다른 사람 풀이

해당 문제는 풀이에 실패했고, 다른 사람의 풀이를 설명드리겠습니다.

아이디어 : 모든 경우의 수를 만든 후에 유일성, 최소성을 만족하지 않는 부분은 제거 candidates : combinations을 통해서 가능한 모든 경우의 수를 생성 final : 가능한 모든 경우의 수에서 유일성을 만족하는 지 확인 튜플 형태로 해당하는 값을 추출해서 길이가 맞는 지 확인합니다. 예) (100, 200, … , 600) 은 길이가 6으로 유일성 만족 answer : 최소성을 만족하는 부분만 추출 intersection을 통해서 겹치는 변수가 원본 변수가 같은게 있는 지 확인

from collections import deque from itertools import combinations def solution(relation): n_row = len(relation) n_col = len(relation[0]) candidates=[] for i in range(1,n_col+1): candidates.extend(combinations(range(n_col),i)) final=[] for keys in candidates: tmp=[tuple([item[key] for key in keys]) for item in relation] if len(set(tmp))==n_row: final.append(keys) answer=set(final[:]) for i in range(len(final)): for j in range(i+1,len(final)): if len(final[i])==len(set(final[i]).intersection(set(final[j]))): answer.discard(final[j]) return len(answer)

출처: 프로그래머스 코딩 테스트 연습,https://programmers.co.kr/learn/challenges

[Programmers 프로그래머스] 42890 후보키 (PYTHON)

728×90

https://programmers.co.kr/learn/courses/30/lessons/42890

문제 설명

후보키

프렌즈대학교 컴퓨터공학과 조교인 제이지는 네오 학과장님의 지시로, 학생들의 인적사항을 정리하는 업무를 담당하게 되었다.

그의 학부 시절 프로그래밍 경험을 되살려, 모든 인적사항을 데이터베이스에 넣기로 하였고, 이를 위해 정리를 하던 중에 후보키(Candidate Key)에 대한 고민이 필요하게 되었다.

후보키에 대한 내용이 잘 기억나지 않던 제이지는, 정확한 내용을 파악하기 위해 데이터베이스 관련 서적을 확인하여 아래와 같은 내용을 확인하였다.

관계 데이터베이스에서 릴레이션(Relation)의 튜플(Tuple)을 유일하게 식별할 수 있는 속성(Attribute) 또는 속성의 집합 중, 다음 두 성질을 만족하는 것을 후보 키(Candidate Key)라고 한다. 유일성(uniqueness) : 릴레이션에 있는 모든 튜플에 대해 유일하게 식별되어야 한다. 최소성(minimality) : 유일성을 가진 키를 구성하는 속성(Attribute) 중 하나라도 제외하는 경우 유일성이 깨지는 것을 의미한다. 즉, 릴레이션의 모든 튜플을 유일하게 식별하는 데 꼭 필요한 속성들로만 구성되어야 한다.

제이지를 위해, 아래와 같은 학생들의 인적사항이 주어졌을 때, 후보 키의 최대 개수를 구하라.

위의 예를 설명하면, 학생의 인적사항 릴레이션에서 모든 학생은 각자 유일한 “학번”을 가지고 있다. 따라서 “학번”은 릴레이션의 후보 키가 될 수 있다.

그다음 “이름”에 대해서는 같은 이름(“apeach”)을 사용하는 학생이 있기 때문에, “이름”은 후보 키가 될 수 없다. 그러나, 만약 [“이름”, “전공”]을 함께 사용한다면 릴레이션의 모든 튜플을 유일하게 식별 가능하므로 후보 키가 될 수 있게 된다.

물론 [“이름”, “전공”, “학년”]을 함께 사용해도 릴레이션의 모든 튜플을 유일하게 식별할 수 있지만, 최소성을 만족하지 못하기 때문에 후보 키가 될 수 없다.

따라서, 위의 학생 인적사항의 후보키는 “학번”, [“이름”, “전공”] 두 개가 된다.

릴레이션을 나타내는 문자열 배열 relation이 매개변수로 주어질 때, 이 릴레이션에서 후보 키의 개수를 return 하도록 solution 함수를 완성하라.

제한사항

relation은 2차원 문자열 배열이다.

relation의 컬럼(column)의 길이는 1 이상 8 이하이며, 각각의 컬럼은 릴레이션의 속성을 나타낸다.

1 이상 8 이하이며, 각각의 컬럼은 릴레이션의 속성을 나타낸다. relation의 로우(row)의 길이는 1 이상 20 이하이며, 각각의 로우는 릴레이션의 튜플을 나타낸다.

1 이상 20 이하이며, 각각의 로우는 릴레이션의 튜플을 나타낸다. relation의 모든 문자열의 길이는 1 이상 8 이하이며, 알파벳 소문자와 숫자로만 이루어져 있다.

1 이상 8 이하이며, 알파벳 소문자와 숫자로만 이루어져 있다. relation의 모든 튜플은 유일하게 식별 가능하다.(즉, 중복되는 튜플은 없다.)

입출력 예

relation result [[“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

이 문제를 해결하기 위해서 조합을 활용했습니다.

먼저 조합을 생성해 주고, 조합리스트를 문자열로 만들어서 비교를 해줍니다.

from itertools import combinations def solution(relation): answer = 0 temp = [i for i in range(len(relation[0]))] combi_lists = list() # 조합 생성 for cnt in range(1, len(relation[0]) + 1): combi_lists.append(list(combinations(temp, cnt))) # 조합리스트를 문자열로 변경 combi_str_list = list() for combi_list in combi_lists: for i in combi_list: combi_str_list.append(”.join(map(str, i))) while len(combi_str_list) > 0: candidate_key = list() is_candidate_key = True for r in relation: key = “” for j in combi_str_list[0]: key += r[int(j)] if key in candidate_key: is_candidate_key = False break else: candidate_key.append(key) if is_candidate_key is False: del combi_str_list[0] continue str_list = list(combi_str_list[0]) combi_str_list = [s for s in combi_str_list if any(str not in s for str in str_list)] answer += 1 return answer

728×90

LIST

[프로그래머스 / programmers] 후보키

문제 설명

프렌즈대학교 컴퓨터공학과 조교인 제이지는 네오 학과장님의 지시로, 학생들의 인적사항을 정리하는 업무를 담당하게 되었다.

그의 학부 시절 프로그래밍 경험을 되살려, 모든 인적사항을 데이터베이스에 넣기로 하였고, 이를 위해 정리를 하던 중에 후보키(Candidate Key)에 대한 고민이 필요하게 되었다.

후보키에 대한 내용이 잘 기억나지 않던 제이지는, 정확한 내용을 파악하기 위해 데이터베이스 관련 서적을 확인하여 아래와 같은 내용을 확인하였다.

관계 데이터베이스에서 릴레이션(Relation)의 튜플(Tuple)을 유일하게 식별할 수 있는 속성(Attribute) 또는 속성의 집합 중, 다음 두 성질을 만족하는 것을 후보 키(Candidate Key)라고 한다. 유일성(uniqueness) : 릴레이션에 있는 모든 튜플에 대해 유일하게 식별되어야 한다. 최소성(minimality) : 유일성을 가진 키를 구성하는 속성(Attribute) 중 하나라도 제외하는 경우 유일성이 깨지는 것을 의미한다. 즉, 릴레이션의 모든 튜플을 유일하게 식별하는 데 꼭 필요한 속성들로만 구성되어야 한다.

제이지를 위해, 아래와 같은 학생들의 인적사항이 주어졌을 때, 후보 키의 최대 개수를 구하라.

위의 예를 설명하면, 학생의 인적사항 릴레이션에서 모든 학생은 각자 유일한 “학번”을 가지고 있다. 따라서 “학번”은 릴레이션의 후보 키가 될 수 있다.

그다음 “이름”에 대해서는 같은 이름(“apeach”)을 사용하는 학생이 있기 때문에, “이름”은 후보 키가 될 수 없다. 그러나, 만약 [“이름”, “전공”]을 함께 사용한다면 릴레이션의 모든 튜플을 유일하게 식별 가능하므로 후보 키가 될 수 있게 된다.

물론 [“이름”, “전공”, “학년”]을 함께 사용해도 릴레이션의 모든 튜플을 유일하게 식별할 수 있지만, 최소성을 만족하지 못하기 때문에 후보 키가 될 수 없다.

따라서, 위의 학생 인적사항의 후보키는 “학번”, [“이름”, “전공”] 두 개가 된다.

릴레이션을 나타내는 문자열 배열 relation이 매개변수로 주어질 때, 이 릴레이션에서 후보 키의 개수를 return 하도록 solution 함수를 완성하라.

제한사항

relation은 2차원 문자열 배열이다.

relation의 컬럼(column)의 길이는 1 이상 8 이하이며, 각각의 컬럼은 릴레이션의 속성을 나타낸다.

1 이상 8 이하이며, 각각의 컬럼은 릴레이션의 속성을 나타낸다. relation의 로우(row)의 길이는 1 이상 20 이하이며, 각각의 로우는 릴레이션의 튜플을 나타낸다.

1 이상 20 이하이며, 각각의 로우는 릴레이션의 튜플을 나타낸다. relation의 모든 문자열의 길이는 1 이상 8 이하이며, 알파벳 소문자와 숫자로만 이루어져 있다.

1 이상 8 이하이며, 알파벳 소문자와 숫자로만 이루어져 있다. relation의 모든 튜플은 유일하게 식별 가능하다.(즉, 중복되는 튜플은 없다.)

입출력 예

입출력 예 설명

입출력 예 #1

문제에 주어진 릴레이션과 같으며, 후보 키는 2개이다.

[프로그래머스] 후보키

728×90

[프로그래머스] 후보키 – 파이썬(Python)

from itertools import combinations def solution(relation): len_key = len(relation[0]) candidate_key = [] for i in range(1, len_key + 1): for combi in combinations(range(len_key), i): # 후보키가 될수 있는 key들의 전체 조합 temp = list() for r in relation: curr = [r[c] for c in combi] # 현재 후보키 조합에 해당하는 튜플 데이터 if curr in temp: # 유일성을 만족하지 않는 경우 break else: temp.append(curr) else: for ck in candidate_key: if set(ck).issubset(set(combi)): # 최소성을 만족하지 않는 경우 break else: candidate_key.append(combi) return len(candidate_key)

https://programmers.co.kr/learn/courses/30/lessons/42890

728×90

키워드에 대한 정보 프로그래머스 후보키 파이썬

다음은 Bing에서 프로그래머스 후보키 파이썬 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 카카오 코딩 테스트 – 후보키 (Python 풀이)

  • 알고리즘
  • 코딩
  • 소프트웨어
  • 카카오 입사 문제
  • 카카오 코딩 테스트
  • Kakao codng test

카카오 #코딩 #테스트 #- #후보키 #(Python #풀이)


YouTube에서 프로그래머스 후보키 파이썬 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 카카오 코딩 테스트 – 후보키 (Python 풀이) | 프로그래머스 후보키 파이썬, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

Leave a Reply

Your email address will not be published. Required fields are marked *