백준(30)
-
프로그래머스:위장
프로그래머스는 너무 어색하다. 확실히 백준이 투박하긴 해도 익숙하긴 해... 코딩테스트 연습 - 위장 programmers.co.kr const solution = (c) => Object.values(c.reduce((a, [n,g])=>({...a, [g]:(a[g] ? a[g] : 0) + 1 }),{} )).reduce((a,i) => a*(i+1),1) - 1;
2022.01.27 -
[동적계획법] 가장 긴 바이토닉 부분 수열
가장 긴 증가하는 부분 수열의 응용버전이다. 이전 문제를 풀었다면 어렵지는 않은 문제일 것 같다. 11054번: 가장 긴 바이토닉 부분 수열 첫째 줄에 수열 A의 크기 N이 주어지고, 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ Ai ≤ 1,000) www.acmicpc.net from sys import stdin N, A = int(stdin.readline()), list(map(int, stdin.readline().split(" "))) T_L, T_R = [1] * N, [1] * N def get_table_left(ind: int): m = 0 for i in range(ind, -1, -1): if A[ind] > A[i] and m < T_L..
2021.12.12 -
[동적 계획법] 1로 만들기
다른 사람들의 풀이를 보니, 메모이제이션으로 쉽게 풀 수 있는걸 너무 복잡하게 생각한 것 같다. 1463번: 1로 만들기 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다. www.acmicpc.net from sys import stdin N = int(stdin.readline()) m = {1: 0} def check(no): global m if no
2021.11.14 -
[동적 계획법] 정수 삼각형
1932번: 정수 삼각형 첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다. www.acmicpc.net 저번 문제와 마찬가지로 DP 테이블을 이용해서 쉽게 풀 수 있었다. from sys import stdin N = int(stdin.readline()) L = [] while True: line = list(map(int, stdin.readline().split())) if len(L) == 0: L.append(line) else: prev = L[len(L) - 1] next_line = [] for i, v in enumerate(line): if i == 0: next_line.append(v + prev[0]) elif ..
2021.10.31 -
[동적 계획법] RGB 거리
1149번: RGB거리 첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나 www.acmicpc.net 이번 문제를 풀면서 DP 테이블 개념을 알게 되어서 좋았다. 재귀 & 메모이제이션이 아니라 이런 식으로도 풀 수 있구나 하는... 역시 아직 배울게 많다 ㅠ from sys import stdin N = int(stdin.readline()) L = [] RESULT = [] while True: [R, G, B] = map(int, stdin.readline().split()) if len(L) == 0: L.append([R, G, B]..
2021.10.24 -
[동적 계획법] 신나는 함수 실행
동적 계획법의 핵심은 return 값의 재사용. 재사용 할 값을 어떻게 효율적으로 저장 및 탐색할 수 있는지에 대한 고민과 그에 따른 자료구조 선택이 중요한 것 같다. 9184번: 신나는 함수 실행 입력은 세 정수 a, b, c로 이루어져 있으며, 한 줄에 하나씩 주어진다. 입력의 마지막은 -1 -1 -1로 나타내며, 세 정수가 모두 -1인 경우는 입력의 마지막을 제외하면 없다. www.acmicpc.net from sys import stdin w_dict = {} input_abc_arr = [] while True: [a, b, c] = map(int, stdin.readline().split()) if a == -1 and b == -1 and c == -1: break else: input_ab..
2021.10.03