문제:

풀이방법:

이진수로 바꾸는 것이 가장 중요한 문제이다. 이진수로 바꾸는 것은 python의 bin을 사용하면 바꿀수 있다. 이 때 bin을 사용하면 앞에 이진수임을 나타내는 값이 붙어 있으므로 이를 떼어서 저장하는 것이 필요하다. 그리고 이를 한 변의 크기와 동일하게 만드는 것이 중요하다. 위 문제의 예시처럼 1은 1이지만 한변의 길이가 5이므로 00001로 맞춰준 것을 알 수 있다. 길이가 동일해야 해독할 수 있으므로 이 작업이 가장 중요하다. 길이를 같게 만들었다면 이제는 단순히 반복문을 사용해서 값을 비교하고 상황에 따라 "#"과 공백을 더해주면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def solution(n, arr1, arr2):
    answer = []
    for i in range(n):
        arr1[i]=bin(arr1[i])[2:]
        arr2[i]=bin(arr2[i])[2:]
    for i in range(n):
        code=""
        a=max(len(arr1[i]),len(arr2[i]))
        if n!=len(arr1[i]):
            arr1[i]="0"*(n-len(arr1[i]))+arr1[i]
        if n!=len(arr2[i]):
            arr2[i]="0"*(n-len(arr2[i]))+arr2[i]        
        for j in range(n):
            if arr1[i][j]==arr2[i][j]:
                if arr1[i][j]=='0':
                    code+=" "
                else:
                    code+="#"
            else:
                code+="#"
        answer.append(code)
    return answer
cs

 

 

문제링크:

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

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

[Programmers]2018 Kakao.실패율  (0) 2019.09.30
[Programmers]2018 Kakao. 오픈채팅방  (0) 2019.09.29
[Programmers]2017 Kakao.캐시  (0) 2019.09.27
[Programmers]2017 Kakao. 뉴스 클러스터링  (0) 2019.09.26
[BOJ]1987. 알파벳  (0) 2019.09.25

문제:

풀이방법:

아픈 동물 찾기 문제와 유사한 문제이다. 문제의 조건에서 젊은 동물은 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

문제:

풀이방법:

조건에 주어진 LRU(Least Recently Used)를 사용하면 풀 수 있는 문제이다. LRU 캐시 교체 알고리즘이란 가장 오래전에 사용한 캐시는 자주 사용하지 않는다고 판단하고 새로 들어오는 캐시에게 자리를 내어준다는 알고리즘이다. 즉, 가장 오래전에 사용된 캐시를 빼버리고 새로운 값을 넣어버리면 된다. python의 list 내장 함수를 사용하면 어렵지 않게 풀 수 있다. list는 새로운 값을 넣어버리면 list의 맨 끝에 값을 넣기 때문에 자동적으로 인덱스 0번째에 있는 값이 오래된 값이다. 따라서 캐시에 없는 값이 들어오면 0번째 값을 빼고 새로운 값을 넣으면 LRU를 만족할 것이다. 그리고 만약 이미 있는 값이 들어왔다고 하더라도 remove로 값을 제거하고 새로 값을 넣어주어야 한다. 그래야 이 값의 사용시간이 최신화되기 때문이다. 각 행위마다 5초(miss)와 1초(hit)를 더한다면 답을 얻을 수 있을 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def solution(cacheSize,cities):
    cache=[]
    answer = 0
    for city in cities:
        if city.lower() in cache:
            answer+=1
            cache.remove(city.lower())
            cache.append(city.lower())
        else:
            answer+=5
            if 0<= len(cache) < cacheSize:
                cache.append(city.lower())
            else:
                cache.append(city.lower())
                cache.pop(0)
    return answer
cs

문제링크:

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

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

[Programmers]2018 Kakao. 오픈채팅방  (0) 2019.09.29
[Programmers]2017 Kakao.비밀지도  (0) 2019.09.28
[Programmers]2017 Kakao. 뉴스 클러스터링  (0) 2019.09.26
[BOJ]1987. 알파벳  (0) 2019.09.25
[BOJ]1759. 암호 만들기  (0) 2019.09.24

문제:

풀이방법:

정해진 조건에 해당하는 값들을 찾아야 하는 문제이다. 정해진 조건에 해당하는 부분은 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

문제:

풀이방법:

 입력으로 들어오는 값들을 다중집합으로 만들어야 한다. 소문자와 대문자의 구분이 필요 없으므로 소문자로 전부 바꾸고 두개씩 끊어가면서 특수문자가 있는지 파악하고 각 배열에 담는다. 

 summation이라는 두 배열의 길이의 합을 구하고 이를 교집합과 뺌으로써 합집합의 크기를 구할 것이다. summation은 공통된 원소를 두 개씩 가지고 있는 것이기 때문이다. 

 반복문을 사용해서 공통된 원소가 있을 때마다 intersect를 하나씩 증가시킨다.

이 두 변수로 자카드 유사도는 다음과 같이 구한다. int(intersect/(summation-intersect)*65536) 이 값을 구하면 답을 얻을 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def solution(str1,str2):
    str1=str1.lower()
    str2=str2.lower()
    str1_set=[]
    str2_set=[]
    for i in range(len(str1)-1):
        if (str1[i]+str1[i+1]).isalpha():
            str1_set.append(str1[i]+str1[i+1])
    for i in range(len(str2)-1):
        if (str2[i]+str2[i+1]).isalpha():
            str2_set.append(str2[i]+str2[i+1])
    summation=len(str1_set)+len(str2_set)
    intersect=0
    for i in str2_set:
        if i in str1_set:
            str1_set.remove(i)
            intersect+=1
    if summation==0:
        return 65536
    else:
        return int(intersect/(summation-intersect)*65536)
cs

 

문제링크:

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

 

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

[Programmers]2017 Kakao.비밀지도  (0) 2019.09.28
[Programmers]2017 Kakao.캐시  (0) 2019.09.27
[BOJ]1987. 알파벳  (0) 2019.09.25
[BOJ]1759. 암호 만들기  (0) 2019.09.24
[BOJ]14889. 스타트와 링크  (0) 2019.09.23

문제:

풀이방법:

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

문제:

풀이방법:

 모든 정보를 조회하는 문제이므로 전체를 뜻하는 *를 SELECT 부분에 사용하면 된다. 다만 ANIMAL_ID순으로 조회하라는 조건이 있었으므로 ORDER BY ANIMAL_ID를 추가해주었다.

1
SELECT * FROM ANIMAL_INS ORDER BY ANIMAL_ID;
cs

문제링크:

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

문제:

가로, 세로 길이가 n인 정사각형으로된 체스판이 있습니다. 체스판 위의 n개의 퀸이 서로를 공격할 수 없도록 배치하고 싶습니다.

 

예를 들어서 n이 4인경우 다음과 같이 퀸을 배치하면 n개의 퀸은 서로를 한번에 공격 할 수 없습니다.

ㅜ=4일 때

 

체스판의 가로 세로의 길이 n이 매개변수로 주어질 때 , n개의 퀸이 조건에 만족 하도록 배치할 수 있는 방법의 수를 return하는 solution 함수를 완성해주세요.

 

풀이 방법:

 되추적 방법을 사용하는 대표적인 예시인 문제이다. 따라서 queens에서는 각 col별로 queen을 배치하는데 우선 promising이라는 함수에서 이전에 배치한 col을 기준으로 해당 인덱스에 queen을 배치할 수 있는지 판단해준다. 모든 방법을 다 판별해주는 방법도 생각할 수 있지만 그럴 경우 n이 커짐에 따라 많은 시간이 발생할 것이다. 따라서 promising이라는 되추적 판단을 해주는 함수로 인해서 많은 시간을 단축 할 수 있었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def promising(i,col):
    k=0
    correct=True
    while (k<and correct):
        if (col[i]==col[k] or abs(col[i]-col[k])==i-k):
            correct=False
            break
        k+=1
    return correct
 
def queens(n,i,col,count):
    if (promising(i,col)):
        if (i==n-1):
            count.append(col)
        else:
            for j in range(n):
                col[i+1]=j
                queens(n,i+1,col,count)
def solution(n):
    col=n*[0]
    global count
    count=[]
    queens(n,-1,col,count)
    return len(count)
cs

 

 

문제 링크:

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

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

[BOJ]9935. 문자열 폭발  (0) 2019.08.29
[BOJ]1120. 문자열  (0) 2019.08.28
[BOJ]9465. 스티커  (0) 2019.08.24
[BOJ]1406. 에디터  (0) 2019.08.23
[BOJ]11053. 가장 긴 증가하는 부분 수열  (0) 2019.08.22

문제:

 N개의 마을로 이루어진 나라가 있습니다. 이 나라의 각 마을에는 1부터 N까지의 번호가 각각 하나씩 부여되어 있습니다. 각 마을은 양방향으로 통행할 수 있는 도로로 연결되어 있는데, 서로 다른 마을간에 이동할 때는 이 도로를 지나야 합니다. 도로를 지날 때 걸리는 시간은 도로별로 다릅니다. 현재 1번 마을에 있는 음식점에서 각 마을로 음식 배달을 하려고 합니다. 각 마을로부터 음식 주문을 받으려고 하는데, N개의 마을 중에서 K 시간 이하로 배달이 가능한 마을에서만 주문을 받으려고 합니다. 다음은 N=5, K=3인 경우의 예시입니다.
 
 1번 마을에 있는 음식점은 [1,2,4,5]번 마을까지는 3이하의 시간에 배달할 수 있습니다. 그러나 3번 마을까지는 3시간 이내로 배달할 수 있는 경로가 없으므로 3번 마을에서는 주문을 받지 않습니다. 따라서 1번 마을에 있는 음식점이 배달 주문을 받을 수 있는 마을은 4개가 됩니다.
 
 마을의 개수 N, 각 마을을 연결하는 도로의 정보 road, 음식 배달이 가능한 시간 K가 매개변수로 주어질 때, 음식 주문을 받을 수 있는 마을의 개수를 return 하도록 solution 함수를 완성해주세요.
 

풀이 방법:

<Test 32 시간초과>

 DFS 방법을 사용해서 배달 거리가 K를 넘지 않을 때까지 stack 배열에 쌓으면서 계속해서 들어간다. 들어가는 과정에서 방문하는 마을은 모두 K시간 내 방문할 수 있는 곳이므로 count set에 담도록 한다.(set이므로 중복된 것을 넣어도 자동으로 사라진다.) stack 배열을 사용하는 이유는 사이클을 피하기 위해서이므로 깊은 노드를 방문하고 다시 나올 때는 stack에서 pop 하도록해서 다른 노드를 방문할 시간을 주도록 한다. 
 하지만 재귀 과정에서 문제가 발생해서 시간초과가 발생하는 것 같은데 무엇이 문제인지는 정확히 모르겠다. (정렬도 해봤지만 차이가 없었다.)
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
def delivery(stack,dist,now,roads,K):
    for r in roads[now]:
        temp=dist+r[1]
        if not r[0in stack and temp <=K:
            stack.append(r[0])
            count.add(r[0])
            delivery(stack,temp,r[0],roads,K)
            stack.pop()
    
def solution(N,road,K):
    roads=[[]for i in range(N+1)]
    for i in range(len(road)):
        if not road[i][0in roads[road[i][1]]:
            roads[road[i][1]].append((road[i][0],road[i][2]))
        if not road[i][1in roads[road[i][0]]:
            roads[road[i][0]].append((road[i][1],road[i][2]))
    stack=[1]
    dist=0
    global count
    count=set(stack)
    for r in roads[1]:
        temp=dist+r[1]
        if not r[0in stack and temp <=K:
            stack.append(r[0])
            count.add(r[0])
            delivery(stack,temp,r[0],roads,K)
            stack.pop()
    return len(count)
cs

 <2021.07.11 수정>

DFS와 같이 재귀적인 방법을 사용하는 것이 시간을 많이 소요할 것 같아 일반적으로 그래프에서 최소 거리를 구하는 방법으로 많이 사용되는 다익스트라 방법을 사용했다. 1에서 부터의 거리를 측정하기 때문에, 1에서 다익스트라로 거리를 구한 뒤에 K보다 작은 것의 갯수를 세서 반환하도록 한다.

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
32
import heapq
 
def dijkstra(start,dp,edge):
    dp[start] = 0
    heapq.heappush(heap,(0,start))
    
    while heap:
        weight, move = heapq.heappop(heap)
        
        if dp[move] < weight:
            continue
        for w, node in edge[move]:
            if w+weight< dp[node]:
                dp[node] = w+weight
                heapq.heappush(heap,(dp[node],node))
    return dp
 
def solution(N,road,K):
    edge = [[] for _ in range(N+1)]
    heap = []
    for i in road:
        a,b,c = i
        edge[a].append((c,b))
        edge[b].append((c,a))
    dp = [float('inf')]*(N+1)
    
    dp = dijkstra(1,dp,edge)
    answer = 0
    for i in range(1,V+1):
        if dp[i] <= K:
            answer +=1
    return answer
cs

문제 링크:

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

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

[BOJ]15649. N과M(1),(2)  (0) 2019.08.02
[BOJ]1009. 분산처리  (0) 2019.08.01
[Programmers]Lv 3. 순위  (0) 2019.07.30
[Programmers]Lv3. 가장 먼 노드  (0) 2019.07.29
[Programmers]Lv 4. 3xn 타일링  (2) 2019.07.28

+ Recent posts