목록코딩 테스트/백준 문제 풀이 (107)
공부 기록장
https://www.acmicpc.net/problem/1749 문제 요약N*M 행렬의 각 칸에 점수를 하나씩 적고그 행렬의 부분 행렬을 그려 그 안에 적힌 정수의 합을 구했을 때,정수 합이 최대가 되는 부분 행렬 구하기 ➮ 최대 합을 출력 코드import sysn, m = map(int, sys.stdin.readline().split())A = [list(map(int, sys.stdin.readline().split())) for _ in range(n)]# 2차원 누적합 배열 초기화S = [[0] * (m+1) for _ in range(n+1)]for i in range(1, n+1): for j in range(1, m+1): # A 행렬은 정사이즈 행렬로 만들었기 때문에 ..
https://www.acmicpc.net/problem/2467 코드import sysinput = sys.stdin.readlinen = int(input())liquids = list(map(int, input().split()))# 포인터 초기 설정left_idx = 0right_idx = n-1ans = abs(liquids[left_idx] + liquids[right_idx])ans_left = left_idxans_right = right_idxwhile left_idx 코드 설명입력으로 주어지는 용액이 정렬되어 있고,특정 수를 만족하는 두 개의 수를 구해야 함으로 투 포인터를 사용하면 유용하다. 두 개의 포인터를 배열의 양 끝에서 시작시키고, 초기 정답을 abs 변수에 설정한다. 포인터..
https://www.acmicpc.net/problem/5557 코드import sysinput = sys.stdin.readlinen = int(input())arr = list(map(int, input().split()))# i번째 숫자까지 저장했을 때, 그 결과가 j일 경우, 가능한 경우의 수 저장하는 DP 테이블dp = [[0] * 21 for _ in range(n-1)]# 첫 번째 수는 무조건 선택해야 함으로, 첫 번째 수(arr[0])로 결과가 만들어 질 수 있는 경우의 수 1로 초기화dp[0][arr[0]] = 1for i in range(1, n-1): for j in range(21): # i-1 번째 수까지 왔을 때 j라는 값을 만들 수 있는 경우의 수가 존재한다..
https://www.acmicpc.net/problem/27966 코드N = int(input())print((N-1) ** 2)for i in range(2, N+1): print(1, i) 애드혹 문제란?문제를 풀기 위해 잘 알려진 정교한 알고리즘을 적용하지 않고도 해결할 수 있는 유형의 문제! 굳이 유형 분류를 하자면, 구현, 그리디, 수학 유형으로 분류할 수 있다.다시 말해, 정형화 된 방법론이 아니라, 창의적인 아이디어를 떠올려야 하는 문제 접근 방식- 노드 사이 거리에 대한 설명이 없으면 1이라고 간주- 모든 노드 쌍의 거리 합을 최소화하기 위해서는 하나의 노드에 다른 모든 노드가 연결된 형태여야 한다- 가운데 노드를 1번 노드라고 한다면, 1번 노드와 나머지 (N-1)개 노드로 가는 ..