목록알고리즘 (22)
성장기록지
문제풀이이 코드는 파이어볼을 이동시키고, 충돌 시 합쳐지는 로직을 구현한 시뮬레이션 문제다.기본적으로 arr이라는 2차원 리스트를 사용해 각 좌표에 있는 파이어볼 정보를 저장한다. 초기에는 파이어볼의 위치와 정보를 입력받아 fireballs 리스트에 저장하고, 이후 K번의 이동을 수행한다.파이어볼 이동각 파이어볼을 현재 위치에서 방향과 속력에 따라 이동시킨다. 격자를 벗어나지 않도록 N으로 나눈 나머지를 이용해 위치를 조정한다.이동한 파이어볼을 다시 저장이동이 끝난 후, 새로운 위치에 파이어볼 정보를 저장한다.파이어볼 합치기같은 위치에 여러 개의 파이어볼이 모이면,질량과 속력을 합산하여 새로운 파이어볼을 만든다.원래 방향이 모두 홀수이거나 모두 짝수이면 [0, 2, 4, 6] 방향으로 나누고, 그렇지 않..
문제풀이파이썬의 우선순위 큐는 기본적으로 최소 힙이므로, 튜플로 (-num,num)을 입력하여 최대 힙을 따로 구현해주었다.그런 후 최소값을 삭제할 때는 최소 힙에서 최소값을 반환하여, 최대 힙에서 삭제해 주고,최대값을 삭제할 때는 최대 힙에서 최댓값을 반환하여 최소 힙에서 삭제해 주었다.정답은 맞았지만 계산해보니 최대 경우의 수가 50만개를 삽입하고 50만개를 삭제할때 50만개의 등차수열만큼 시간이 걸린다고 생각이 되었다. 아마 프로그래머스에 테스트케이스가 널널하게 계산되어있는거 같다. 추가로 최적화 작업을 해봐야겠다. 코드import heapqdef solution(operations): max_heap=[] min_heap=[] count= 0 for i in operation..
문제 풀이프로그래머스 lv3라고해서 걱정했지만,간단한 예외처리를 해주면 되는 DP문제이다.우선 삼각형 맨 위에 있는 숫자는 dp 배열에 직접 넣어준다.이후 삼각형의 숫자가 행이 내려갈수록 더해져야 하는데, 그 숫자에 근접한 이전 행의 숫자만 더할 수 있다.따라서 i행의 j번째숫자는 i-1행의 j번째 숫자와 i-1행의 j-1번째 숫자 중 큰 숫자를 더해주면 되는 것이다.그리고 각 삼각형 행에 있는 첫번째 숫자일때와 마지막 숫자일때만 예외처리를 해주면 된다.첫번째일 때는 i-1행의 j번째(첫번째) 숫자를 더해주면 되고,마지막일 때는 i-1행의 j-1번째 숫자를 더해주면 된다. 코드def solution(triangle): dp=[] tri_len=len(triangle) for i in r..
문제 풀이트리를 순회하며 각 노드의 번호를 구하는 문제이다.트리는 중위순회를 진행하라고 설명에서 작성되어 있다.(중위순회란? LEFT - ROOT - RIGHT 순서대로 순회하는것.) 재귀를 통하여 문제를 풀고자 하였다.한 노드의 왼쪽 자식노드 인덱스는 2^n+1 이고 오른쪽은 2^n+2 이기 때문이다.따라서 아래와 같이 재귀함수를 구성하였다.def back(n): if n>=max_count: return back(2*n + 1) ans[n] = lst.popleft() back(2*n + 2) 루트 노드들은 먼저 입력받은 숫자에서 가장 왼쪽 값을 빼서 넣어주며 정답 리스트인 ans를 완성하였다. 이후에 for문을 통해 각 레벨마다 값을 출력해주며 마무리하였다. ..
문제풀이같은 단어를 그리디를 통해 어떻게 최대값과 최소값을 구별하는지가 목표인 문제다. 나는 다음과 같이 설정하고 문제를 풀었다. 최댓값은 M의 값들을 모두 10으로 곱해 누적한 뒤 K를 만나면 최종적으로 5를 곱해 처리.최소값은 M의 길이에 따라 지수 계산 (10^(길이-1))으로 값을 처리하며, K는 5를 직접 추가생각보다 쉽게 풀려서 놀랐던 문제이다. 코드n = input()num=''ans_lst=[]for i in n: num= num+i if i=='K': temp=1 for j in num: if j =='M': temp= temp*10 elif j=='K': tem..
문제풀이 예시와 같은 ABCDE가 있다는 뜻은, 그래프 안의 특정 노드에서 5개 이상 연결되어있는 것이 있는지 묻는 것과 같다.따라서 dfs를 통해서 그래프들을 탐험하게 하였고, 그중에 5개의 이상 노드가 연결되어 있을 때 (cnt>=4 일 때)ans를 1로 만들어 1을 출력하게 하였다.from collections import defaultdictimport sysinput = sys.stdin.readlinelimit_number = 15000sys.setrecursionlimit(limit_number)dic = defaultdict(list)n,m = map(int,input().split())for i in range(m): a,b= map(int,input().split()) dic..
.문제https://www.acmicpc.net/problem/14888초기 풀이많이 생각할 것 없이, 백트래킹을 통해서 문제를 해결하면 된다 .처음에는 아래와 같이 연산자들을 담는 giho라는 리스트를 활용해서 연산을 진행해주었다.하지만 그러기 위해선 visited 리스트도 활용해야 하였고, visited에 있는지 확인해주느라 시간이 많이걸렸다.n=int(input())nums = list(map(int,input().split()))lst = list(map(int,input().split()))giho = []for i in range(lst[0]): giho.append('+')for i in range(lst[1]): giho.append('-')for i in range(lst[2]..
문제https://www.acmicpc.net/problem/2668풀이아래줄의 숫자가 윗줄과 같을 때, 그래프에 넣어준다고 하면 예시 문제는 다음과 같이 표현할 수 있다.1: [2, 3]2: []3: [1]4: [6]5: [4, 5]6: [7]7: [] 이 그래프를 그림으로 그린다면,아래와 같이 표시할 수 있게 된다. 정답인 1,3,5가 사이클로 돌아가는 것을 알 수 있다. 이 문제는 그래프를 dfs탐색하여, 사이클이 생길때마다 것을 정답 리스트에 보관하여 해결할 수 있는 것이다.풀이 코드from collections import defaultdictn=int(input())dict = defaultdict(list)def dfs(x, visited): visited.add(x) check..
문제링크 : https://leetcode.com/problems/reorder-data-in-log-files/문제 해석조건에 맞게 로그를 재정렬해라.1.로그의 가장 앞부분은 식별자로서, 순서에 영향을 끼치지 않는다.2.문자로 구성된 로그가 숫자 로그보다 앞에 오며, 문자 로그는 사전순으로 한다.3.문자가 동일할 경우에는 식별자순으로 한다.4.숫자 로그는 입력 순서대로 한다. 문제 해결문자로 구성된 로그는 코틀린의 sortwith을 활용하여 세부 조건에 맞는 정렬을 하였다. sortwith()이란??Comparator를 지정할 수 있습니다. 즉, Comparator를 변경해 자신이 원하는 조건으로 리스트를 정렬하는 것 입니다. 해결 코드class Solution { fun reorderLogF..
문제https://www.acmicpc.net/problem/2636문제 해결치즈가 공기중에 만나면 녹는다는 설명이 제일 중요하다.공기가 정확히 무엇인지 설명해주지 않아서 유추하느라 시간이 많이 걸렸다..여러 가설끝에 찾아낸 정답을 설명해보겠다. 아래 그림을 보면 c가 다음 시간에 녹는 치즈들을 표시해둔 것으로,하얀색 부분이 공기라 맞닿은 면이 녹는건가? 라는 생각을 했다.하지만 그렇게 가정하면 빨간색 화살표로 표시된 곳의 하얀색 부분도 공기인데맞닿은 면들이 녹는 표시가 없으므로,하얀색 면은 빈 공간이라 공기가 있을수도 있지만치즈로 둘러쌓인 하얀색 면은 치즈 안쪽이라 공기가 없구나 라는 생각을 하게 되었다. 그렇다면 항상 치즈 바깥에 있는 빈 공간 에서부터, 하얀색 면들을 bfs로 전부 탐색한 후 ..