그리디 11

[Python/BOJ] 백준2212 센서_그리디

https://www.acmicpc.net/problem/2212 2212번: 센서 첫째 줄에 센서의 개수 N(1 ≤ N ≤ 10,000), 둘째 줄에 집중국의 개수 K(1 ≤ K ≤ 1000)가 주어진다. 셋째 줄에는 N개의 센서의 좌표가 한 개의 정수로 N개 주어진다. 각 좌표 사이에는 빈 칸이 하나 있 www.acmicpc.net 5번을 읽었는데 문제가 잘 이해가 안되서 답을 찾아봤다.😂 그냥 쉽게 말하면 n개의 센서를 k개의 구간으로 나누기 더만!! 내가 독해력이 떨어지나....ㅋㅋㅋ 정렬을 이용하여 그리디 방식으로 풀이하였다. - 만약 집중국의 개수가 센서보다 크거나 같다면 0이다. 1) 센서들을 순서대로 만든다.(오름차순 정렬) 2) 센서들..

[Python/BOJ] 백준2138 전구와 스위치_그리디

이해하는게 참 어려웠던 문제다. 앞서 풀었던 행렬처럼 (https://what-am-i.tistory.com/408) 그리디이기 때문에 한번만 돌면서 다르면 바꾸고 이런 식일거라고 생각했다. 그런데 이 문제는 i-1, i, i+1 이 변경이되고 가장 앞과 가장 뒤는 2개씩만 변경되니까 어떻게 나눠야할지 막막했다. 찾은 방법은 바로! 내 앞에 있는 전구와 동일한 위치의 목표로 하는 전구가 다르면 나를 변경시킨다! 앞에 있는 전구를 보기 때문에 첫번째 있는 전구는 볼 전구가 없다. 그래서 첫번재 전구를 키는 경우, 안키는 경우 두가지를 확인하여 최소값을 찾으면 된다. # 0은 1으로 , 1은 0으로 def change(num) : return 1 - num def flip(state,cnt) : # 첫번째 ..

[Python/BOJ] 백준 1080 행렬_그리디

이 문제를 보고 든 생각 : 이거를 내가 어떻게 구해 🥴 그리디인가....라는 느낌이 들기는 했지만 어떻게 그리디하게 풀지 생각이 안나서 풀이를 찾아봤다. 역시 그리디였고 풀이는 내가 바꿀수 있는거만 바꾸고 이게 맞으면 다음 칸으로~ 내가 바꿀 수 있는 것만 신경쓰고 바꾼 다는게 우리 인생에서 꼭 필요한 생각같다. 내가 바꿀 수 있는 것과 없는것을 구분하는 지혜와 바꿀 수 있는 것에 집중하는 능력이 중요하다. 그냥 알고리즘 풀다가 드는 뻘생각...ㅋㅋㅋ 현재 내 위치만 보고 내 위치의 원소가 같은 위치에서의 B행렬과 일치하지 않는다면 뒤집기 때문에 그리디라고 한다. 근데 왜 이게 최소 횟수지? 순서대로 하는게 최소인가 왔다갔다하면서 최소로 바꿀수도 있는거 아닌가? 아 예를 들어 내부에 있는거 먼저 하고 ..

그리디_회의실 배정, 씨름선수, 창고 정리, 침몰하는 타이타닉, 증가순열만들기, 역수열

그리디는 탐욕적인 이라는 의미로 지금 현재 가장 최적의 것을 계속 골르는 것이다. 주로 정렬과 함께 한다. 회의실 배정 코드 : if __name__=="__main__" : n = int(input()) meeting = [list(map(int,input().split())) for _ in range(n)] meeting.sort(key = lambda x : (x[1],x[0])) endTime,cnt = 0,0 for s,e in meeting : if s >= endTime : cnt +=1 endTime = e print(cnt) => 끝나는 시간을 오름차순으로 정렬한 후 시작시간이 이전 회의의 끝나는 시간보다 늦거나 같으면 해당 회의를 넣는다. 씨름 선수 코드 : if __name__=="..

[Python/프로그래머스]단속 카메라_Greedy(그리디)

https://programmers.co.kr/learn/courses/30/lessons/42884 코딩테스트 연습 - 단속카메라 [[-20,-15], [-14,-5], [-18,-13], [-5,-3]] 2 programmers.co.kr 1. 빨리 끝나는 순으로 정렬한다. 2. 카메라를 가장 처음에 둔다. 3. 구간 시작보다 카메라가 이전에 있다면 3-1. 끝나는 곳에 카메라를 설치한다. 코드 : def solution(routes): answer = 0 routes.sort(key = lambda x : x[1]) # 빨리 끝나는 순으로 정렬 camera = -30001 for route in routes : if camera < route[0] : # 시작위치보다 전에 카메라가 있다면 answe..

[Python/프로그래머스]구명보트_Greedy(그리디)

https://programmers.co.kr/learn/courses/30/lessons/42885 코딩테스트 연습 - 구명보트 무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없고, 무게 제한도 있습니다. 예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 5 programmers.co.kr 인덱스를 이용해서 풀이한다. 직접 pop해서 풀면 효율성에서 실패한다고 한다. 코드 : def solution(people, limit): answer = 0 people.sort() i ,j = 0, len(people)-1 # i : 가장 마른 사람, j : 가장 뚱뚱한 사람 while i

[Python/프로그래머스]큰 수 만들기__Greedy(그리디)

https://programmers.co.kr/learn/courses/30/lessons/42883 코딩테스트 연습 - 큰 수 만들기 programmers.co.kr while (최근에 넣은 수 보다 지금 넣는 수가 더 크다면 ): pop을 해준다. 그게 현재 가장 최적의 값이니까!! 코드 : def solution(number, k): answer = [] for num in number : while k > 0 and answer and answer[-1] < num : answer.pop() k -= 1 answer.append(num) return ''.join(answer[:len(answer)-k]) 문제를 풀고 든 생각 : 왜 반환할 때 [:len(answer)-k]일까? 그냥 [:-k] ..

[Python/프로그래머스]조이스틱_Greedy(그리디)

https://programmers.co.kr/learn/courses/30/lessons/42860 코딩테스트 연습 - 조이스틱 조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다. ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA 조이스틱을 각 방향으로 움직이면 아래와 같습니다. ▲ - 다 programmers.co.kr 코드 : def solution(name): # 조이스틱 조작 횟수 answer = 0 # 기본 최소 좌우이동 횟수는 길이 - 1 min_move = len(name) - 1 for i, char in enumerate(name): # 해당 알파벳 변경 최솟값 추가 answer += min(ord(char) - ord('A'), ord('Z'..

[Python/프로그래머스] 체육복_그리디

https://programmers.co.kr/learn/courses/30/lessons/42862 코딩테스트 연습 - 체육복 점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번 programmers.co.kr 그리디 : 결정을 해야 할 때 그 순간 최적의 해를 선택하며 최종 해답에 도달한다. 그 순간 가장 좋지만, 전체적으로는 아닐 수도있기에 검증이 필요하다. 이 문제의 핵심은 왼쪽 학생 먼저 확인하는 것이다. 왼쪽을 먼저 확인하고 체육복을 주는 것이 더 많은 아이들이 체육복을 입을 수 있다. 그 이유는 왼쪽 부터 set을 확인하기 때문이다. 오른쪽 먼저 확인한다면 왼..

[python]이코테 - 만들 수 없는 금액(그리디)

쉬워보이는데 안풀려서 화가났다. 알고리즘을 계속 공부하는데 왜이렇게 머리가 안굴러가는거지? 시간만 낭비하는것같고 실력은 오르지않는것같다. 내가 코딩을 할 머리가 아닌가? 바보 멍청이다. n = input() arr = list(map(int, input().split())) target = 1 arr.sort() for i in arr : if target < i : break else : target += i print(target) target은 내가 만들 수없는 수를 뜻한다. 처음에 1부터 시작한다. 입력받은 수를 정렬하여 오름차순으로 만든다. 동전 중 가장 작은 수가 내가 만들 수 없는 수보다 크다면 그게 답이다 만약 내가 만들 수 없는 수 보다 작다면 그 수를 더해서 만들 수 없는 수를 upgr..

프로그래밍 2021.12.26