https://programmers.co.kr/learn/courses/30/lessons/60059 🐢 설명 자물쇠와 열쇠가 있고 열쇠를 좌우상하 움직여보고 90도씩 돌려보면서 겹치는 부분만 딱 들어 맞는다면 열린다고 판정하고 그외의 경우는 아니라고 해야하는 문제이다. 이때 자물쇠와 열쇠의 크기가 다를 수 있음에 유의하자. 다음과 같은 그림을 보면서 이해해보자. Lock을 Key가 움직이면서 비교하기 위한 좌표 공간을 먼저 만들어준다. 이 공간은 원점을 기준으로 (key길이 - 1, key길이 - 1) 부터 (lock길이, lock길이)까지의 정사각형의 좌표평면을 갖게 된다. 이후 차례대로 모든 좌표에 대해서 확인을 해준다. 각 좌표에서 키를 둬보고 key 크기만큼 비교를 한다. 이때 좌표명면의 좌표값..
https://programmers.co.kr/learn/courses/30/lessons/1836 참고로 이 문제는 프로그래머스에서 문제를 풀 때 전역변수로 등록된 값들을 main함수에서 초기화를 해줘야 통과가 된다. 🐢 설명 한쌍의 짝으로 존재하는 카드들에 대해서 단 두번의 이동으로 매칭이 될 수 있는지 없는지 확인하고 결과적으로 모든 카드가 매칭이 될 수 있는지 확인하는 문제이다. 하나의 카드의 쌍이 매칭이 되면 해당 카드는 제거 되며 공백이 된다. 모든 카드의 쌍이 제거되면 제거된 카드를 순서대로 문자열로 반환한다. 모든 카드 쌍을 제거할 수 없다면 IMPOSSIBLE을 반환하면 된다. 해결을 위한 로직 지도에 카드 쌍은 무조건 1 대 1로 존재한다고 되어있으므로 모든 카드의 종류를 list에 담..
https://programmers.co.kr/learn/courses/30/lessons/59042 🐢 설명 목적 쿼리 : 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문 1) 동물의 id와 이름을 조회 , id순으로 정렬 2) 입양을 간 기록은 있음 3) 보호소에 들어온 기록은 없음 🐢코드 SELECT animal_id, name from animal_outs where animal_id not in ( select distinct animal_id from animal_ins ) order by animal_id; 🐢 마무리
https://programmers.co.kr/learn/courses/30/lessons/77487 🐢 설명 헤비유저의 게시글을 id기준으로 정렬하여 게시글을 조회하는 쿼리를 만들면 된다. 헤비유저 : 게시글을 2개 이상 등록한 host 쿼리문을 짤때는 잘 분리해서 보면된다. places테이블에서 게시글을 조회한다. id를 기준으로 정렬한다. 헤비유저가 등록한 게시글만 1) 먼저 1번 쿼리를 짜보자. select * from places; 2) 여기서 id를 기준으로 정렬해보자. select * from places order by id asc; -- 여기서 헤비유저의 글만 조회해야 된다. + where 호스트 in (헤비유저) 3) 헤비 유저의 게시글만 조회하는데, 먼저 헤비 유저를 구하자. -- h..
https://programmers.co.kr/learn/courses/30/lessons/77486 🐢 설명 HashMap을 이용하여 풀었다. 자신의 상위 보스를 추적해서 이익의 10%를 분배해줘야 하면서 나머지 90%는 자신의 수익을 챙기는 구조이다. 따라서 모든 판매자들에 대해서 부모를 등록시키고 돈을 벌고 수익을 일부분을 부모에게 전달시켜 준다. 이때 10원 미만은 절삭해야하고, root에 도달하면 따로 돈을 적금안해줘도 되므로 return 한다. makeTree()에서 myBoss에는 자신 - 자신의 부모 를 등록하고, myCount에는 자신 - 자신의 계좌를 등록한다. selling()에서 수익을 벌면 90%는 자신에게 더하고, 10%는 상위 노드에게 분배한다. distribute()에서 10..
https://programmers.co.kr/learn/courses/30/lessons/77485 🐢 설명 2차원 배열 돌리기 문제이다. 쿼리에는 왼쪽위 좌표와 오른쪽 아래 좌표가 주어지고, 해당 쿼리 배열을 담은 queries 배열이 주어진다. 이때 하나의 쿼리문에 대해서 시계방향으로 1만큼 씩 돌리고 이동한 값들 중에서 최소값을 구한 후 반환하도록 하면 된다. 즉, for (쿼리 : 모든 쿼리) : 쿼리좌표 기준으로 돌림을 하면된다. 이때 배열을 돌리기 위해서 임시 배열을 하나 만들어줘야 하는데 2차원 배열을 깊은 복사를 하기 위해 for문으로 clone을 해준다. clone()함수는 1차원 배열을 깊은 복사하기 위한 함수로 2차원 배열은 row마다 돌면서 해줘야 깊은복사가 된다. 바로 하면 얕은..
https://programmers.co.kr/learn/courses/30/lessons/77484?language=java 🐢 설명 문제는 길지만 내용은 정말 간단하다. 내가 뽑은 6개의 숫자와 1등 숫자 6개를 비교하는데, 나의 숫자가 0인 경우 전부 틀리거나 전부 맞을 때의 경우를 구하면 된다. 숫자도 6개뿐이으로 2중 for문으로 모든 숫자를 비교해서 1등 번호에 존재하는 숫자의 개수를 구하고, 나의 숫자에서 0의 개수를 구한다. 최소 등수는 전자에서 구한 1등번호와 같은 숫자의 개수로 계산하고, 최대 등수는 전자에서 더한 개수 + 0의 개수의 값으로 계산한다. 시간복잡도 : O(n^2) 🐢코드 import java.util.*; class Solution { public int[] soluti..
https://programmers.co.kr/learn/courses/30/lessons/64063 🐢 설명 문제는 매우 직관적이다. 원하는 방번호를 요청하고 없으면 요청한 방 번호보다 큰 번호 중 가능한 첫번째 방번호를 반환하고, 있으면 바로 반환하면 되는 문제이다. 그런데 요청 가능한 방번호의 범위가 무려 10^12승으로 1조이다. 전세계 방을 다합쳐도 안될것같은 방의 개수이지만 요구사항을 잘 지켜보자. 문제를 풀 수 있는 힌트는 방 번호는 최대 1조까지 있지만, 요청하는 방 번호의 개수는 20만개로 제한적이다. 따라서 일반적인 배열 대신 Map 자료구조를 이용한 유니온-파인드를 통해 요구 방마다 (자신의 방 번호 - 부모 방 번호) 구조를 갖도록 하면 메모리 걱정없이 풀 수 있다. 먼저 모든 Ro..
https://programmers.co.kr/learn/courses/30/lessons/64064 🐢 설명 총 사용자의 id N개 중에서 id의 부분 문자가 *처리된 R개의 ban Id를 알고 있을 때, 몇개의 id 조합이 나올 수 있는지 묻는 문제이다. 조합 : N개 중에서 순서에 상관없이 R개를 뽑을 수 있는 경우의 수 id가 ABC, DEF 가 있을 때, [ABC, DEF] 의 경우나 [DEF, ABC]의 경우는 같다는 것이다. 따라서 nCr로 조합을 모두 확인하면서 [*] 처리에 대해 포함되는 아이디인지 확인하면 된다. list에 id를 순서대로 넣는다. id 담은 개수가 밴 아이디 개수와 같다면 해당 아이디들이 밴 아이디와 같은지 유효성 검사를 한다. (func : checkBanId) 담은..
https://programmers.co.kr/learn/courses/30/lessons/64062 🐢 설명 stones 배열의 크기는 1 이상 200,000 이하입니다. stones 배열 각 원소들의 값은 1 이상 200,000,000 이하인 자연수입니다. 니니지의 친구들이 길이가 최대 20만인 돌다리를 건너야하고, 해당 돌다리의 내구성은 최대 2억이다. 한명씩 건너게 하고 내구도를 1씩 낮추고 배열을 탐색하면서 0의 개수를 세서 한번에 건널수 있는 최대인 k와 비교할 경우 시간복잡도는 20만개의 돌다리가 전부 2억의 내구도를 가지는 경우 O(20만 * 2억)를 갖게된다. 감히 생각도 할 수 없을 만큼 큰 연산을 해야하므로 이렇게 풀어서는 안된다. Q. 그렇다면 어떻게 접근해야 딱 k개 이상의 돌이 ..
https://programmers.co.kr/learn/courses/30/lessons/17678 🐢 설명 버스를 타기위한 시간을 구하는 문제이다. 가장 늦게까지 늦잠을 자서 회사에 가기 위해 막차를 타야하는데, 동시간대에 도착한 경우 마지막에 줄을 서게 된다. 이때 버스에는 정원이 존재하므로 인원수 체크가 필요하다. 먼저 시간대별로 들어오는 시간순으로 뽑기위해 크루들을 큐에 넣는다. 이후 n번, t분 간격으로 m명이 탈 수 있는 버스가 오는데 여기에 탈 수 있는 경우 태운다. 우리에게 중요한건 "마지막 버스 시간"과 "마지막 버스에 탑승한 마지막 승객의 도착시간"이다. 어짜피 가장 늦게 가는게 목표이므로 이때만 알면 된다. 그렇게 위에서 전부 태워서 위에서 필요한 걸 얻는다. 이때, 마지막 버스에 ..
https://programmers.co.kr/learn/courses/30/lessons/42891 🐢 설명 제각각 양이 다른 음식들이 있을 때 주어진 시간 k까지 1초에 하나씩 먹게 되고 k때 정전이 일어나면 그 이후에 먹어야 되는 음식의 번호를 구하는 문제이다. 생각해보자. 음식의 양이 9 3 5 7 1 씩 있을 때, 5번음식을 먹기 위해서는 5번의 이동이 필요하다. 한바퀴를 돌기 위해서 5번 이동해야 하므로. 그리고 난 후 3번 음식을 다 먹기 위해서는 9 3 5 7 1 -> 8 2 4 6이 되어있고 총 8번의 이동이 필요하다. 이렇게 생각하면 음식의 양이 가장 낮은 순으로 정렬하고, [(현재 음식과 직전 음식의 양 차이) * 현재 있는 음식의 개수]는 현재 가지고 있는 음식의 구성을 깨트리지 않..
- Total
- Today
- Yesterday