알고리즘/알고리즘_백준 72

[Python][백준] 18429. 근손실 / 브루트포스,백트래킹 (S3)

링크🔗https://www.acmicpc.net/problem/18429🗒️파이썬 코드 풀이 (순열)from itertools import permutationsN,K = map(int,input().split())lst = list(map(int,input().split()))comb_lst = list(permutations(lst))rs = 0for c_ls in comb_lst: total = 500 cnt = 0 for c in c_ls: total += (c-K) if total  1. 순열로 푸는 방식은 간단하다. 그냥 모든 조합을 반복문 돌리면 된다. 2. itertools 라이브러리를 호출해서 permutations 함수를 호출 (조합은 c..

[Python][백준] 1935. 후위 표기식2 / 자료,구조스택 (S3)

링크🔗https://www.acmicpc.net/problem/1935🗒️파이썬 코드 풀이N = int(input())lst = list(input())num_lst = [int(input()) for _ in range(N)]stack = []for ls in lst : if "A"  1. 후위 표기식은 스택 구조로 풀이한다. 2. 리스트는 세개를 선언해주었다 . (후위 표기식, 입력값들, 스택) 3. 입력값들로 반복문을 돌리고, 알파벳과 연산자를 구분한다.- 알파벳 같은 경우 stack에 넣어준다- 연산자 같은 경우 stack에서 2개를 pop해주고, 해당 연산자로 계산한다.(뒤 늦게 pop 된 것이 stack1이 되고, 처음으로 pop 된 것은 stack2가 된다.) 4. 문자열 형식 지정..

[Python][백준] 15989. 1, 2, 3 더하기 4 / 구현(S3)

링크🔗https://www.acmicpc.net/problem/16967🗒️파이썬 코드 풀이H,W,X,Y = map(int,input().split(" "))lst_b = [list(map(int,input().split(" "))) for _ in range(H+X)]for h in range(H): for w in range(W): lst_b[h+X][w+Y] = lst_b[h+X][w+Y] - lst_b[h][w] print(lst_b[h][w], end=" ") print() 1. 단순 구현 문제이다.  2. 배열  A의 크기는 H,W이고, A에서 (X,Y) 만큼 이동 한 것을 합한게 B 이므로,합쳐지는 과정에 겹치는 것을 빼주면 된다. ex) H =2, W..

[Python][백준] 15989. 1, 2, 3 더하기 4 / DP

링크🔗https://www.acmicpc.net/problem/15989🗒️파이썬 코드 풀이N = int(input())dp = [1] * 11000print(dp[0:11])for i in range(2,11000): dp[i] = dp[i] + dp[i-2]for i in range(3,11000): dp[i] = dp[i] + dp[i-3]for _ in range(N): print(dp[int(input())]) 1. DP로 푸는 문제이다.  2. 0~11000까지 넉넉히 DP 리스트를 만들어 준다. 3. 입력값을 쪼개었을 때, 2가 나오는 수를 누적시켜준다. 4. 2를 누적시킨 리스트에, 3이 나오는 수를 누적시준다. 5. DP 리스트가 만들어졌으므로, 입력 값을 dp 인덱스..

[Python][백준] 1446. 지름길

링크🔗https://www.acmicpc.net/problem/1446🗒️파이썬 코드 풀이N,D = map(int,input().split(' '))lst = [list(map(int,input().split(' '))) for _ in range(N)]lst = sorted(lst)dp = [i for i in range(D+1)]k = 0for i in range(len(dp)): dp[i] = min(dp[i-1]+1,dp[i]) while k 1. DP로 푸는 문제이다.  2. 0~D(고속도로 길이)까지 dp 리스트를 만들어준다. 3. 0~D까지의 반복문을 돌리면서 현재 dp[i] 와, 이전 dp[i-1] + 1 의 dp 값 중 최소 값을 dp[i]로 한다.(이렇게 하는 이유는 지름..

[Python][백준] 1927. 문자열 교환

링크🔗https://www.acmicpc.net/problem/1522🗒️파이썬 코드 풀이lst = list(input())a_cnt = lst.count("a")circle_lst = lst + lstmn = 10000for i in range(len(lst)): tmp_lst = circle_lst[i : i + a_cnt] mn = min(mn, tmp_lst.count("b"))print(mn) 1. 브루트포스로 하나 하나 다 확인을 하는데, 슬라이딩 윈도우 방식을 쓰면 편하다.  2. 문제의 문자열은 원형의 특성을 가지고 있기 때문에, lst + lst로 하여 연결시켰다.(브루트포스로 확인 할 때는 기존 lst에 있는 것만 확인하면 된다.) 3. 교환을 하더라도 a의 개수는 정해저..

[Python][백준] 1138.한 줄로 서기

링크🔗https://www.acmicpc.net/problem/1138🗒️파이썬 코드 풀이N = int(input())lst = list(map(int,input().split()))ord = [i for i in range(1,N+1)]result= []for i in range(N-1,-1,-1): result.insert(lst[i],ord[i])# 리스트 값 출력을 위해 str로 변경str_rs = [str(result[i]) for i in range(N)]print(' '.join(str_rs)) 1.  2개의 리스트를 만든다.  ( lst는 입력을 저장한 리스트, ord는 1~N까지의 리스트 ) 2. 입력받은 값들을 기준으로 1~N을 거꾸로 하나 하나 삽입 해주면 된다. 🌟 ins..

[Python][백준] 2075. N번째 큰 수

링크🔗https://www.acmicpc.net/problem/2075🗒️파이썬 코드 풀이import sysimport heapqN = int(input())heap = []for _ in range(N): lst = map(int,sys.stdin.readline().rstrip().split()) for ls in lst: if len(heap)   1.이 문제에서 N^2개의 숫자를 모두 배열에 저장하고 조건에 따라 처리하는 방식은 시간 초과가 된다. 2. 입력된 각각의 줄의 값들을 반복문으로 하나 하나 ls에 넣어주고,  우선순위 큐의 크기를 N개로 제한 한 후 ,  ls가 우선순위 큐의 첫번째 인덱스 보다 큰 값이면, 우선순위 큐의 첫번째 인덱스 지우고 바꿔준다.  3...

[Python][백준] 1927. 최소 힙

링크🔗https://www.acmicpc.net/problem/1927🗒️파이썬 코드 풀이import sysimport heapqT = int(input())heap = []for _ in range(T): n = int(sys.stdin.readline()) if n > 0 : heapq.heappush(heap,n) else: if heap: print(heapq.heappop(heap)) else : print(0) 1. heapq 라이브러리를 import 한다. 2. 입력받은 n이 0보다 크면 heap에 push 하고,0보다 작고 힙의 크기가 0이 아닌 때에는 heappop으로 가장 작은 요소를 제거..