문제:

풀이방법:

 컬럼의 길이가 최대 8이므로 가능한 모든 경우의 조합을 다 따져보아도 문제가 없을 것이라고 생각했다.(최대 2^8=256개이기 때문이다.) 따라서 우선 check 함수를 통해서 유일성을 만족하는지 파악을 했다.

 유일성을 만족하는 조합을 기준으로 서로 비교하면서 최소성을 만족하는지 확인하였다. 이들을 집합이라고 생각한다면 (1)은 (1,2)의 부분집합이 되게 된다. 따라서 set에서 부분집합인지 확인해주는 내장함수는 issubset을 사용해서 부분집합인지 확인하였다. 그리고 해당하는 조합이 있다면 remove를 통해서 제거해줬다.

 그리고 남은 answer의 길이를 구함으로써 후보키의 갯수를 얻을 수 있다.

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
29
30
31
def check(columns,tuples,relation):
    sets=set()
    for rel in relation:
        tup=''
        for col in columns:
            tup+=rel[col]
        sets.add(tup)
    if len(sets)==tuples:
        return True
    else:
        return False
 
 
def solution(relation):
    answer=[]
    import itertools
    columns=list(range(len(relation[0])))
    tuples=len(relation)
    for i in range(1,len(columns)+1):
        candidate=list(itertools.combinations(columns,i))
        for candi in candidate:
            if check(list(candi),tuples,relation):
                answer.append(list(candi))
    for i in answer[:]:
        for j in answer[:]:
            if i==j:
                continue
            if set(i).issubset(set(j)):
                answer.remove(j)
    return len(answer)
cs

문제링크:

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

'Algorithm > Python' 카테고리의 다른 글

[BOJ]1890. 점프  (0) 2019.10.04
[Programmers]2017 Kakao.다트 게임  (0) 2019.10.02
[Programmers]2018 Kakao.실패율  (0) 2019.09.30
[Programmers]2018 Kakao. 오픈채팅방  (0) 2019.09.29
[Programmers]2017 Kakao.비밀지도  (0) 2019.09.28

문제:

풀이방법:

 예시를 보면 이름이 없다는 것은 NAME의 값이 NULL임을 뜻하는 것이다. 따라서 NULL인 값을 찾기 위해서 WHERE 조건절을 사용해야 한다. NULL 다른 조건과는 달리 = 를 사용하지 않고 is를 사용한다. 따라서 WHERE NAME IS NULL을 사용해야 이름이 NULL인 값을 찾을 수 있다.

1
SELECT ANIMAL_ID FROM ANIMAL_INS WHERE NAME is NULL ORDER BY ANIMAL_ID;
cs

문제링크:

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

문제:

풀이방법:

 오름차순으로 정렬한 뒤에 1스테이지부터 차례대로 실패율을 구해 나갔다. n+1 스테이지를 구할 때에는 n스테이지까지 실패한 사람들은 포함시키면 안되므로 idx 값을 두어서 포함되지 않도록 하였다. 이렇게 구한 값들을 answer_rate에 dict 형식으로 저장을 한다. dict 타입으로 저장을 하고 items으로 이 값을 가져오면 스테이지에 대한 정보와 그 스테이지의 실패율을 튜플값으로 묶어서 알 수 있기 때문이다. 따라서 실패율을 기준으로 정렬을 하고 출력은 스테이지에 대한 정보만 출력하도록 하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def solution(N, stages):
    answer = []
    answer_rate={}
    number=1
    stages.sort()
    idx=0
    while((N+1)!=number):
        fail=0
        challenge=len(stages)
        for i in range(idx,len(stages)):
            if stages[i]==number:
                fail+=1
            else:
                break
        answer_rate[number]=fail/(challenge-idx)
        number+=1
        idx=i
    temp=sorted(list(answer_rate.items()),key=lambda x: x[1],reverse=True)
    for i in temp:
        answer.append(i[0])
    return answer
cs

문제링크:

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

'Algorithm > Python' 카테고리의 다른 글

[Programmers]2017 Kakao.다트 게임  (0) 2019.10.02
[Programmers]2018 Kakao.후보키  (0) 2019.10.01
[Programmers]2018 Kakao. 오픈채팅방  (0) 2019.09.29
[Programmers]2017 Kakao.비밀지도  (0) 2019.09.28
[Programmers]2017 Kakao.캐시  (0) 2019.09.27

문제:

풀이방법:

여러 기준으로 정렬을 하는 것은 ORDER BY 절에 컬럼들을 나열함으로써 해결할 수 있다. ORDER BY에 디폴트 값으론 오름차순으로 정렬로 설정이 되어 있지만 DESC라는 조건을 넣어주면 이를 내림차순으로 정렬할 수 있다.

1
SELECT ANIMAL_ID,NAME,DATETIME FROM ANIMAL_INS ORDER BY NAME,DATETIME DESC;
cs

문제링크:

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

문제:

풀이방법:

아이디에 따른 명령어와 이름을 해시 방식으로 저장을 해줌으로써 데이터를 관리하였다. 이름을 바꾸는 경우에는 맨마지막에 해당하는 이름으로 모두 반영이 되므로 Change가 나올 때마다 덮어주는 방식으로 진행하였다. 이 외에는 명령어에 따라서 알맞게 출력해주면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def solution(record):
    command=[]
    name={}
    for re in record:
        temp=re.split()
        if temp[0]=='Change':
            name[temp[1]]=temp[2]
        else:
            if temp[0]=='Enter':
                name[temp[1]]=temp[2]
            command.append((temp[0],temp[1]))
    answer=[]
    for cmd in command:
        if cmd[0]=="Enter":
            answer.append("{}님이 들어왔습니다.".format(name[cmd[1]]))
        else:
            answer.append("{}님이 나갔습니다.".format(name[cmd[1]]))
    return answer
cs

문제링크:

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

문제:

풀이방법:

SELECT를 사용하는 기본적인 방법이다. FROM 절에서 출력하기 원하는 컬럼명을 SELECT에 명시해주면 그 컬럼 값들만 출력해준다.

1
SELECT ANIMAL_ID,NAME FROM ANIMAL_INS ORDER BY ANIMAL_ID;
cs

문제링크:

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

 

문제:

풀이방법:

아픈 동물 찾기 문제와 유사한 문제이다. 문제의 조건에서 젊은 동물은 INTAKE_CONDITION이 Aged가 아닌 경우를 뜻하기 때문에 WHERE INTAKE_CONDITION != 'Aged' 와 같이 조건문을 넣어주었고, ANIMAL_ID로 정렬을 하라고 했기 때문에 ORDER BY를 넣어주었다.

1
SELECT ANIMAL_ID, NAME FROM ANIMAL_INS WHERE INTAKE_CONDITION != 'Aged' ORDER BY ANIMAL_ID;
cs

문제링크:

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

문제:

풀이방법:

정해진 조건에 해당하는 값들을 찾아야 하는 문제이다. 정해진 조건에 해당하는 부분은 WHERE절로 만족시켜야 한다. 

따라서 WHERE INTAKE_CONDITION='SICK' 은 INTAKE_CONDITION이 SICK인 값들, 즉 아픈 동물들을 뜻하게 된다. 

일반 SELECT~FROM 절에 이 WHERE 조건을 추가하면 아픈 동물의 값들만 얻을 수 있다.

1
SELECT ANIMAL_ID, NAME FROM ANIMAL_INS WHERE INTAKE_CONDITION='Sick';
cs

문제링크:

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

문제:

풀이방법:

ORDER BY에는 옵션이 존재한다. 아무 옵션도 주지 않으면 자동으로 ASC로 되어 있다. 하지만 이 문제와 같이 역순으로 정렬을 해야 한다는 조건이 있으면 DESC를 사용하면 된다.

1
SELECT NAME, DATETIME FROM ANIMAL_INS ORDER BY ANIMAL_ID DESC;
cs

문제링크:

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

문제:

풀이 방법:

최댓값을 구하는 함수인 MAX를 사용하면 된다. 또한 이 값을 시간이라고 컬럼명을 정했기 때문에 AS로 시간으로 지정했다.

1
SELECT MAX(DATETIME) AS "시간" FROM ANIMAL_INS;
cs

문제 링크:

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

+ Recent posts