문제:

풀이방법:

중복을 제거해주는 명령어인 DISTINCT를 사용해야 하는 문제이다. 우선 NULL인 경우는 집계하기지 않으므로 WHERE 조건절을 통해서 NULL이 아닌 값을 걸러내고 DISTINCT NAME을 통해서 중복되는 값을 지우고 이를 COUNT 하는 방법으로 진행했다.

1
SELECT COUNT(DISTINCT NAME) AS 'COUNT' FROM ANIMAL_INS WHERE NAME is not NULL;
cs

문제링크:

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

문제:

풀이방법:

SQL에는 갯수를 세주는 함수가 존재한다. COUNT라는 함수이며 COUNT(*)와 같이 사용하면 전체 갯수를 count한 값을 반환해준다.

1
SELECT COUNT(*) AS 'COUNT'  FROM ANIMAL_INS;
cs

문제링크:

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

문제:

풀이방법:

 문자열처리를 해야하는 문제이므로 정규표현식을 사용했다. 정규표현식에서 '\d+'는 숫자를 의미하고, '\D+'를 의미하므로 문자열을 숫자와 숫자가 아닌 것들로 분할하는 작업을 먼저 했다. 문자들을 가져온 배열을 보면 * 과 #이 붙어있는 경우가 있을 수 있으므로 길이로 이를 파악하였다. 길이가 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
29
30
31
def solution(dartResult):
    import re
    answer=[]
    regax=re.compile('\d+')
    regax2=re.compile('\D+')
    dartscore=regax.findall(dartResult)
    dartplus=regax2.findall(dartResult)
    for i in range(3):
        if len(dartplus[i])==2:
            if dartplus[i][0]=="S":
                answer.append(int(dartscore[i]))
            elif dartplus[i][0]=="D":
                answer.append(int(dartscore[i])**2)
            else:
                answer.append(int(dartscore[i])**3)
            if dartplus[i][1]=="*":
                if i==0:
                    answer[-1]=answer[-1]*2
                else:
                    answer[-1]=answer[-1]*2
                    answer[-2]=answer[-2]*2
            else:
                answer[-1]*=-1
        else:
            if dartplus[i][0]=="S":
                answer.append(int(dartscore[i]))
            elif dartplus[i][0]=="D":
                answer.append(int(dartscore[i])**2)
            else:
                answer.append(int(dartscore[i])**3)
    return sum(answer)
cs

문제링크:

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

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

[BOJ]1075. 나누기  (0) 2019.10.05
[BOJ]1890. 점프  (0) 2019.10.04
[Programmers]2018 Kakao.후보키  (0) 2019.10.01
[Programmers]2018 Kakao.실패율  (0) 2019.09.30
[Programmers]2018 Kakao. 오픈채팅방  (0) 2019.09.29

문제:

풀이방법:

SQL에서 상위 N개의 항목을 출력하기 위한 명령어는 LIMIT이다. LIMIT N 과 같이 사용을 하며 상위 N개 항목만을 출력하도록 해준다. 따라서 이 문제에서는 가장 먼저 들어온, 즉 한 동물만 출력하면 되므로 LIMIT 1을 사용했다.

1
SELECT NAME FROM ANIMAL_INS ORDER BY DATETIME LIMIT 1;
cs

문제링크:

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

문제:

풀이방법:

 컬럼의 길이가 최대 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

 

+ Recent posts