일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- 그리디 알고리즘
- 2 + 1 세일
- 소가 길을 건너간 이유3
- 전자 메일
- 욱제는 효도쟁이야!!
- JoCoding
- 나동빈
- 세탁소 사장 동혁
- 동적 계획 알고리즘
- Pop
- Greedy
- ZOAC 2
- 사과 담기 게임
- 5와 6의 차이
- 구현
- 시저 암호화
- DES 알고리즘
- 백준
- 거스름돈
- 위치 암호화
- 컬럼 암호화
- 비연결형 통신
- 컴퓨터 네트워크
- 통나무 건너기
- 파이썬
- 키워드 암호화
- 코딩 테스트
- 한빛미디어
- 대체 암호화
- 문자 변환표
- Today
- Total
목록그리디 알고리즘 (31)
주니어로서의 백 걸음, 개발자로서의 한 걸음

문제 풀이: 해당 문제는 0 - 1 - 2 - 0 순서로 마셔야 하기 때문에 milk[i]을 cnt를 3으로 나누어준 값으로 비교하면 된다. 만약 milk[i]와 cnt % 3이 같다면 cnt을 1 더해준다. 만약 같지 않다면 마시지 못하기 때문에 지나가고 cnt은 그대로 유지된다. n = int(input()) milk = list(map(int, input().split())) cnt = 0 for i in range(n): if milk[i] == cnt % 3: cnt += 1 print(cnt)

문제 풀이: 최대한 빨리 나무들을 모두 자라게 하려면 오래 걸리는 나무부터 심어야 한다. 따라서 나무들의 일수를 먼저 내림차순 정렬을 한다. 그다음 아래 내용에 따라 새로운 리스트를 만든다. 묘목을 심는 데 걸리는 시간: 1일 묘목이 자라는데 걸리는 시간: tree[i] 몇 번째 나무를 심는지: +i 나무가 다 자란 다음날 이장님 초대: 1일 따라서 새로운 리스트는 tree[i] = tree[i] + i + 1이고 이장님을 초대할 수 있는 날은 (max(tree) + 1) 이다. n = int(input()) tree = list(map(int, input().split())) tree.sort(reverse=True) for i in range(len(tree)): tree[i] = tree[i] + ..

문제 풀이: 해당 문제는 먼저 먹이를 오름차순으로 정렬하고 먹이가 스네이크버드의 길이보다 작거나 같은 경우 스네이크버드의 길이를 1씩 증가시키면 된다. n, l = map(int, input().split()) feed = list(map(int, input().split())) feed.sort() for i in feed: if l >= i: l += 1 print(l)

문제 풀이: 해당 문제는 동적 계획 알고리즘을 이용해서 풀면 된다. 거스름돈을 1원부터 총거스름돈의 액수까지 1씩 증가시키고 각각의 상황에서 2원과 5원을 썼을 때 거스름돈이 최소인 경우를 구하고 거슬러 줄 수 없으면 -1을 출력하면 된다. 예를 들어 거스름돈이 13원인 경우를 보자 처음에 2원짜리 동전을 사용하면 동전을 다 거슬러주지 못하는 상황이 발생한다. 다음으로 5원을 사용하는 경우, 이전에 거스름돈이 8원이었을 때(c [13-5] = c [8], c [8] = 4), 2원짜리 동전 4개 사용됨. 여기에 5원짜리 동전 한 개를 추가하면 13원이 된다. money = int(input()) m = [2, 5] max = 1000000 c = [max] * (money + 1) c[0] = 0 for..

문제 풀이: 해당 문제는 replace함수를 사용할 줄 안다면 쉽게 풀 수 있는 문제이다. 만약 a와 b에 5나 6이 없다면 min, max에 'a + b'의 값이 들어간다. a, b = map(int, input().split()) min = int(str(a).replace('6', '5')) + int(str(b).replace('6', '5')) max = int(str(a).replace('5', '6')) + int(str(b).replace('5', '6')) print(min, max)

문제 풀이: 전자레인지 문제와 비슷하게 풀면 된다. n = int(input()) for _ in range(n): m = int(input()) for i in [25, 10, 5, 1]: print(m // i, end=' ') m = m % i

문제 풀이: 거스름돈 문제와 비슷하게 풀면 된다. 시간을 300초, 60초, 10초로 각각 나누어 몫을 출력한다. 만약 n이 가장 작은 시간인 10으로 나누어 떨어지지 않는다면 -1을 출력한다. m = int(input()) t = [300, 60, 10] if m % 10 != 0: print(-1) else: for i in t: print(m // i, end =' ') m %= i

문제 풀이: 로프를 병렬로 연결하면 각 로프에는 w / k 만큼의 동일한 중량이 걸린다. 즉, 가장 작은 무게를 들 수 있는 로프가 들 수 있는 질량 * 병렬연결 로프의 개수 예를 들어 로프가 들 수 있는 중량이 다음과 같다면 [100, 80, 60, 40, 20] 중량 100을 들 수 있는 로프 한 개를 사용했을 때 들 수 있는 무게: 100 중량 80을 들 수 있는 로프 두 개를 사용했을 때 들 수 있는 무게: 80 * 2 = 160 중량 60을 들 수 있는 로프 세 개를 사용했을 때 들 수 있는 무게: 60 * 3 = 180 중량 40을 들 수 있는 로프 네 개를 사용했을 때 들 수 있는 무게: 40 * 4 = 160 중량 20을 들 수 있는 로프 다섯 개를 사용했을 때 들 수 있는 무게: 20 *..