Koala - 4기

· Koala - 4기
노드 사이 가중치가 다르다는 점과 최저 택시요금을 구해야 한다는 점에서 다익스트라나 플로이드-와샬을 사용하면 되지 않을까 싶었습니다. 다익스트라보다는 플로이드-와샬이 이해도 더 잘 가고 재미있는 것 같아서 플로이드-와샬을 사용해서 풀었습니다. 풀이 방법 전체적인 틀은 플로이드-와샬 기본 코드를 사용해서 풀었습니다. 백터 전체를 INF로 초기화 한 뒤에 행과 열이 같은 인덱스일 때 0으로 채워줍니다. vector가 2차원이기 때문에 [i][0]은 시작 노드, [i][1]은 도착 노드, [i][2]는 가중치가 됩니다. dist 배열에 아래와 같이 가중치를 대입합니다. 플로이드-와샬 방법을 이용해서 1~n까지 노드 사이의 최단거리를 구합니다. 최종적으로 브루트포스 방식으로 answer를 구합니다. dist[s..
· Koala - 4기
신기하게도 백준에서 플로이드-와샬 문제를 딱 풀고 왔는데 이 문제더라구요.. 근데 여전히 플로이드 와샬이라는 것을 떠올리는 것이 조금 어려웠습니다. 일단 답을 구하기 위해 필요한 것은 출발점부터 각 지점에 이르는 최소 비용 그리고 각 지점으로부터 a,b까지 드는 비용이라고 생각했습니다. 이것을 확신하고 이해하는게 첫 번째 어려움이였고, 이 3가지 값의 합 중 가장 작은 값이 정답이라는 생각은 첫 번째 어려움을 거치니 별로 어렵지 않게 해냈습니다. from sys import maxsize def solution(n,s,a,b,fares): inf = maxsize mn=inf value_table=[[inf for i in range(n)]for _ in range(n)] for start,end,cos..
· Koala - 4기
1. 키패드의 번호와 해당 번호의 위치를 맵에 저장합니다. (Ex. '1' : (0, 0) = 키패드 "1" 은 (0,0) 좌표상에 있음.) 2. 맵에 저장된 키패드의 위치를 기반으로 거리를 구할 수 있으므로, 주어진 조건대로 충실히 구현하면 됩니다! + 엄청 쉬운 문제래서 처음에는 별 생각없이 '3과 5의 거리는 2고, 4와 5의 거리는 1이라... 이거 두 수의 절대값이 거리가 되는건가!?' 하고 무지성으로 풀다가 다칠 뻔했네요 ^__^; 파이썬 코드입니다. keypad = {} def check(numbers, hand): result = "" prevRight = '#' prevLeft = '*' for number in numbers: # print(prevLeft, prevRight, numb..
· Koala - 4기
맵 자료형을 통해 키패드의 번호마다 좌표값을 넣어 주었습니다. 전달받은 hand가 left인지 right인지 확인한 다음 handtype을 정해주었습니다. 입력받은 넘버들을 키로 사용해서 키패드의 좌표값을 얻어줬습니다. 좌표값에서 x가 0이면 맨 왼쪽이므로 왼손 2면 오른손을 사용해야 하므로 if elif로 해주었습니다 그 다음 해당 좌표값을 왼손위치와 오른손 위치에 넣어주었습니다. 만약 x가 1이라면 왼손의 위치와 오른손의 위치 거리를 비교해 준 다음 가까운 손 만약 같다면 맨 처음 입력받은 손을 이용해서 문자열을 늘려주었습니다. def solution(numbers, hand): keypad={(i+1)%11:(i%3,i//3) for i in range(11) if i!=9} lefthand=0,3..
· Koala - 4기
코드가 조금 지저분해 보이기는 하지만 오랜만에 풀이를 안 보고 문제를 풀었던 것 같습니다. 풀이 과정 문제에 오른손과 왼손의 거리가 같을 경우, 거리가 가까운 경우와 같은 거리와 관련된 조건이 있었기 때문에 거리를 구하기 위한 좌표가 필요하다고 생각했습니다. vector에 담겨 있는 번호들의 좌표를 알기 위해서 keypad라는 변수를 하나 만들어서 1~9, 0, *, #를 저장해주었습니다. 저장된 keypad의 숫자와 vector에 들어가 있는 숫자를 비교하여 vector에 담겨 있는 숫자의 좌표를 queue에 담아주었습니다. 처음 시작이 왼손의 경우 '*', 오른손의 경우 '#'이기 때문에 rx, ry, lx, ly를 아래와 같이 초기화해주었고, numbers size만큼 for문을 돌면서 숫자 하나씩..
· Koala - 4기
로직은 이렇게 구성했습니다. 만약 이렇게 key의 크기가 3*3이고 lock의 사이즈가 4일때 (빨간 곳은 겹치는 배열) 이러한 배열을 만드시는 분들이 많더라구요. 그런데 어차피 탐색을 할 때 기준점을 키의 왼쪽 위 즉 이렇게 잡는다면 만든 큰 배열에서 기준점이 들어갈 수 있는 곳은 배열의 크기보다 꽤나 작습니다. 연두색 부분은 검사를 할 필요도 없는 부분입니다. 기준점이 연두색 부분에 있으면 모든 값이 자물쇠 바깥의 값들이니까요. 이렇게 한다면 배열의 크기를 (자물쇠의 크기+(열쇠의 크기-1)*2)^2 에서 (자물쇠의 크기+열쇠의 크기-1)^2로 줄일 수 있습니다. 짠돌이 호석의 경우 무조건 정사각형도 아니고 크기도 어떤것이 크다! 라고 하기 애매한 것들도 많아서 구현에 실패했었지만 이 문제는 가능할 ..
· Koala - 4기
투 포인터 안한지 하도 오래되서 그런지 엄청 어려웠습니다.. 투 포인터인 것은 바로 알았는데 투 포인터를 어떻게 이용해야 하는지 감 잡기가 어려운 문제였던 것 같습니다. 0. 무조건 투 포인터 문제일 것 0.1 DP로 풀려면 10만*10만의 배열이 필요할 것 0.2 그냥 탐색을 하려면 엄청 큰 시간복잡도 1. gems를 Set화한 크기를 무조건 알아야 함, 2. 방문과 방문횟수에 사용할 딕셔너리(맵)가 필요함, 딕셔너리를 채워나가며 코드를 진행 2.1 방문하지 않은 보석을 방문하면 딕셔너리의 크기들을 더해주면 1+2+3+4...n n(n+1)/2임 n은 set화 했던 크기 (취소) 2.2 굳이 저럴 필요 없이 len으로 비교해줘도 가능할 듯 2.3 두 방법 모두 딕셔너리에서 del을 통한 크기 비교 및 ..
· Koala - 4기
정확성은 통과하는데, 효율성 테스트를 잘 통과하지 못하고 있습니다 ㅠ__ㅠ 살펴보니 효율성까지 통과하려면 맵 자료형(파이썬의 딕셔너리)을 활용해야 하는 것 같은데... import sys maxCount = sys.maxsize def checkGem(gemSet, gems): compSet = set(gems) if gemSet == compSet: return True return False def makeGemSet(gems): gemSet = set(gems) return gemSet def solution(gems): maxCount = sys.maxsize ansLeft = 0 ansRight = 0 gemSet = makeGemSet(gems) left, right = 0, 0 while T..
· Koala - 4기
저번에 풀었던 짠돌이 호석과 같은 방법으로 접근했습니다. lock을 가운데에 놔두고 key를 4방향으로 돌려가며 모두 탐색했습니다. map의 크기는 N + 2M이면 될 것 같아 N + 2M으로 설정했습니다. 지난번과는 조금 다르게 check를 하는 부분에서 값을 더하고 check하고 빼주면서 확인했습니다. #include #include #include using namespace std; int N,M; vector map, key, lock; bool answer; void rotate(vector& key){ vector temp(M,vector(M)); for(int i = 0; i
· Koala - 4기
물류센터를 갔다와서 너무 피곤한 관계로 예상 풀이만 적어두고 나중에 풀어볼 생각입니다 ㅠ... 일단 최근에 풀었던 짠돌이 호석과 똑같은 풀이라고 생각합니다. https://www.acmicpc.net/problem/21277 21277번: 짠돌이 호석 DIY(Do It Yourself)는 호석이가 제일 좋아하는 컨텐츠이다. 이번 DIY는 동네 친구 하늘이랑 각자 직소 퍼즐을 하나씩 맞춰보기로 했다. 두 개의 퍼즐은 각자 N1 행 M1 열과 N2 행 M2 열의 격자 형태 www.acmicpc.net 짠돌이 호석은 입력이 50까지이고, 정사각형이 아닌 직사각형이 주어질 수 있고, 직사각형이므로 어떤 블럭을 기준으로 해야 할지 난감하고, 직사각형이므로 돌렸을 때 모양이 바뀌기도 하므로 지금 보니 오늘 풀어야 ..
· Koala - 4기
정말 오랜만에 문제를 해결한 것 같아 뿌듯하네요! 풀이는 다음과 같습니다. (자물쇠의 한 변의 크기는 M, 열쇠의 한 변의 크기는 N이라고 하겠습니다.) 1. 자물쇠를 이동시킬 수 있는 영역을 마련하기 위해 M + 2 * (N - 1) 크기의 배열을 생성합니다. def createExtendedMatrix(key, lock): M, N = len(key), len(lock) extended = [[0] * (M + 2 * (N - 1)) for _ in range(M + 2 * (N - 1))] for row in range(M - 1, M + N - 1): for col in range(M - 1, M + N - 1): extended[row][col] = lock[row - M + 1][col - M..
· Koala - 4기
이번 문제 또한 풀이를 참고하여 풀었습니다. 접근을 하려고 했던 방식은 틀리지 않았는데 동전 두 개의 좌표를 한꺼번에 bfs에 넣어야 된다는 것을 생각하지 못했습니다. 몇 문제 풀다 보니까 백트래킹에 대해서 알듯 말듯한 느낌입니다. 참고한 코드가 짧고 이해하기 편했던 것 같습니다. 풀이 방법 주석에도 간단하게 적어놓긴 했지만 몇 군데 포인트 되는 부분만 설명을 해보겠습니다. 1. 이동하려는 칸이 동전이어도 이동이 가능하기 때문에 입력을 받으면서 'o'일 경우 vector에 넣고, '.'로 바꾸어주었습니다. 2. coin[0]의 first는 1번째 동전의 x좌표, coin[0]의 second는 1번째 동전의 y좌표입니다. 마찬가지고 coin[1]의 first는 두 번째 동전의 x좌표, second는 두 번..
KauKoala
'Koala - 4기' 카테고리의 글 목록