전체 글

항공대 알고리즘 동아리 Koala 🥰
· Koala - 4기
자바스크립트를 주로 사용해와서 보자마자 아래와 같은 데이터 구조를 만들면 되겠구나! 생각했지만, 파이썬에서는 나름 생각할게 많았던 문제였습니다. const infos = { Cpp: [1, 2, 3, 4, 5], python: [1, 2, 3, 4] ... } 우선 구현해야 할 것은 명확했는데, 파이썬의 딕셔너리(C++의 맵과 유사합니다!)를 활용해 (키 : 값) 쌍을 (정보 이름 : 정보 값이 담긴 우선순위 큐) 형태로 만들어주면 될 것 같았습니다. 그래서 처음에는 infoMap = dict([name, infoHeap]) 처럼 코드를 작성해 문제를 풀려 했는데, 파이썬의 딕셔너리는 C++과 다르게 "문자열 : 리스트" 타입의 맵으로 초기화할수 없다는 것을 알게 되었습니다. 다만 초기화가 아닌, 빈 맵..
· Koala - 4기
각 상인의 이름을 키로 갖고 우선순위 큐를 밸류로 갖는 맵, 딕셔너리를 만들면 되는 문제였습니다. 입력받은 첫 번째 값이 1인지 2인지 한번 나눠주고 그 다음 알맞게 우선순위 큐에 푸시해주고, 큐에 존재하는 원소의 개수보다 지워야 할 값의 개수가 많을 때만 생각해주면 간단했습니다. python from heapq import heappush,heappop from sys import stdin input=stdin.readline q=int(input()) total=0 shopkeeper={} for i in range(q): order=input().rstrip().split() if order[0]=='1': try: for i in range(3,len(order)): heappush(shopke..
· Koala - 4기
힌트 1 더보기 시간 복잡도를 잘 생각하셔야 합니다! 만약 이미 90만 개의 원소가 배열에 있을 때, 나머지 쿼리 1만개에서 원소를 하나씩 넣고, 넣을 때마다 정렬한다고 합시다. 그렇게 되면 시간 복잡도는 대략 (10,000) * (100만 log 100만) 이 되어버립니다. 힌트 2 더보기 우선순위 큐(최대힙)의 원소 삽입에 걸리는 시간 복잡도는 logn입니다. 힌트 3 더보기 우리는 이 문제를 맵을 이용해 간단화 시킬 수 있습니다. 어떤 고릴라의 정보 배열을 나타낼 때 c++에서는 map 로 만든다면, 각 고릴라가 key값이 되고 해당 고릴라가 가진 정보들이 value가 됩니다. 문제 풀이 더보기 얼핏 보면 정렬 문제 같지만, 절대 정렬로 풀면 안되는 문제입니다. 이유는 힌트 1에 있습니다! 문제에서..
· Koala - 4기
이번 문제는 풀기에 난이도가 좀 높았던 것 같습니다. 아직 구현을 잘 못해서 그런지 시뮬레이션이나 브루트포스 같이 구현 비중이 높은(?) 문제가 나오면 항상 어렵다고 느끼게 되네요. 다른 분들이 푼 것을 참고해서 이해하고 풀어보았습니다. 정리 문제를 풀면서 제일 까다로웠던 부분은 블록 그룹을 찾아주는 부분이었습니다. 처음 접근 방식은 bfs로 행, 열 좌표, 블록 그룹과 무지개 블록 개수, 블록 그룹 개수를 찾아주었습니다. 행 열 좌표를 찾으려고 했던 이유는 조건 1번 때문이었는데요. 나중에 생각해보니 왼쪽 위부터 순차적으로 내려오기 때문에 무지개 블록 수와 블록 그룹의 개수가 같다면 마지막 블록 그룹이 저장될 수밖에 없었습니다. 일반 블록은 한 번 방문하면 또다시 방문할 수 없지만, 무지개 블록의 경우..
· Koala - 4기
삼성기출문제집에서 본 기억이 있었습니다. 그리고 그 중 제가 풀어본 것들과 비슷하게 하루종일 구현하고 나면 한번에 끝나는 법이 없고 수정하는데도 한참 걸렸습니다... 중력, 회전, 조건에 맞는 bfs와 리턴되는 값 이것들만 잘 설계하면 풀릴 문제라고 생각했습니다. 일단 중력부터 구현해주었습니다. 밑에서부터 올라오다 조건에 맞는 값을 찾으면 다른 블럭이 있거나 -1 또는 맨밑일때 까지 그 값의 위치를 내려주었습니다. def gravity(): for i in range(n-1,-1,-1): for j in range(n): if board[i][j]>=0: start=i while True: if 0
· Koala - 4기
아직 노드나 에지같은 개념을 잘 몰라서 플루이드 워셜같은 개념을 이해하기 힘들었습니다. 이해가 완벽하지 않아서 엄청 해매게 되었습니다... 자료구조 개념을 공부할 필요를 느꼈습니다. 문제를 총 2가지 방법으로 풀었습니다. 첫 번째 방법은 다익스트라를 모든 적하장마다 해 주는 방법입니다. from sys import stdin from heapq import heappush,heappop from math import inf input=stdin.readline n,m=map(int,input().split()) time_table={i:[]for i in range(n)} route_table=[[0 for i in range(n)]for j in range(n)] for i in range(m): x,..
· Koala - 4기
정리 이번 문제는 플로이드-와샬을 사용해서 풀었습니다. 전에 3문제 정도 플로이드-와샬과 관련된 문제를 전에 풀어봤었는데 그래서인지 다익스트라보다는 조금 더 친숙한 감이 있기도 했고, 경로표의 형태를 보니까 플로이드-와샬로 풀어도 무방할 것 같았습니다. 다른 건 괜찮았는데 마지막에 조금 헤맸던 부분이 1->2->5->6과 같이 2개 이상의 노드를 거쳐서 갔을 때 최단거리가 나오는 부분이었는데요. 처음에 짰던 코드로 돌렸을 때에는 2가 아닌 계속 5(도착 노드 바로 전 노드)가 나왔습니다. 어떤 식으로 접근을 해야 할지 감이 잡히지 않아서 이 부분 풀이를 참고했는데, road 배열(최단 경로를 가기 위해 처음 방문하는 노드를 담은 배열)의 경우 [i][k]를 구해주면 최단거리로 가기 위해서 제일 처음 방문..
· Koala - 4기
문제 링크 : https://www.acmicpc.net/problem/1719 1719번: 택배 첫째 줄에 두 수 n과 m이 빈 칸을 사이에 두고 순서대로 주어진다. n은 집하장의 개수로 200이하의 자연수, m은 집하장간 경로의 개수로 10000이하의 자연수이다. 이어서 한 줄에 하나씩 집하장간 경 www.acmicpc.net 1753번처럼 한 노드에서 다른 노드들까지의 최단거리를 찾되, 모든 노드에 대해 이를 반복해 풀 수 있는 문제입니다. 다만 두 가지 함정이 숨어 있었는데요, 한번 천천히 알아보도록 하겠습니다. 이번 답안은 다익스트라 입문 문제인 1753번 코드를 많이 참고하면서 완성했는데요, 첫 번째 함정은 이번 문제는 그래프가 양방향 그래프가 된다는 것입니다. 1753번에서는 단순히 한 노드..
· Koala - 4기
이번 문제는 올려주신 풀이를 거의 참고하여 풀었습니다. 다익스트라 관련 문제를 풀면서 적응할 필요가 있을 것 같네요. 다익스트라 개념을 이해하고, 코드로도 대충 어떤 식으로 짜야될지 구상은 됐는데 우선순위 큐를 어떤 식으로 활용해야 될지 몰랐습니다. 정리 처음에는 priority_queue에 3가지 데이터(x, y, 거리)를 pair로 담아주기만 하면 된다는 생각으로 거리를 마지막에 넣어주었는데 나중에 priority_queue의 사용 이유를 깨닫고, 순서를 바꾸어서 해결해주었습니다. 좌표와 좌표 사이 경사값의 최대를 구하면 되는 문제인데 익숙하지 않아서 그런지 계속 최단거리를 구하려고 했던 것 같습니다.(지금 생각해보면 왜 그랬는지 모르겠는데 다익스트라를 코드로 짜 본 적이 없어서 개념 자체를 적용해보..
· Koala - 4기
일단 만들어놓은 반례 리스트입니다. -------- 5 5 9 4 4 4 4 9 4 9 4 4 9 4 9 4 4 9 4 9 4 4 4 4 9 4 답 1 -------- 3 3 4 1 9 1 8 9 9 9 답 6 --------- 3 3 4 1 9 7 8 8 9 9 답 3 ---------- 6 2 1 2 2 2 2 2 1 2 1 2 2 2 1 2 1 2 2 2 1 2 1 2 2 2 1 2 1 2 2 2 2 2 1 2 2 답 0 ----------- 5 4 5 8 7 2 8 6 2 10 9 3 4 15 6 20 4 9 4 3 2 3 2 3 5 1 답 2 ----------- 1 아무 숫자 답 0 ----------- 3 9 9 9 9 9 9 9 1 3 답 6 --------- 5 1 14 15 16 17 ..
· Koala - 4기
힌트 1 더보기 세 가지 이상의 원소를 저장하는 자료구조는 c++에서 tuple이 있고, pair 형식으로도 구현 가능합니다. 힌트 2 더보기 입력 범위를 조심하세요! 풀이 더보기 모든 격자를 노드로 보고, 격자와 격자 사이의 경사를 에지로 봤을 때 하나의 그래프로 표현할 수 있습니다. (1, 1) -> (n, n) 으로 가는 최단 경로를 묻는 문제이므로 다익스트라로 해결 가능합니다. #include using namespace std; typedef long long ll; ll arr[1010][1010]; ll dist[1010][1010]; //dist[i][j] : (1, 1) -> (i, j) 최단 거리 int dy[] = {0, 0, 1, -1}; int dx[] = {1, -1, 0, 0}..
· Koala - 4기
우선순위 큐 문제를 별로 안풀어봐서인지, 혼자서는 솔직히 이 문제가 우선순위 큐인지 알아차리지 못했을 것 같습니다... 가장 중요한 것은 적어도 배열의 맨 앞의 값 두개는 항상 가장 작은 값이여야 할 것이라고 생각했고, 우선순위 큐를 이용해서 풀어주었습니다. 파이썬으로 작성한 코드 우선순위 큐에 집어 넣고 매번 pop을 통해 2개의 값을 꺼낸뒤 합을 total에 더하고 다시 큐에 넣어줬습니다. 그렇게 반복할 때 마다 큐의 길이가 1씩 줄어들게 되는데 queue의 길이가 1이면 반복문을 탈출시켜줄 수도 있지만 매번 비교를 해야되므로 if를 쓰거나 while에 조건을 다는 대신 try와 except로 빈 큐에 pop을 하려 했을 때 나는 에러를 이용해서 탈출시켜 주었습니다. import sys import ..
KauKoala
Koala