알고리즘 공부/위클리 챌린지 13

위클리 챌린지 끝 + 유종의 미

이번 10월 31일부로 모든 위클리 챌린지가 마무리되었다. 총 12개의 챌린지를 해결했고, 엄청 쉬운 문제부터 상당히 난이도 있는 문제들까지 나왔다. 아쉬웠던 부분은 로직보다는 구현에 관한 내용이 많아서 알고리즘 생각보다는 구현 방안에 초점이 맞추어져 있던 것 같다. 그래도 매번 연습하면서 아무리 어려워도 최대한 문제를 풀어 보기 위해 노력하였고, 그 결과 전체 풀이를 기간 안에 풀 수 있어 뿌듯했다. 그리고 가장 기뻤던 부분은 마지막주에 유종의 미를 거둘 수 있었던 것... 솔직히 말해서 해당 코드가 특출나게 효율이 좋다던지 독창적인 내용이 있는것 같지는 않았지만... 아무래도 동일한 코드가 여러개 제출된 걸 봐서는 블로그에 올린 글 덕분에 사람들이 코드를 이해하기 쉬웠어서 좋아요를 받았던 것 같다. ..

프로그래머스 위클리 챌린지 12주차 - java

문제 설명 1. 피로도와 [필요피로도, 사용피로도]가 주어진다. 2. 던전을 도려면 필요피로도보다 피로도가 많아야 하고, 사용피로도는 그 던전을 돌면 소요된다. 3. 가장 많은 수의 던전을 도는 방법을 구하면 된다. 풀이 과정 // 마지막 위클리 챌린지이다. 그래서인지 굉장히 쉬운 문제로 장식했다. // 매우 간단한 브루트포스 - DFS or BFS 문제이다. 1. 모든 경우의 수를 탐색한다. 2. DFS를 돌면서 한번이라도 탐색한 곳은 다시 탐색하지 않고, 다른 모든 경우를 선택하여 진행한다. 3. 현재 피로도보다 필요 피로도가 크면 돌 수 없다. 4. 현재 피로도가 필요 피로도보다 많은 경우 방문하고, 이후 다시 해당 process를 반복한다. 5. 이걸로 구해진 경우가 끝나면 다시 방문을 하지 않은..

프로그래머스 위클리 챌린지 11주차 - java

문제 설명 1. 사각형들이 좌표형식으로 주어진다. 2. 사각형들은 서로 곂치게 놓여지며, 맨 테두리로 욺직일 수 있다. 3. 사람과 아이템이 주어졌을 때, 가장 짧게 아이템을 가져올 수 있는 방법을 구하여라 풀이 과정 // 이거근데 풀었다고 뜨기는 떴는데 다른 테스트 케이스는 통과를 못한다... 아마 정답에 문제가 있는것 같고 나중에 변경해야 할 수도 있다. // 처음에 풀었을 때에는 22번 테케에서 막히게 되었다. 그 답안은 후첨하겠다. 내가 푼 방법은 계속 문제를 생각하다 가장 간단히 구현할 수 있는 방법을 통해 풀었다. 아마 따라하면 쉬운 방법일 테지만, 나중에 답이 틀릴 수 있고 그렇게 되면 변경하도록 하겠다. 1. 먼저 모든 값을 2배해 준다. ( x축간, 혹은 y축간 거리가 1씩밖에 차이가 안..

프로그래머스 위클리 챌린지 10주차 - java

문제 설명 1. 좌표평면상의 선분들이 주어진다. 2. 선분들이 만나는 좌표들의 정수값들만 고려한다. 3. 만나는 곳은 * 나머지는 . 으로 이루어진 최소 크기의 도형을 RETURN하면 된다. 풀이 과정 1. 이게 왜 level2문제일까....? 생각보다 난이도가 높았다. 차근차근 하나씩 구해주자. 이거 클래스 써서 하려 했더니 코드가 진짜 말도안되게 더러워져서 절차적으로 풀었다. ( 교점 구하기 ) 2. 먼저 선들이 만나는 점을 구한다. 고등학교 때에 배운 일차함수 방정식을 쓰면 된다.

프로그래머스 위클리 챌린지 9주차 - java

문제 설명 1. n개의 송전탑은 트리 형태로 이어져있다. 2. 무조건 트리 형태이며, 중간에 한 칸을 끊어 두 개의 네트워크로 분할한다. 3. 두 네트워크 간의 차이의 절대값의 최소값을 return하면 된다. 풀이 과정 1. 간단한 문제이지만 효율적인 방법으로 풀기는 생각보다 힘들다..... 2. 먼저 모든 전선을 연결시킨다. 3. 그리고 각각의 경우에서 자신의 경우 / 자식의 경우를 나누어, DFS를 해 준다. 4. 모든 경우를 구하면서 연결을 끊은 경우를 구했으면, 그 연결을 해제하고, 다른 곳에서는 해당 연결을 다시 구하지 않을 것이다. 5. 그 경우들에 대해 최소의 절대값을 구하면 답을 return할 수 있다. 코드

프로그래머스 위클리 챌린지 8주차 - java

문제 설명 1. 명함의 가로, 세로 크기가 주어진다. 2. 명함을 담을 수 있는 가장 작은 크기의 명함지갑의 크기를 return하면 된다. 3. 명함은 눕혀서 보관할 수도 있고, 세워서 보관할 수도 있다(가로세로 위치 상관x) 풀이 과정 1. 굉장히 간단한 문제이다. 2. 명함의 가로, 세로 기준으로 긴 값과 짧은 값들을 저장한다. 3. 긴 값들의 최대값, 짧은 값들의 최대값을 곱하면 답을 구할 수 있다. 4. 여기서 구현한 코드는 process별로 나누어서 길게 나왔지만, 실제로는 짧은값 긴값 두개를 만들어서 이를 바로바로 구하면 for문을 한 번만 사용해서도 충분히 구할 수 있을 것이다. 코드 코드2

프로그래머스 위클리 챌린지 7주차 - java

문제 설명 1. 들어온 사람, 나온 사람이 주어진다. 2. 사람들이 차례로 들어오고, 현재 들어온 사람중 나온 사람에 해당하는 사람이 있으면 순서대로 나간다. ex) enter -> [1, 4,3, 2] leave -> [3, 4, 2, 1] ----> 1번 입장, 4번 입장, 3번 입장, (여기서 leave의 처음인 3이 들어왔으니까) 3번 퇴장, 4번 퇴장, 2번 입장, 2번 퇴장, 1번 퇴장 요런식 3. 입장한 사람들끼리는 서로 만난다. 3. 만난 사람들의 수를 return한다. 풀이 과정 1. 굉장히 간단한 문제이다. 2. 선입선출법이니까 Queue를 사용하고, 사람들의 입/퇴장을 세 주므로 ArrayList로 사람들을 구한다. 3. 전부 다 나가면 계산이 종료되므로 leave관련 queue가 사..

프로그래머스 위클리 챌린지 6주차 - java

문제 설명 1. 복서의 몸무게, 전적이 주어진다. 2. W(이김), L(짐), N(경기안함) 이고, 경기를 안하면 체크하지 않는다. 3. 승률 - 자기보다 무거운사람을 이긴 횟수 - 자기 몸무게 의 순서로 동률이면 뒤의 것을 고려하여 rank를 return하면 된다. 풀이 과정 1. 이것도 정렬을 사용하면 매우 간단한 문제이다...사실 시간복잡도에서 걸릴 것 같았는데 어째 통과가 되었다. 2. 전체경기수, 이긴수를 구하서 승률 / 자기보다 무거운 사람 이긴 수 / 자기 몸무게를 배열에 저장한다. 3. compare의 로직을 이용하여 간단하게 순서대로 정렬하면 구해진다. 4. 노드별 compare구현하기~ 코드 import java.util.*; class Solution { public int[] sol..

프로그래머스 위클리 챌린지 5주차 - java

문제 설명 1. 'A' 'E' 'I' 'O' 'I' 다섯글자로 단어를 만들수 있다. 2. 단어 길이는 5개 이하이며, A AA AAA AAAA AAAAA AAAAE ... 이런 순서로 진행된다. 3. 단어가 주어지면, 이게 몇번째 단어인지 return하면 된다. 풀이 과정 1. 문제의 테스트 케이스를 보면 알겠지만, 문자들에 대해 완전탐색을 하나하나 진행하면 절대 안될것이다...안해봤지만 그럴것같음. 2. A로 시작하면 A, AA ..... E로 시작하면 E, EA ....... 이렇게 진행되는데, 이를 통해 수식을 통해 구할 수 있다고 유추 가능하다. 3. A는 1이고, I는 1563인데 이를 통해 E는 782이고 각각 시작하는 문자를 기준으로 781의 간격이 떨어져 있다. 4. A,E,I,O,U 5글..

프로그래머스 위클리 챌린지 4주차 - java

저번주와 비교도 안되게 쉬운 문제가 나왔다...뭐지..... 문제 설명 1. table로 맨 처음 노드에는 직무가, 이후 노드부터는 그 직무가 선호하는 언어가 주어진다. 2. table의 선호하는 언어의 점수는 table전체 언어의 개수만큼 시작해서 내려갈수록 하나씩 뺸다 ( 예를 들어, 선호언어 6개 중 2번째로 선호하는 언어의 경우 (6-2=4점) 3. languages와 preference의 길이는 같고 해당 languages 점수는 동일 위치 preference가 된다. 4. table언어 선호도 x preference를 구하고, 그 언어 선호도의 총합이 가장 높은 직무를 return한다. 5 동일한 점수의 직무가 있으면 사전순으로 빠른 직업군을 return한다. 풀이 과정 1. 언어들을 짤라서 ..