https://www.acmicpc.net/problem/11727

 

11727번: 2×n 타일링 2

2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×17 직사각형을 채운 한가지 예이다.

www.acmicpc.net

 

n = int(input())
dp = [0] * 1001

dp[0] = 1
dp[1] = 1

for i in range(2, n+1):
    dp[i] = dp[i-1] + 2 * dp[i-2]

print(dp[n]%10007)

 

 

🔮 참고 링크 

https://cijbest.tistory.com/21

 

[백준 11727 : PYTHON] 2xn 타일링 2

문제 풀기 : 11727번 11726번: 2×n 타일링 2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이

cijbest.tistory.com

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/118667

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

  • dp,백트랙킹도 아니고 dfs,bfs도 아님
  • 첨에 재귀로 구하려고 했으나 뒤에 테케에서 전부 시간 초과 걸림
  • while문 돌리면서 break 조건을 len(q1) * 3과 tot1 == tot2로 해줘야 함
  • len(q1) * 4 일 때가 처음으로 돌아갈 때인데, 3으로 숫자를 낮춰서 돌려봐도 통과함
  • 2로 하면 안 통과

 

from collections import deque
def solution(queue1, queue2):
    answer = 0   
    q1, q2 = deque(queue1), deque(queue2)
    tot1, tot2 = sum(q1), sum(q2)
    total = tot1 + tot2
    limit = len(q1) * 3
    
    if total % 2 != 0:
        return -1

    while(True):
        if tot1 > tot2:
            target = q1.popleft()
            q2.append(target)
            tot1 -= target
            tot2 += target
            answer += 1
        elif tot1 < tot2:
            target = q2.popleft()
            q1.append(target)
            tot1 += target
            tot2 -= target
            answer += 1
        else:
            break
        
        if answer == limit:
            answer = -1
            break
    
    return answer

https://www.acmicpc.net/problem/14889

 

14889번: 스타트와 링크

예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다.

www.acmicpc.net

 

  • 두 팀으로 나누는 조합 생성(p)
  • 각각의 팀이 가지는 능력치 담은 power 배열 0으로 초기화
  • 각 팀마다 2명씩 뽑아서 2명의 팀원의 능력치를 해당 power 배열에 담음
  • 팀은 결국 두 팀만 만들어지므로 power배열의 끝에서부터 안쪽으로 상대팀과의 능력 차 구해주면 됨
  • result에 능력 차이 값을 담고, 마지막에 min(result)로 정답 출력

 

import sys; input = sys.stdin.readline
from itertools import combinations

result = []
n = int(input())
graph = [list(map(int, input().split())) for _ in range(n)]

nums = [i for i in range(0,n)]

p = list(combinations(nums, int(n/2)))
power = [0] * len(p)
for i in range(len(p)):
    p_list = list(combinations(p[i], 2))
    for j in p_list:
        x, y = j
        power[i] += graph[x][y] + graph[y][x]

for i in range(int(len(power)/2)):
    j = len(power)-i-1
    result.append(abs(power[i]-power[j]))

print(min(result))

 

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

백준 2xn 타일링 2 DP  (0) 2023.05.24
프로그래머스 두 큐 합 같게 하기  (0) 2023.05.22
백준 퇴사 14501 DP  (0) 2023.05.14
백준 로봇 조종하기 2169 DP  (0) 2023.05.09
프로그래머스 실패율 구현  (0) 2023.04.29

https://www.acmicpc.net/problem/14501

 

14501번: 퇴사

첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다.

www.acmicpc.net

 

  • 뒤에서부터  DP
  • 맨 마지막 스케줄은 하루만에 끝날 때만 profit 더해주고 아니면 0으로 초기화.
  • 그 앞의 스케줄은 기간 안에 끝낼 수 있을 때 먼저  dp배열 안에 해당 profit 넣어주고
  • 앞으로의 스케줄 중 도달할 수 있는 곳부터 max값 체크해서 또 더해줌.
  • 처음엔 앞에서부터 DP했는데, 이 경우 마지막 테스트 케이스를 통과할 수 없음.
  • 1일 다음에 6,7일을 선택하는 것(profit=80)보다 8일을 선택하는게(profit=90) 값이 더 크기 때문.

 

import sys
input = sys.stdin.readline

n = int(input())
schedule = []
dp = [0] * n

for _ in range(n):
    schedule.append(list(map(int, input().split())))

for i in range(n-1, -1, -1):
    day, profit = schedule[i]

    if i == n-1:
        if day == 1:
            dp[i] = profit
        continue

    if day + i <= n:
        dp[i] += profit
        if day + i < n:
            dp[i] += max(dp[day+i:])

print(max(dp))

 

 

https://www.acmicpc.net/problem/2169

 

2169번: 로봇 조종하기

첫째 줄에 N, M(1≤N, M≤1,000)이 주어진다. 다음 N개의 줄에는 M개의 수로 배열이 주어진다. 배열의 각 수는 절댓값이 100을 넘지 않는 정수이다. 이 값은 그 지역의 가치를 나타낸다.

www.acmicpc.net

 

 

  • 얼핏 봤을 땐 BFS 문제라고 생각함
  • 하지만 DP 문제였음..
  • BFS / DP 어떻게 구분..?

 

import sys
input = sys.stdin.readline

n, m = map(int, input().strip().split())
graph = [list(map(int, input().strip().split())) for i in range(n)]

# 첫 번째 행 업데이트
# 이미 지나온 길은 다시 못가므로 오른쪽으로 갈 수 밖에 없음
for i in range(1, m):
    graph[0][i] += graph[0][i-1]

# 나머지 행 업데이트
for i in range(1, n):
    # 아래로 내려올 때의 값들
    startLeft = [graph[i][j]+graph[i-1][j] for j in range(m)]
    startRight = [graph[i][j]+graph[i-1][j] for j in range(m)]

    # ->
    # 아래로 내려온 값과 왼쪽으로 가는 값 비교해서 더 큰 값 저장
    for j in range(1,m):
        startLeft[j] = max(startLeft[j], startLeft[j-1]+graph[i][j])

    # <-
    for j in range(m-2, -1, -1):
        startRight[j] = max(startRight[j], startRight[j+1]+graph[i][j])

    for j in range(m):
        graph[i][j] = max(startLeft[j], startRight[j])


print(graph[-1][-1])

 

 

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

백준 스타트와 링크 14889 완전탐색  (0) 2023.05.14
백준 퇴사 14501 DP  (0) 2023.05.14
프로그래머스 실패율 구현  (0) 2023.04.29
백준 옥상 정원 꾸미기 6198 스택  (1) 2023.04.25
백준 탑 2493 스택  (0) 2023.04.25

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

내 풀이

from collections import Counter
def solution(N, stages):
    answer = []
    rates = {x : 0 for x in range(1,N+2)}
    rates.update(dict(Counter(stages)))
    
    total = len(stages)
    
    for k in range(1,N+2):
        v = rates[k]
        if v != 0:
            rates[k] = v/total
        total -= v
    
    rates = sorted(rates.items(), key = lambda x : x[1], reverse=True)
    
    for k, v in rates:
        if k != N+1:
            answer.append(k)
    
    return answer

 

다른 사람 풀이

def solution(N, stages):
    result = {}
    denominator = len(stages)
    for stage in range(1, N+1):
        if denominator != 0:
            count = stages.count(stage)
            result[stage] = count / denominator
            denominator -= count
        else:
            result[stage] = 0
    return sorted(result, key=lambda x : result[x], reverse=True)
  • Counter 대신에 count를 사용해서 1부터 N까지의 갯수만 구함 : 나와 달리 N+1은 무시
  • sorted 할 때 인자값으로 result dict 자체를 넣으면 key만 담긴 정렬된 배열 return : 나는 rates.items()를 이용했더니 반환값이 (k, v) set으로 이뤄진 배열이었음

 

 

https://www.acmicpc.net/problem/6198

 

6198번: 옥상 정원 꾸미기

문제 도시에는 N개의 빌딩이 있다. 빌딩 관리인들은 매우 성실 하기 때문에, 다른 빌딩의 옥상 정원을 벤치마킹 하고 싶어한다. i번째 빌딩의 키가 hi이고, 모든 빌딩은 일렬로 서 있고 오른쪽으

www.acmicpc.net

 

 

  • 10, 3, 7, 4, 12, 2
  • buildings를 차례대로 돈다
  • stack이 비어있으니까 일단 10은 stack에 바로 append
  • 3은 10보다 작으니까 stack에 append하고 answer += 1
  • 7은 10에서는 볼 수 있고 3에서는 못 보니까 7보다 작은 3은 pop하고 7 append : answer += 1
  • 4는 10과 7이 모두 볼 수 있으니까 append : answer += 2
  • 12는 stack에 있는 10,7,4 모두가 볼 수 없으므로 stack은 계속 pop
  • 2는 12가 볼 수 있으므로 stack에 append : answer += 1

 

import sys
r = sys.stdin.readline
n = int(r())

answer = 0
stk = []
buildings = []

for _ in range(n):
    buildings.append(int(r()))

for b in buildings:
    while stk and stk[-1]<=b:
        stk.pop()
    stk.append(b)
    answer += len(stk)-1

print(answer)

https://www.acmicpc.net/problem/2493

 

2493번: 탑

첫째 줄에 탑의 수를 나타내는 정수 N이 주어진다. N은 1 이상 500,000 이하이다. 둘째 줄에는 N개의 탑들의 높이가 직선상에 놓인 순서대로 하나의 빈칸을 사이에 두고 주어진다. 탑들의 높이는 1

www.acmicpc.net

 

현차 코테 문제 중에 있었던 유형 같다

  • stack에 [탑의 높이, index]를 2차원 배열 형태로 저장
  • 높이를 비교하면서 가장 높은 값이 stack에 남을 수 있도록 업데이트
  • 가장 가까이 위치한 탑이 출력되야 하므로 for문 돌릴 때마다 일단 stack에 append해줘야 함

 

import sys
r = sys.stdin.readline

n = int(r())
t_list = list(map(int, r().split()))
answer = []
stk = []

for i in range(n):
    h = t_list[i]
    while stk:
        if stk[-1][0] > h:
            answer.append(stk[-1][1]+1)
            break
        else:
            stk.pop()
    if not stk:
        answer.append(0)
    stk.append([h, i])

print(*answer)

+ Recent posts