본문 바로가기

전체보기

(180)
백준[13904] 과제 (Python3) 큐 + 정렬로 풀었는데 태그 까보니 우선순위 큐로도 풀 수 있었던 문제 N의 범위가 작기 때문에 완전 탐색으로 풀 수 있다. 지문 분석 최대한 점수를 많이 주는 과제를 해결해야 한다. 단, 기한이 충분하다면 기간이 얼마 안 남은 다른 과제를 푸는 게 더 유리한지 확인한다. 완전 탐색 날짜를 기준으로 오름차순 정렬한다. N 개의 -1 원소를 갖는 일차원 배열을 선언한다. 각 인덱스는 1일, 2일 ... N일이다. 만약 그날 얻을 수 있는 점수가 -1이고, 제출 기한 내라면, 현재 과제 점수를 넣는다. 그게 아니라면, 1일부터, 그 이전까지 얻은 과제 중 최솟값을 찾아 교체한다. 이를 반복하면 O(N ^ 2)로 해결 가능하다. 더보기 def main(): N = int(input()) works = [] f..
백준[2513] 통학버스 (Python3) 2023 카카오 코테 2번? 하고 똑같다. 코테에서도 무난하게 풀어서 그런지, 생각보다 큰 어려움은 없었다. 지문을 분석해 보면, 버스는 가장 먼 거리에 있는 아이들을 우선으로 태우는 것이 유리하다. 또한, 버스 정원을 다 채우기 위해 왼쪽 오른쪽 왔다 갔다 할 필요가 없다. 학교를 기준으로 왼쪽, 오른쪽에 대한 큐 2개를 만들었다. 단지의 위치가 학교보다 왼쪽에 있다면, (학교 위치 - 단지 위치, 학생 수) 형태로 넣고 학교보다 오른쪽에 있다면, (단지 위치 - 학교 위치, 학생 수) 형태로 넣는다. 그 후 위치 값을 기준으로 정렬한다. 그 후, 단지의 학생 수와 버스 정원을 비교해, 다 태울 수 있다면, 해당 단지에 대한 정보를 pop 하고, 다 태우지 못하면 남은 정원만큼 학생 수를 차감하는 식으..
백준[17615] 볼 모으기 (Python3) 관찰이 필요한 문제 모든 경우에서 볼들을 이동시킨 결과는 [빨강, 파랑] 또는 [파랑 빨강]이 나오게 된다. 따라서, 끝 점의 볼들을 센 다음, 가장 많은 종류의 볼들이 모인 곳을 기준으로 다른 볼들을 움직여야 한다. 이제 4가지 경우에 걸쳐 끝점의 볼을 기준으로 같은 종류의 볼을 모은다. 즉, 맨 왼쪽이 빨간색이라면, 다른 위치에 있는 빨간 볼을 모두 왼쪽으로 모은다. 4가지 경우는 다음과 같다. 1. 맨 왼쪽이 빨간 볼인 경우. 2. 맨 왼쪽이 파란 볼인 경우 3. 맨 오른쪽이 빨간 볼인 경우 4. 맨 오른쪽이 파란 볼인 경우 위 4가지 경우를 통해 움직여진 볼의 개수의 최소값이 답이다. 더보기 N = int(input()) redC, blueC = 0, 0 S = input() for s in S:..
백준[1092] 배 (Python3) 풀이 방향은 금방 알았지만 구현 과정에서 많이 짜증났던 문제. 파이썬 포문에선 인덱스 변수 증감이 안 되다 보니 억지로 맞추다가 2번정도 틀렸다 다른 사람들 풀이보니까 remove를 썼던데 그냥 나도 remove를 썼다면 한번에 풀지 않았을까란 생각이 든다. 지문 분석 무거운 크레인은 무거운 박스를 우선으로 들어야 한다. 가벼운 것 부터 들게 된다면, 박스는 점점 무거워지고, 그 과정에서 노는 크레인들이 발생하기 때문이다. 박스와 크레인을 내림차순 정렬해야 한다. 완전 탐색 옮길 박스가 현재 매달려는 크레인에 달 수 있는지 본다. 만약, 그렇지 않다면 해당 박스는 건너뛰고 다음 박스를 달 수 있는지 본다. 이렇게 모든 크레인을 한번씩 순회하면 전체 시간을 1 증가시킨다. 이제 남은 박스들을 가지고 위의 ..
백준[17616] 등수 찾기 (Python3) 전형적인 그래프 탐색 문제를 응용했다. 이 문제에서 주목할 점은, 정점 X와 뒤, 앞으로 연결된 정점 개수를 파악하는 것이다. 즉, bfs를 두 번 돌려야 한다. 예제 3을 기준으로 보면 우리가 보려는 노드는 정점 1이니, 이 기준으로 본다면 정점 1과 3이 연결돼있고, 3은 4, 5와 연결돼있으니, 정점 1의 뒤엔 3, 4, 5가 있다. 정리하면, 정점1의 뒤에 있는 정점 개수는 3고, 앞에 있는 정점 개수는 0개다. 반면, 정점 2는 정점 1과 어떤 방향으로 연결돼있는지 알 수 없다. 정점 3보다 앞에 있단 것만 알지, 정점 1의 어느쪽에 연결돼는지를 알 수 없다. 다행인건 문제에서 가능한 등수의 최소, 최대만 구하는 것이기 때문에, 애매한 정점들은 하나의 경우에 묶어 생각할 수 있다. 1. 정점 1..
백준[15973] 두 박스 (Python3) 상황별로 여러 분기가 필요한 문제. 완전탐색 노가다로 모든 경우에 대해 조건을 작성한다. 풀 수는 있지만, 코드가 너무 길어지고 중간에 WA를 받기라도 한다면 너무 피곤해진다. 완전탐색 최적화 도형의 순서를 정한다. 예를 들자면, 두 도형이 있을 때, x축을 기준으로 왼쪽에 있는 도형은 반드시 하나가 있을 것이다. 나는 왼쪽에 오는 박스를 A, 오른쪽에 오는 박스를 B로 정해 고려할 경우의 수를 반으로 줄였다. 그 다음 박스 A의 x2 좌표와 박스B의 x1 크기를 비교하면, 분기 초입을 2가지로 축소할 수 있다. 편의상 박스 A의 x2는 Ax2식으로 표기한다. + Ax2 == Bx1 + + 특정 값들이 같다면 POINT이다. + + Ay1, By1, By2 가 특정 값 범위라면 LINE이다. + Ax2 ..
백준[19585] 전설 (Python3) TLE 해결법을 몰라서 풀이 살짝 본 문제 딕셔너리 키값이 아스키 문자 하나인 경우, 숫자로 바꿔주는 게 TLE 받을 일이 적어질 거란 것을 알았다. 시간 초과 - 재귀 풀이 색상 이름이 aa, aaa인 경우 비교 과정에서 aa에서 색상 이름 비교를 중단하고 닉네임을 비교할지, 색상을 마저 비교할지에 대해 분기를 태워야 한다 생각했다. 80%대에서 TEL를 받았다. 문자열 뒤집기 다른 사람들 풀이 보고 적용한 풀이 색상 같은 경우 그냥 앞에서 비교하면 되지만, 닉네임 같은 경우 어디부터 시작할지를 모른다. 하지만 확실한 것은 수상할 팀명의 마지막은 무조건 닉네임이 들어간다. 따라서 닉네임을 입력받을 때, 뒤집어서 입력받고 비교하는 부분도 팀명을 뒤집어서 비교한다. 이 과정에서 문자열의 끝을 의미하는 토큰..
백준[14867] 물통 (Python3) 독해력이 필요한 문제. 지문 분석을 잘못해 그리디로 생각해버렸다. 다른 물통에 물을 옮길 땐, 제한을 넘지 않는다면 '모두 옮겨야' 하는 건데, 일부만 넣을 수 있다고 이해해서 고생 좀 했다. dp나 방문 처리를 해서 풀기엔 a, b의 범위의 최대 값이 100,000이기 때문에 메모리 초과가 발생한다. 이 방문 처리를 어떻게 할지 생각한 결과 set을 사용하기로 했다. 완전 탐색 다음 6가지에 대해 생각할 수 있다. 물통 A를 가득 채운다. F(A) 물통 B를 가득 채운다. F(B) 물통 A를 비운다. E(A) 물통 B를 비운다. E(B) 물통 A의 물을 B로 옮긴다 M(A, B) 물통 B의 물을 A로 옮긴다 M(B, A) 다만 5, 6의 경우 물을 '다 옮기면' 제한을 넘는지 확인할 필요가 있다. 이 ..