[Python]알고리즘/백준

[Python]알고리즘/백준

[그리디 알고리즘] 16435번 - 스네이크버드

[백준] 16435번 - 스네이크버드 풀이 시간: 10분 이내 1) 문제 해결 아이디어 문제에 나온대로 구현만 하면 되는 쉽게 풀 수 있는 문제다. 높이가 작은 것부터 검사해야 많은 과일을 먹어 길이가 최대가 될 수 있으므로 과일 높이(h)를 오름차순 정렬한다. for문에서 과일 높이가 스네이크 버드 길이보다 커지면 더이상 과일을 먹을 수 없기 때문에 break로 탈출한다. 이미 앞에서 오름차순 정렬이 된 상태이기 때문에 뒤에 값은 더 검사해볼 필요도 없다. 2) 소스코드 n, l = map(int, input().split()) # 과일 개수, 초기 길이 h = list(map(int, input().split())) # 과일 높이(n개) h.sort() # 과일높이 오름차순 정렬 length = l ..

[Python]알고리즘/백준

[그리디 알고리즘] ▲ 1744번 - 수 묶기

[백준] 1744번 - 수 묶기 (풀이1) 양수, 음수 리스트로 입력받아 계산하기 1) 문제 해결 아이디어 여기서는 처음부터 양수, 음수 2개의 리스트로 나누어 입력을 받고 이후에 계산을 하는 방식이다. 아이디어는 쉽게 떠올렸으나 주어진 테스트 케이스에서는 결과값이 제대로 나왔으나 나머지 테스트 케이스에 대해 오답이 나와 설계 오류를 찾는데 시간이 조금 걸렸다. 여기서 묶는 다는 것은 두 값을 곱한다는 뜻이고 묶지 않는다는 것은 두 값을 더한다는 뜻이다. 1. 양수끼리 묶기(양수는 내림차순 정렬하여 순서대로 양수끼리 곱셈) 2. 음수끼리 묶기(음수는 오름차순 정렬하여 순서대로 음수끼리 곱셈) 3. 0은 음수와 묶기(0은 음수와 곱셈) 4. 양수, 음수 묶지 않기(양수와 음수는 덧셈) 첫번째 오류. 1에 ..

[Python]알고리즘/백준

[그리디 알고리즘] ★ 1700번 - 멀티탭 스케줄링

[백준] 1700번 - 멀티탭 스케줄링 (풀이1) 실패 코드 1) 문제 해결 아이디어 첫번째 오류. if문 검사 순서 문제 1. 멀티탭에 빈 구멍이 있을 경우 코드 2. 멀티탭에 현재 플러그가 있는 경우 코드 이런 순서로 검사를 하면 잘못된 코드가 된다. 예를 들어, 입력이 아래과 같다고 하면 2 7 2 2 2 3 1 2 7 1번 조건을 먼저 검사하게 되면 [2, 2] 이런식으로 같은 숫자가 중복으로 들어가게 되는 문제가 있을 수 있다. if문에서는 검사할 조건 순서를 신중하게 설정하자!!!!! 두번째 오류. order 슬라이싱 인덱스 문제 처음엔 현재 플러그(pivot) 기준으로 뒤 순서에 있는 플러그들에 대해서만 검사하도록 order[i+1: ] 으로 코드를 짰는데, 런타임 에러가 났다. 생각해보니 ..

[Python]알고리즘/백준

[그리디 알고리즘] ▲ 1969번 - DNA

[백준] 1969번 - DNA (풀이1) zip()함수로 2차원 리스트 뒤집고 Counter로 빈도수 세기 1) 문제 해결 아이디어 아이디어는 쉽게 떠올렸다. HD란 길이가 같은 두 DNA 각 위치의 문자가 다른 것의 개수이다. 예를들어, AGCAT와 GGAAT의 HD는 2이다. (첫번째, 3번째가 다름) n개의 길이 m인 DNA가 주어졌을 때, HD의 합이 최소가 되게하려면 HD값 자체가 최소가 되어야 한다. 주어진 DNA들의 각 자리 문자들 중 가장 빈도수가 높은 것을 선택해야 HD의 값이 가장 최소가 된다. 열 단위로 검사하려면 2차원 리스트(dna)의 행과 열을 바꾸는 것이 코드를 짜기에 편하다. 2중 for문으로 row와 column을 뒤집을 수도 있으나 여기서는 zip() 함수를 이용해 2차원..

[Python]알고리즘/백준

[그리디 알고리즘] 2847번 - 게임을 만든 동준이

[백준] 2847번 - 게임을 만든 동준이 (풀이1) for문, while문을 다 쓰는 방법 1) 문제 해결 아이디어 아이디어는 쉽게 떠올릴 수 있었다. 이 문제의 핵심은 높은 레벨의 점수가 낮은 레벨의 점수보다 항상 높아야 한다는 것이다. 낮은 레벨부터 차례대로 점수가 입력되었기 때문에 검사는 높은 레벨부터 해야한다. 역순으로 검사를 해야하므로 인덱스 처리를 쉽게하기 위해 해당 리스트(score)을 뒤집는다. 현재 값이 이전 값보다 크다면 점수가 잘못된 것이므로 점수(socre[i])를 1 감소 시키고 감소횟수(cnt)를 1 증가한다. 2) 소스코드 n = int(input()) # 레벨 수 score = [int(input()) for _ in range(n)] # 레벨 클리어 점수 score.rev..

[Python]알고리즘/백준

[그리디 알고리즘] 1449번 - 수리공 항승

[백준] 1449번 - 수리공 항승 1) 문제 해결 아이디어 아이디어는 쉽게 떠올릴 수 있는 문제였다. 물이 새는 곳의 위치 기준 좌우 0.5 길이 즉, 테이프 길이 1인 테이프 1개로 막을 수 있다. 좌우 0.5이지만 편의상 새는 곳 위치 기준 우측으로 길이 1만큼 막는다고 풀어도 같은 결과가 나온다. 먼저, 새는 곳 위치(loc)를 올림차순 정렬한다. (왼쪽부터 새는 곳을 차례로 막기 위함) 첫번째 새는 곳은 무조건 새로운 테이프를 써서 막아야 하기 때문에 테이프 수(cnt)를 1로 초기화 하고 테이프 끝 지점(tape_end)를 새는 곳 위치(loc[0]) 에서 테이프 길이(l)만큼 더한 값으로 초기화 한다. 나머지 새는 곳의 위치에 대하여 for문을 돌린다. 현재 새는 곳 위치의 끝지점이 최근 붙..

[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)..

HSY_mumu
'[Python]알고리즘/백준' 카테고리의 글 목록 (12 Page)