그리디 알고리즘

[Python]알고리즘/백준

[그리디 알고리즘] ▲ 13305번 - 주유소(완전탐색)

[백준] 13305번 - 주유소 1) 문제 해결 아이디어 아이디어를 떠올리는 것은 어렵지 않았으나 이것을 수식화하는 것이 좀 오래걸렸다. 여기서 핵심은 현재까지 최소 가격보다 더 작은 값의 가격이 나타나면 최소가격(target)을 갱신하는 것이다. 비용(cost)는 거리(distance[i])에 가격(price[i])을 곱한 값으로 계산한다. 2) 소스코드 n = int(input()) # 도시 수 distance = list(map(int, input().split())) # 도시 간 거리(n-1 개) price = list(map(int, input().split())) # 리터당 가격(n 개) cost = 0 # 총 비용 target = 1e9 # 현재까지 최소 가격 for i in range(n-..

[Python]알고리즘/백준

[그리디 알고리즘] ★★ 1783번 - 병든 나이트

[백준] 1783번 - 병든 나이트 1) 문제 해결 아이디어 처음에는 방향벡터를 설정하여 직접 나이트를 움직여야한다고 생각했는데 이 문제는 그런 방식으로 푸는 문제가 아니었다. 세로(n)이 1이면 m의 값과 상관없이 어느 방향으로도 이동할 수 없으므로 항상 1이다. 세로(n)이 2라면 2, 3번 방법으로만 이동할 수 있다. 방문한 칸이 4개가 넘어가면 모든 방법을 다 써야하기 때문에 움직이고 싶어도 더이상 움직일 수 없다. 여기서 최댓값은 4이고 m에 값에 따른 방문칸 수는 아래와 같으므로 이를 수식으로 나타내면 (m+1) // 2 이다. m 방문칸 수 이동 방법(y) 2, 3 방법은 무조건 +2 만 가능 ( ) 안에서는 자유롭게 이동 가능 1 1 1 2 1 1 3 2 1 + (2) 4 2 1 + (2)..

[Python]알고리즘/백준

[그리디 알고리즘] ★ 11000번 - 강의실 배정

[백준] 11000번 - 강의실 배정 (풀이1) 시간 초과된 실패 코드 1) 문제 해결 아이디어 아이디어는 쉽게 떠올렸으나 시간초과로 실패하였다. input() 문제인가 싶어 sys.stdin.realine()으로 대신했으나 또 시간초과가 되었다. for문 내에서 해당 강의를 room에 넣고 나면 다시 room을 끝 값 기준으로 오름차순 정렬하는 것을 반복하도록 하였는데 이런 방식으로 인하여 시간초과가 생기는 것 같았다. 시간초과 문제를 해결하기 위해 다른 방식으로 구현할 필요성을 느꼈다. 2) 소스코드 import sys n = int(input()) # 수업 수 # n 개의 수업 정보 arr = [list(map(int, sys.stdin.readline().split())) for _ in rang..

[Python]알고리즘/백준

[그리디 알고리즘] 4796번 - 캠핑

[백준] 4796번 - 캠핑 1) 문제 해결 아이디어 단순한 수학 문제로 식을 쉽게 도출해낼 수 있었다. 누구나 식은 잘 도출해낼테지만 여기서 주의할 점은 나머지 일 수에 대해 조건 처리하는 부분이다. 나머지 일 수(v % p)가 사용 가능 일 수(l)보다 크다면 여기서 (v % p)를 더해주는 것이 아니라 l을 더해주어야 한다. 2) 소스코드 i = 0 # 인덱스 while True: i += 1 l, p, v = map(int, input().split()) # 탈출 조건(입력 종료) if(l == 0 and p == 0 and v == 0): break # 최대 캠핑장 사용일 수 계산 res = (v // p) * l res += min(v % p, l) # 남은 일 수에 대한 조건 처리 print..

[Python]알고리즘/백준

[그리디 알고리즘] 1439번 - 뒤집기

[백준] 1439번 - 뒤집기 1) 문제 해결 아이디어 아이디어는 쉽게 떠올렸다. 0과 1로만 이루어진 문자열에서 변화 횟수(cnt)를 세는 것이 포인트다. 예를 들어, 변화 횟수와 뒤집어야하는 최소 횟수는 다음과 같다. 문자열(s) 변화 횟수(cnt) 최소 뒤집기 횟수 0 0 0 01 1 1 010 2 1 0101 3 2 01010 4 2 (변화 횟수(cnt) + 1) // 2 가 최소 뒤집기 횟수이다. 2) 소스코드 s = input() # 0, 1로 구성된 문자열 cnt = 0 # 변화 횟수 for i in range(len(s) - 1): # 이전 숫자와 현재 숫자가 다를 경우 if(s[i] != s[i+1]): cnt += 1 print((cnt + 1) // 2)

[Python]알고리즘/백준

[그리디 알고리즘] ▲ 2875번 - 대회 or 인턴

[백준] 2875번 - 대회 or 인턴 (풀이1) 1) 문제 해결 아이디어 아이디어는 쉽게 떠올렸으나 탈출 조건을 세우는데 오류를 겪었다. 여학생 n명, 남학생 m인 총 n + m 명 중에서 k명은 인턴쉽에 참가해야한다. 한 팀은 2 : 1 로 구성되어 있기 때문에 while문 내에서 팀(team)을 1개 만들 때 마다 여학생(n)은 2명씩, 남학생(m)은 1명씩 뺀다. 하지만 n이나 m이 음수가 되거나 나머지 학생수(n+m)이 인턴쉽 참가인원(k)보다 작아질 경우, 현재 결성된 팀의 개수에서 1개를 뺸 후 탈출한다. 2) 소스코드 n, m, k = map(int, input().split()) team = 0 # 팀 수 while True: # 탈출 조건 if(n < 0 or m < 0 or n + m..

[Python]알고리즘/백준

[그리디 알고리즘] ▲ 1946번 - 신입 사원

[백준] 1946번 - 신입 사원 1) 문제 해결 아이디어 처음에 제출했을 때는 시간초과로 실패했다. 시간 초과가 떴을 때는 input() 대신 sys.stdin.readline() 을 이용한다. 그런데도 시간초과가 떴다. 처음 생각한 방법은 일단 서류 순위 기준으로 오름 차순 정렬한다. (동석차는 없으므로 서류 기준으로만 정렬해도 된다.) 서류, 면접 둘 중 1개라도 1위인 지원자는 무조건 뽑힌다. 오름차순 정렬해놓았으므로 0번째 인덱스인 지원자는 자동 선발 처리하여 선발 인원 수(cnt)를 1로, 최고 면접 순위(high_rank)를 0번째 인덱스 지원자의 면접 순위로 초기화한다. 다음 인덱스인 1 ~ (n - 1)번째 리스트를 대상으로 for문을 돌린다. 선발이 되면 선발 인원수(cnt)를 변경하고..

[Python]알고리즘/백준

[그리디 알고리즘] ★ 10610번 - 30

[백준] 10610번 - 30 (풀이1) 정답 코드 1) 문제 해결 아이디어 해당 문제는 3의 배수임을 판별하는 조건을 알고 있으면 쉽게 풀 수 있는 문제였다. 배수 판별법에 따라 3의 배수는 각 자리의 숫자의 합이 3의 배수인 수이다. - 일의 자리수가 0 - 각 자리의 숫자들의 합이 3의 배수 일단 입력한 문자열을 리스트로 변환하여 내림차순 정렬하는 것이 포인트다. 30의 배수가 되는 조건 2개를 다 만족한다면 최댓값은 내림차순으로 정렬한 값이 될 것이다. [참고] https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=sctivcrmnfe&logNo=220859963688 3. (2,3,4,5,6,8,9) 배수 판별법 및 증명-1 기..

HSY_mumu
'그리디 알고리즘' 태그의 글 목록 (2 Page)