728x90
반응형

Algorithm/Greedy 7

[Baekjoon 2138 / Python / 골드4] 전구와 스위치

그리디 문제이다. 문제는 간단한데 해결 방법이 도저히 떠오르질 않았다. 한번에 3개의 전구가 바뀌니까 엄청나게 많은 경우의 수가 있을 것이라 생각했고, 아무리 생각해도 답을 도출할 방법이 떠오르질 않아서 다른 코드를 참고했다. 근데 참고해도 이해가 잘 안된다. 이 코드가 어째서 정답을 도출하는지. 이론적으론 이해했지만 와닿지가 않는다.# 그리디import sysinput = sys.stdin.readlineN = int(input())origin = list(map(int, input().strip()))target = list(map(int, input().strip()))# 1번 인덱스 전구부터 하나씩 누를지 말지 결정하는 함수def solve(A, B):    press = 0    for i in..

Algorithm/Greedy 2024.09.26

[Baekjoon 1911 / Python / 골드5] 흙길 보수하기

import sysinput = sys.stdin.readline# N개의 웅덩이, L길이의 널빤지N, L = map(int, input().split())water = []# 겹치는 웅덩이는 들어오지 않는다# 웅덩이 좌표 : [1, 6] -> 1 2 3 4 5for _ in range(N):    water.append(list(map(int, input().split())))sortedWater = sorted(water, key=lambda x: (x[0])) # 시작 위치 기준으로 정렬def fix(size, L):    if size % L >= 1:        return size // L + 1    else:        return size // Ldef solve():    resul..

Algorithm/Greedy 2024.08.19

[Baekjoon 7983 / Java / 골드5] 내일 할거야

N은 과제의 개수D는 과제 소요일, T는 과제 마감일이며 D, T 형태로 주어진다. 최대한 과제를 미루고 미루다가 마지막에 한번에 몰아서 하는데, 이 때 첫 과제를 시작하기 전 최대 며칠을 놀 수 있는지를 구하는 문제이다. 먼저 과제 마감일 기준으로 내림차순 정렬을 해줘야 한다. 그리고 day 변수에 가장 긴 마감일을 설정해 둔다. day는 놀 수 있는 날을 저장해둘 변수이며, 반복문이 진행되며 계속해서 갱신된다. 그리고 N번 반복문을 돌리되, day와 e(현재 과제의 마감일)중 더 작은 값에서 s(현재 과제의 소요일)을 뺀다.그 뺀 값을 다시 day에 할당한다. day가 길어도 과제의 마감일이 더 이르다면 마감일에서 s를 빼고,마감일이 길어도 현재 남은 day가 더 짧다면 day에서 s를 뺀다.이걸 반..

Algorithm/Greedy 2024.05.06

[Baekjoon 1026 / Java / 실버4] 보물

두 배열이 있고 배열의 길이는 같다.각 배열 같은 인덱스의 값들을 곱한 값을 전부 더하는데, 그 값을 최소로 만들어야 한다. A 배열은 재배열할 수 있고 B 배열은 재배열할 수 없다.A 배열을 내림차순 정렬한 후, B배열의 최솟값을 찾아 차례대로 곱하여 더해주면 해결할 수 있다. import java.io.*;import java.util.*;public class 보물_1026 {    public static void main(String[] args) throws Exception {                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));        StringTokenizer st;      ..

Algorithm/Greedy 2024.05.03

[Baekjoon 1931 / python / 실버1] 회의실 배정

# 끝나는시간으로 정렬하지 않으면 일찍 시작하고 아주 늦게 끝나는 회의에 말릴 수 있다 # 시작시간으로 정렬해야 회의목록을 순차적으로 돌면서 진행 가능하다 import sys input = sys.stdin.readline N = int(input()) # 회의 개수 talkList = [] # 회의 리스트 (시작시간, 종료시간) for _ in range(N): talkList.append(list(map(int, input().split()))) talkList.sort(key = lambda x: (x[1], x[0])) # 회의 리스트 정렬 ( 끝나는시간으로 정렬 후 시작시간으로 정렬 ) cnt = 1 # 회의개수 셀 변수 end = talkList[0][1] # 첫 회의 끝나는시간을 미리 초기화..

Algorithm/Greedy 2024.04.06

[Baekjoon 1541 / python / 실버2] 잃어버린 괄호

string = input().split('-') result = 0 for i in string[0].split('+'): result += int(i) for i in string[1:]: for j in i.split('+'): result -= int(j) print(result) 그리디 알고리즘 문제이다. 문제 원리는 매우 간단하다. 숫자, '+', '-' 세 가지로만 구성된 문자열이 주어진다. 숫자로 시작해서 숫자로 끝나고, 연산자는 숫자 사이사이에 온다. 여기서 괄호를 원하는 곳에 추가해, 가장 작은 값을 만들어내면 된다. 근데 조금 생각해보면 알 수 있겠지만, 첫번째로 등장하는 '-' 이후의 값들은 전부 뺄 수 있다. 그리고 '-' 이전의 값들은 전부 더하면 된다. 문제의 원리는 쉽다. 하..

Algorithm/Greedy 2024.04.05

[Baekjoon 11047 / python / 실버4] 동전 0

N, money = map(int, input().split()) # 동전 종류, 돈 coinBox = [] for _ in range(N): coinBox.append(int(input())) coinBox.reverse() cnt = 0 for coin in coinBox: # 큰 동전부터 차례로 대입된다 if money >= coin: cnt += money // coin money = money % coin print(cnt) 그리디 알고리즘으로 해결할 수 있는 문제이다. 매 순간 최적의 선택을 하면 되기 때문에, 구현이 그리 어렵진 않다. 동전을 입력받은 후, 반복문을 돌리면 큰 동전부터 나오도록 reverse()메소드로 뒤집는다. 이후 큰 동전부터 반복문을 돌며, 남은 돈이 동전 가치보다 같거..

Algorithm/Greedy 2024.04.05
728x90
반응형