문제:

풀이방법:

 문자열처리를 해야하는 문제이므로 정규표현식을 사용했다. 정규표현식에서 '\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

문제:

풀이방법:

이진수로 바꾸는 것이 가장 중요한 문제이다. 이진수로 바꾸는 것은 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

문제:

풀이방법:

조건에 주어진 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

문제:

풀이방법:

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

 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

+ Recent posts