반응형

문제풀이

1. dp의 각 요소의 의미는 다음과 같다.

dp[0] : 입력 받은 칸을 red로 칠했을 때 코스트의 최솟값
dp[1] : 입력 받은 칸을 green로 칠했을 때 코스트의 최솟값
dp[2] : 입력 받은 칸을 blue로 칠했을 때 코스트의 최솟값

2. 현재 칸의 페인트의 코스트 r,g,b를 입력받았다면, 위의 관계를 아래와 같이 쓸 수 있다.

dp[0] = min(dp[1],dp[2])+r
dp[1] = min(dp[0],dp[2])+g
dp[2] = min(dp[0],dp[1])+b

Python Code

1
2
3
4
5
6
7
8
9
10
11
12
import sys
readline = sys.stdin.readline
 
def main(n):
    dp = list(map(int,readline().split()))
    for _ in range(n-1):
        r,g,b = map(int,readline().split())
        dp = [min(dp[1],dp[2])+r, min(dp[0],dp[2])+g,min(dp[0],dp[1])+b]
    print(min(dp))
if __name__ == '__main__':
    n =int(readline())
    main(n)
cs

문제 링크

 

1149번: RGB거리

첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나

www.acmicpc.net

 

반응형

'알고리즘 > 백준' 카테고리의 다른 글

백준 4344 평균은 넘겠지 Python  (0) 2020.12.09
백준 20162 간식 파티 Python  (0) 2020.12.08
백준 1309 동물원  (0) 2020.12.07
백준 20299 3대 측정  (0) 2020.12.04
백준 11057 오르막 수 Python  (0) 2020.12.03
반응형

12/07

1. 경기불황시 자동차세 인하 : 올해말까지였던 할인 기간을 연장할 예정이다.

- 5%에서 1.5%로 70%를 할인해주다가 현재는 30% 할인해주고 있다(100만원 감면 제한이 없어졌다).

- 30 또는 70%를 할인해주고, 할인 한도를 100만원으로 할 예정이다. 3000만원 이상의 차면 30%든, 70%든 상관없다.

- 소비자들이 언젠가 할인해 줄것이라는 것을 예상하고, 구매를 미루거나 당기기만하므로 소비 총량을 늘릴 수 없다는 비판이 있다. 예전에는 자동차가 고가 사치품이었으나, 지금은 사치품이 아니다.

 

2. 코로나로 인한 양극화 : 어려운 사람은 일자리가 사라지고, 잘사는 사람은 주가가 오른다.

- 연소득 7천~1억2천 (소득 상위 10~30% 구간) 평균 순 자산이 6억4천으로 작년 대비 50%가 늘었다. 주식, 부동산의 영향이다. 과거에는 이 사람들의 예, 적금의 비율이 30% 정도였는데, 주식으로 많이 옮겨갔다. 주식보유자가 작년대비 11%가 늘었다. 펀드, ELS 같은 간접투자상품의 비중은 줄었다.

 

3. 기업의 75%가 경영 계획을 확정하지 못했다.

- 코로나19의 불확실성, 금융리스크(환율 변동) 등이 원인이다.

- 내수 부진과 수출 부진으로 힘들다.

- 2022년 이후 좋아질 것이라는 예측이 가장 많았다.

 

4. 국세청이 탈세자 명단을 공개했다.

 

5. 달러 예금, 달러 ETF

- 달러 예금은 달러로 예금하는 것이고, 달러 ETF는 달러 선물을 추종하는 금융 상품이다.

- 달러 예금은 환차익에 대한 세금이 없다.

- 달러 ETF는 차익에 대해 15.4%의 세금을 부과한다.

- 증권사에서 환전하면 수수료가 더 싼 경우가 많다. 증권사는 환전으로 돈 벌 생각이 없다.

 

6. 반도체 산업 전망 : 내년에 D램 수요가 급등할 수 있다.

- 이머징 시장에서의 소비재 수요 증가를 기대하고 있다. : 외국인이 D램 주식을 매수하고 있다.

- 인텔의 CPU 출시가 연기되고 코로나까지 곂치면서, 반도체 교체 주기가 1년 정도 지연되었다.

- 서버의 불확실성은 상대적으로 적으나, 모바일 시장에서는 변화가 있을 수 있다. 중국 기업이 중저가 스마트폰을 주력으로 밀면서, 고가 반도체의 수요가 줄고 중저가 반도체의 수요가 커질 수 있다.

 

12/11

1. 통계청 2019 신혼부부(만 5년 이내) 통계

- 1년차 신혼부부의 감소율 6%.

- 신혼부부의 주택 소유율은 43%(90%는 금융권 대출이 있다) 이다. 

- 신혼부부의 연간 근로사업소득은 5300만원으로 1년 전 대비 200만원 늘었다.

- 올해 집값 상승은 반영되지 않은 통계로, 내년 통계는 더욱 악화될 전망이다.

- 1년차의 무자녀 비율은 43%로 역대 최고이다.

 

2. 은행 어플에서 부동산, 쇼핑, 음식배달 등의 사용이 가능하다.

- 금융당국이 은행의 플랫폼 비즈니스 규제를 풀어주기로 했다.

- 고객보다는 소상공인이 혜택을 받을 전망이다. 매출이 신용평가모형에 반영됨으로써 소상공인이 대출을 받기 더 쉬워질 수 있다.

 

3. 기업의 리츠를 활용한 현금확보 : 부동산(사옥) 유동화에 활용

- 대기업이 리츠를 만들어 계열사의 부동산을 팔아 현금을 확보한다. 리츠를 상장시켜 재원을 마련한다.

- 작년의 롯데리츠가 대표적인 예다.

 

4. 유치권 : 시행사/사업자들이 건물주와 분쟁이 있는 경우, 건물주를 압박하기 위해 건물을 막는 것.

 

5. 액티브 ETF : 일반 펀드와 ETF의 중간 형태의 금융상품

- ETF는 주가지수 구성 종목을 그대로 담고, 지수를 그대로 따라간다. 지수보다 못해도, 잘해도 안된다.

- 액티브 ETF가 미국, 유럽 등에서 각광받고 있다. 작년 대비 규모가 74%가 늘어났다.

- BBIG 같이 각광받는 종목을 모아 만든 지수가 있지만, 이 역시 결국 지수를 추종해야한다.

- 국내 액티브 ETF의 경우, 추종하는 지수와 상관계수가 0.7 미만이면 상장폐지 된다. 추종하는 지수는 사전에 정해져있다. 보통 ETF는 상관계수가 0.9로, 기존 ETF보다 조금 더 자율성이 있다.

- 지수형 ETF가 늘어나던 시기에는 시총이 높은 종목들이 많은 수혜를 보다보니 역화과도 나타났다.

- 액티브 ETF는 시장 효율성을 높여줄 수 있다. 하지만, 개별종목 쏠림 현상이 나타날 수 있다.

- 수수료는 펀드보다는 낮지만, ETF보다는 높다.

 

6. 다음주 증시

- 미국 FMC가 예정되어 있다. 자산매입 규모를 얼마나 늘릴 것인지 관심이다. 중앙은행이 장기채권을 많이 살 준비를 하고 있다.

반응형
반응형

문제풀이

세 개의 요소를 활용한 dp로 문제를 풀겠습니다.

1. 배열 자료구조인 dp의 각 요소의 의미는 아래와 같습니다.

dp[n][0] : n번째 행의 왼쪽 칸에 사자가 있을 경우의 수.

dp[n][1] : n행의 오른쪽 칸에 사자가 있을 경우의 수.

dp[n][2] : n행에 사자가 없는 경우의 수.

2. 각 요소의 점화식은 다음과 같습니다.

2-1. dp[n][0] = dp[n-1][1]+dp[n-1][2] ; n행의 왼쪽에 사자를 넣기 위해서는 윗행의 오른쪽에 사자가 있거나(dp[n-1][1]) 윗행에 사자가 아예 없어야(dp[n-1][2]) 합니다.

2-2. dp[n][1] = dp[n-1][0]+dp[n-1][2] ; n행의 오른쪽에 사자를 넣기 위해서는 윗행의 왼쪽에 사자가 있거나 윗행에 사자가 아예 없어야 합니다.

2-3. dp[n][2] = dp[n-1][0]+dp[n-1][1]+dp[n-1][2] ; n행에 사자를 넣기 않으려면, 윗행에 사자가 어디에 있든 아예 없든 상관 없습니다.

3. dp의 요소가 너무 커지지 않도록 %9901을 해주며, n=1부터 입력받는 N까지 진행해준 후, sum(dp[n])%9901을 반환합니다.

 

Python Code

1
2
3
4
5
6
7
8
9
def main(n):
    dp = [1,1,1]
    for _ in range(n-1):
        tmp = [(dp[1]+dp[2])%9901, (dp[0]+dp[2]%9901), (dp[0]+dp[1]+dp[2])%9901]
        dp = tmp
    print(sum(dp)%9901)
    
if __name__ == '__main__':
    main(int(input()))
cs

문제링크

 

1309번: 동물원

첫째 줄에 우리의 크기 N(1≤N≤100,000)이 주어진다.

www.acmicpc.net

 

반응형

'알고리즘 > 백준' 카테고리의 다른 글

백준 20162 간식 파티 Python  (0) 2020.12.08
백준 1149 RGB거리 Python  (0) 2020.12.08
백준 20299 3대 측정  (0) 2020.12.04
백준 11057 오르막 수 Python  (0) 2020.12.03
백준 4358 생태학  (0) 2020.10.21
반응형

문제풀이

1. n,k,l을 입력 받습니다.

2. n번 3개의 정수로 구성된 리스트를 입력 받습니다.

3. 입력받은 리스트의 최솟값과 합계를 각각 k와 l과 비교합니다.

4. 입력받은 리스트의 최솟값과 합계가 각각 k와 l보다 크다면 answer에 1을 더하고, vip 리스트에 3명의 기록을 넣습니다.

5. answer를 출력하고, vip에 들어있는 기록들을 출력합니다. 저는 vip 리스트를 스트링으로 변환 후, 맨 앞과 맨 뒤의 대괄호를 지우고, re의 sub함수를 활용하여 ','를 지워 출력하였습니다.

Python Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import sys, re
readline = sys.stdin.readline
def main():
    n,k,l = map(int,readline().split())
    ans = 0
    vip = []
    for _ in range(n):
        records = list(map(int,readline().split()))
        if min(records) >= l and sum(records) >= k :
            ans += 1
            vip += records
    print(ans)
    print(re.sub(',','',str(vip)[1:-1]))
if __name__ == '__main__':
    main()
cs

문제 링크

 

20299번: 3대 측정

첫째 줄에 정수 $N$, $K$, $L$이 주어진다. $N$은 팀의 수, $K$는 팀원 $3$명의 레이팅 합에 대한 클럽 가입 조건, $L$은 개인 레이팅에 대한 클럽 가입 조건이다. ($1 \leq N \leq 500\ 000$, $0 \leq K \leq 12\ 000$, $

www.acmicpc.net

 

반응형

'알고리즘 > 백준' 카테고리의 다른 글

백준 1149 RGB거리 Python  (0) 2020.12.08
백준 1309 동물원  (0) 2020.12.07
백준 11057 오르막 수 Python  (0) 2020.12.03
백준 4358 생태학  (0) 2020.10.21
백준 1520 내리막 길  (0) 2020.10.20
반응형

2019 카카오 개발자 겨울 인턴십 문제입니다.

문제풀이

1. 정규표현식에서 '.'은 모든 문자 1개를 의미합니다. 따라서 banned_id의 모든 '*'을 '.'으로 바꾼 후 이를 컴파일러로 사용합니다.

2. user_id의 아이디 하나 u가 banned_id의 하나 b에 해당되기 위해서는 b로 만든 컴파일러에 u가 걸리고, b와 u의 길이가 같아야합니다. 저는 정규표현식의 match를 활용하였는데, match를 활용하면 'a.b'로 만든 컴파일러에 'aabb' 또한 매칭되므로 두번째 조건이 필요합니다.

3. 2 과정을 통해 모든 b에 해당하는 u의 리스트를 만듭니다.

user_id banned_id
["frodo", "fradi", "crodo", "abc123", "frodoc"] ["fr*d*", "abc1**"]

이 예를 사용하면 3의 결과는 다음과 같습니다.

{0: ['frodo', 'fradi'], 1: ['abc123']}

여기서 key값인 숫자는 b의 index입니다.

4. 3의 결과인 dictionary를 dfs 하여 최종 결과를 만들어냅니다.

 

*말로는 설명이 잘 안되어 아래 코드에서 자세히 다시 설명하겠습니다.

Python Code

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import re
 
def solution(user_id, banned_id):
    # 가능한 제재id
    global answer
    answer = []
    # key : banned_id의 id의 index, value : 아래의 checked
    candidate = {}
    for i, b in enumerate(banned_id):
        # re.sub를 활용하여 b의 모든 *을 .으로 변환
        checker = re.compile(re.sub('\*','.',b))
        # banned_id 중 하나인 b에 매칭되는 user_id
        checked = []
        for u in user_id:
            # match가 안되면 결과가 None으로 두번째 조건 만족x
            if len(u) == len(b) and checker.match(u):
                checked.append(u)
        candidate[i] = checked
    # candidate를 활용하여 dfs
    for x in candidate[0]:
        dfs([x],candidate,len(banned_id))
 
    return len(answer)
 
'''
selected는 list로 selected[i]는 candidate[i]의 원소 중 하나. 즉 i번째 banned_id에 매칭되는 user_id 중 하나.
n은 banned_id의 길이.
dfs의 탈출 조건은 selected에 들어있는 원소의 수가 n이 되는 것이다.
'''
def dfs(selected,candidate, n):
    # 탈출조건
    if len(selected) == n:
        global answer
        # 중복을 제거하기 위해 selected를 정렬한 후 비교
        tmp = sorted(selected)
        if tmp not in answer:
            answer.append(tmp)
        return ;
    '''
    <selected의 원소 수가 n이 아닌 경우.>
    selected의 원소 수는 다음 banned_id의 index를 의미한다.
    ex) selected에 한개가 들어있으면 banned_id[1](banned_id의 두번째 요소)에 매칭되는 user_id의 집합인 
        candidate[1]의 원소 중 하나를 selected에 넣는다.
    '''
    for x in candidate[len(selected)]:
        if x not in selected:
            dfs(selected+[x],candidate,n)
 
cs

문제링크

 

코딩테스트 연습 - 불량 사용자

개발팀 내에서 이벤트 개발을 담당하고 있는 무지는 최근 진행된 카카오이모티콘 이벤트에 비정상적인 방법으로 당첨을 시도한 응모자들을 발견하였습니다. 이런 응모자들을 따로 모아 불량

programmers.co.kr

 

반응형
반응형

문제풀이

1. $k_t$를 길이가 t이고 k로 끝나는 오르막 수라고 하고 점화식을 세우면 다음과 같습니다.

$k_t = \sum_{l=0}^k l_{t-1}$

즉, 길이가 2인 1로 끝나는 오르막 수의 개수는 길이가 1인 0으로 끝나는 오르막 수의 합(한개(0))과 길이가 1인 1로 끝나는 오르막 수의 합(한개(1))인 2개입니다. 0 뒤에 1을 붙이고, 1 뒤에 1을 붙여 {00, 01} 두 개가 됩니다.

2. 위의 $k$를 1부터 $n$까지 올리며 계산한 후, $\sum_{k=0}^9 k_n$을 반환합니다.

Python Code

1
2
3
4
5
6
= int(input())
li = [1* 10
for _ in range(n-1):
    tmp = [sum(li[:i+1])%10007 for i in range(10)]
    li = tmp.copy()
print(sum(li)%10007)
cs

 

Line 4, 6 : 문제의 조건에 따라 %10007을 해줍니다.

문제링크

 

11057번: 오르막 수

오르막 수는 수의 자리가 오름차순을 이루는 수를 말한다. 이때, 인접한 수가 같아도 오름차순으로 친다. 예를 들어, 2234와 3678, 11119는 오르막 수이지만, 2232, 3676, 91111은 오르막 수가 아니다. 수

www.acmicpc.net

 

반응형

'알고리즘 > 백준' 카테고리의 다른 글

백준 1309 동물원  (0) 2020.12.07
백준 20299 3대 측정  (0) 2020.12.04
백준 4358 생태학  (0) 2020.10.21
백준 1520 내리막 길  (0) 2020.10.20
백준 1152 단어의 개수  (0) 2020.08.31
반응형

2018 카카오 블라인드 채용 문제입니다.

문제풀이

먼저, LRU 알고리즘 : 새로운 페이지가 등장했을 때, 가장 오래전에 사용된 페이지를 캐시에서 삭제합니다.

즉, 캐시 사이즈가 2이고, 캐시에 t=1일 때 A, t=2일 때 B가 들어오면, A와 B는 캐시가 비어있으므로 그냥 캐시에 추가합니다. t=3 일 때 C가 등장한다면, 가장 오래전에 사용된 A를 캐시에서 제거하고 C를 캐시에 추가합니다.

=> 큐 자료구조를 활용합니다.

1. cities에서 city를 꺼내고 대소문자를 구분하지 않는다고 했으므로 전부 대문자로 변환합니다.

2. queue 자료구조로 cache를 선언합니다. cache의 앞에 있을수록 사용한지 오래된 페이지입니다.

위의 예에서 cache는 [A] -> [A, B] -> [B, C]로 변화합니다.

3-1. city가 cache에 있다면 cache에서 city를 삭제하고 city를 다시 넣어줍니다. answer에는 1을 더해줍니다.

* pop()으로 꺼내지 않고 remove(cache)로 지워야합니다. 여기서 city를 지우는 이유는 city를 가장 최근에 사용된 것으로 바꾸기 위해 cache의 맨 끝에 넣기 위함인데, pop()으로 지우면 cache에서 city가 아니라 가장 오래된 것이 지워집니다.

** cache가 [A, B, C] 일 때, B가 들어오면, cache를 [A, C, B]로 바꾸기 위해 B를 지운 후 다시 넣는 것을 말합니다.

3-2. city가 cache에 없다면 cache의 첫번째 요소를 제거(pop())한 후, city를 cache에 넣어줍니다. answer에는 5를 더해줍니다.

*cache의 크기가 cacheSize보다 작을 때는 첫번째 요소를 제거하지 않고 city를 cache에 넣어주는 작업만 수행합니다.

Python Code 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from collections import deque
 
def solution(cacheSize, cities):
    if cacheSize == 0 : return len(cities) * 5
    answer = 5
    cache = deque([cities[0].upper()])
    for city in cities[1:]:
        c = city.upper()
        if c in cache:
            answer +=1
            cache.remove(c)
            cache.append(c)
        else:
            answer += 5
            cache.append(c)
            if len(cache) > cacheSize:
                cache.popleft()
    
    return answer
cs

Line 4 : cacheSize가 0인 경우에는 cities의 요소 수에 5를 곱해 반환합니다.

Line 6 : cache에 cities의 첫번째 요소를 넣은 채 선언합니다. 따라서 answer 역시 5로 초기화합니다.

Line 9 : city가 cache에 있는 경우입니다.

Line 13 : city가 cache에 없는 경우입니다.

 

문제 링크

 

코딩테스트 연습 - [1차] 캐시

3 [Jeju, Pangyo, Seoul, NewYork, LA, Jeju, Pangyo, Seoul, NewYork, LA] 50 3 [Jeju, Pangyo, Seoul, Jeju, Pangyo, Seoul, Jeju, Pangyo, Seoul] 21 2 [Jeju, Pangyo, Seoul, NewYork, LA, SanFrancisco, Seoul, Rome, Paris, Jeju, NewYork, Rome] 60 5 [Jeju, Pangyo, S

programmers.co.kr

 

반응형
반응형

2019 카카오 개발자 겨울 인턴십 문제입니다.

문제풀이

1. 문제가 잘 이해가 안되는데, 예로 [2,1,3,4]를 설명하면 다음과 같다.

[2,1,3,4]는 {{2},{2,1},{2,1,3},{2,1,3,4}}로 쓸 수 있는데, 이 집합의 순서를 아래와 같이

{{2,1},{2,1,3},{2},{2,1,3,4}} 등으로 바꿀 경우, 이 집합을 통해 [2,1,3,4]를 맞추는 문제이다.

2. 집합의 각 요소를 살펴보면, 2가 4번, 1이 3번, 3이 2번, 4가 1번 등장하는 것을 볼 수 있다.

즉, 많이 순서대로 앞에 위치하는 요소가 된다.

Python Code

1
2
3
4
5
6
7
8
9
10
11
def solution(s):
    s = s[2:-2]
    co = {}
    for tuple in s.split('},{') :
        for t in tuple.split(','):
            tmp = int(t)
            if tmp in co:
                co[tmp] = co[tmp] + 1
            else:
                co[tmp] = 1
    return sorted(list(co.keys()), key = lambda x : co[x], reverse = True)
cs

Line 4 : 각 집합을 꺼냅니다.

Line 5 : 각 집합의 요소를 꺼내 int로 변환해줍니다(Line 6).

Line 3, 7 - 10 : co는 각 요소가 key, 등장하는 횟수가 value인 딕셔너리 자료구조입니다.

Line 11 : co의 key들을 등장 횟수를 기준으로 정렬하여 리스트로 반환합니다.

 

문제링크

 

코딩테스트 연습 - 튜플

"{{2},{2,1},{2,1,3},{2,1,3,4}}" [2, 1, 3, 4] "{{1,2,3},{2,1},{1,2,4,3},{2}}" [2, 1, 3, 4] "{{4,2,3},{3},{2,3,4,1},{2,3}}" [3, 2, 4, 1]

programmers.co.kr

 

반응형

+ Recent posts