[백준] 1700번 - 멀티탭 스케줄링 (풀이1) 실패 코드 1) 문제 해결 아이디어 첫번째 오류. if문 검사 순서 문제 1. 멀티탭에 빈 구멍이 있을 경우 코드 2. 멀티탭에 현재 플러그가 있는 경우 코드 이런 순서로 검사를 하면 잘못된 코드가 된다. 예를 들어, 입력이 아래과 같다고 하면 2 7 2 2 2 3 1 2 7 1번 조건을 먼저 검사하게 되면 [2, 2] 이런식으로 같은 숫자가 중복으로 들어가게 되는 문제가 있을 수 있다. if문에서는 검사할 조건 순서를 신중하게 설정하자!!!!! 두번째 오류. order 슬라이싱 인덱스 문제 처음엔 현재 플러그(pivot) 기준으로 뒤 순서에 있는 플러그들에 대해서만 검사하도록 order[i+1: ] 으로 코드를 짰는데, 런타임 에러가 났다. 생각해보니 ..
[백준] 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차원..
[백준] 2847번 - 게임을 만든 동준이 (풀이1) for문, while문을 다 쓰는 방법 1) 문제 해결 아이디어 아이디어는 쉽게 떠올릴 수 있었다. 이 문제의 핵심은 높은 레벨의 점수가 낮은 레벨의 점수보다 항상 높아야 한다는 것이다. 낮은 레벨부터 차례대로 점수가 입력되었기 때문에 검사는 높은 레벨부터 해야한다. 역순으로 검사를 해야하므로 인덱스 처리를 쉽게하기 위해 해당 리스트(score)을 뒤집는다. 현재 값이 이전 값보다 크다면 점수가 잘못된 것이므로 점수(socre[i])를 1 감소 시키고 감소횟수(cnt)를 1 증가한다. 2) 소스코드 n = int(input()) # 레벨 수 score = [int(input()) for _ in range(n)] # 레벨 클리어 점수 score.rev..
[백준] 1449번 - 수리공 항승 1) 문제 해결 아이디어 아이디어는 쉽게 떠올릴 수 있는 문제였다. 물이 새는 곳의 위치 기준 좌우 0.5 길이 즉, 테이프 길이 1인 테이프 1개로 막을 수 있다. 좌우 0.5이지만 편의상 새는 곳 위치 기준 우측으로 길이 1만큼 막는다고 풀어도 같은 결과가 나온다. 먼저, 새는 곳 위치(loc)를 올림차순 정렬한다. (왼쪽부터 새는 곳을 차례로 막기 위함) 첫번째 새는 곳은 무조건 새로운 테이프를 써서 막아야 하기 때문에 테이프 수(cnt)를 1로 초기화 하고 테이프 끝 지점(tape_end)를 새는 곳 위치(loc[0]) 에서 테이프 길이(l)만큼 더한 값으로 초기화 한다. 나머지 새는 곳의 위치에 대하여 for문을 돌린다. 현재 새는 곳 위치의 끝지점이 최근 붙..
[백준] 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-..
[백준] 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)..
[백준] 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..
[백준] 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..