반응형

알고리즘/프로그래머스 Level2 79

[프로그래머스,Java] Level2: 이모티콘 할인행사

문제분석 처음 문제를 접할때 복잡한 문제지만, 기본 로직을 잡고 천천히 풀다보면 쉽게 풀린다. 요점은, 전략을 잘짜는것이다. 제한사항이다. 이모티콘의 할인율은 10 , 20 , 30, 40프로 4가지로 정해져있고, 이모티콘은 총 7개 제한이다. 유저는 100명이다. 완전탐색으로 구한다면 100*4^7 효율성이 예상된다. 완전탐색으로 풀기로 하였다. 완전탐색의 기준은 이모티콘이 할인되는 경우의수다. 각각의 이모티콘이 10% ,20%, 30% ,40% 할인되는 분기를 모두 탐색할것이다. 최종적으로, sign으로 최대 회원수와 earn으로 최대 수익을 반환할것이다. arr는 이모티콘들이 할인되는 퍼센트를 저장할 예정 이다. comb() 메소드로 이모티콘할인되는 분기를 모두 탐색이 시작된다. 완전탐색 분기가 은..

[프로그래머스,Java] Level2: 택배 배달과 수거하기

문제분석: 카카오 문제 Level2다. 다른 레벨 2와 비교해보면 격이다른 난이도를 돋보인다. 문제 요건: 트럭이 최소거리로 배달과 수거를 완료하는 거리를 구해주세요. 일단 어떻게 접근을 할까부터 생각해봤다. 곰곰히 규칙과 사례를 보니, 제일 먼 거리부터 배달과 수거행위를 한다. 이거에 착안해서 로직을 시작했다. d는 배달을 하러갈 지점, p는 픽업을 하러갈 지점이다. 최초로 배달하러갈 지점과 픽업하러갈 지점을 구하고 간다. 반드시, 마지막집에 물건이 있을 보장이없기때문이다. 이제부터 조금 긴 while문이 시작된다. 종료조건과 거리계산을 설정했다. 종료조건은 배달과 픽업이 모두 완료댈때, 거리계산은 배달지점과 픽업지점중 높은값을 기준 *2한다. 그 이유는, 픽업이 높으면 픽업까지 배달이 높으면 배달까지..

[프로그래머스 ,Java] Level2: 유사 칸토어 비트열

문제분석 나에겐 어렵다.. Level3? 3.5 정도 문제 아닌가..? 문제 이해부터 조금 난해한데, 요약하자면 1을 11011 , 0을 00000으로 치환하여 n만큼 반복시킨다. 그렇게 반복시킨 문자열에서 스타트 l에서 끝지점 r까지 1의 갯수를 세주면 된다. First Try: 처음엔 그냥 쉽네 하고 하라는데로 진행을했다. n만큼 1과 0을 치환한뒤, 그 문자열을 가져와서 스타트 l에서 끝지점 r까지 갯수를 세준것이다. -> 당연히 효율성에러 Level2 에서 효율성 에러를 본게 참 오랜만이다. n이 20까지 가기때문에 5^20 까지간다. int 범위를 넘어갈정도니, 당연히 안된다. Secont Try: **점화식, 재귀 작성하기 ** 첫번째 접근이 안된다면, 값을 추적해야한다. 작전 : 0~ 끝 지..

[프로그래머스, Java] Level2: 마법의 엘리베이터

문제분석 목표: 1 ,10 ,100, 1000 ... 같은 오르내리락 할수있는 버튼을 사용하여, 최소값으로 0층가기 문제를 이해하셧다면, 각 자릿수마다 엘리베이터를 올릴지, 내릴지를 판단해야합니다. 올리면 무조건 이득보는 숫자는 6,7,8,9 이며, 내리면 무조건 이득보는 숫자는 0,1,2,3,4 입니다. 문제는 숫자 5입니다. 숫자 5일때 경우에따라서 올리는게 더 좋을때도잇고, 내릴때 더 좋을때가있습니다. EX) 45 : 45인경우는 첫째자리 5를 내리는게 더 빨리 도착합니다 = 9 5555: 첫째자리 5를 올리는게 더 빨리 도착합니다 = 18 5555> 5560->5600->6000->10000->0 : 5+4+4+4+1=18 55: 55인 경우는 첫째자리를 올리든, 내리든 값이 똑같습니다 =10 5..

[프로그래머스 ,Java] Level2: 테이블 해시 함수

문제분석 테이블 해시 함수 로직을 구현하는 문제이다. 다르게 생각할필요는없다. 문제에서 하라는대로만 하면 끝이다. 이 문제를 들고온 이유는 새롭게 배운 두가지 테크닉을 작성하는겸 소개해드리고싶어서다. 먼저, 2번부터 로직을 시행할것이다. 2번의 요건은 col번째 요소로 정렬을하고, 동일하면 기본키(첫번째)로 정렬하는 문제다. 즉, 이중 정렬을 원하신다. 보통, 필자는 이중정렬을 거의 Comparator을 구현해서 표현했다. 이렇게다. 왜냐하면, 이중정렬을 람다식으로 불가능한거 아닌가? 싶엇다. 하지만, 웬걸 이중정렬도 람다식이 된다. 이걸 이제알았다니 .. 삼항 연산자로 가능하다. 3번과 4번을 동시에 처리하겠다. 각 컬럼을 mod idx하고 나온 값들을 XOR 한 최종값을 출력하는것이다. 자바에선 XO..

[프로그래머스, Java] Level2: 디펜스 게임

문제분석: 주어진 병사, 라운드마다 정해진 적들, 주어진 무적권 이 3가지의 정보를 사용하여 라운드를 최대 어디까지 도달할수 있는가를 구하는 문제다. 시작하기전에 , 제한사항을 보면 라운드는 100만 라운드며, 병사는 10억까지 다룰수 있다. First Try: 이분탐색을 사용해보자. 아무리 큰 수라도 시간복잡도 log(n) 앞에선 엄청난 효율성을 보여준다. 이분탐색의 기준은 당연히 우리가 구하고싶은 "최대 라운드" 이다. 최소 라운드 = 1 최대 라운드 = 주어진 적 배치 배열의 길이 그 후, 중간값을 구한뒤 최소라운드 ~ 중간값 라운드 까지, "내 군사들로 막을수 있는가?" 를 판별한다. 막을 수 있다면 더 높은라운드 까지 막을수있는 가능성이 있으니, Up 막을 수 없다면 더 낮은 라운드를 탐색하기위..

[프로그래머스,Java] Level2: 점 찍기

문제 분석 : 매우 간단한 문제지만, 아이디어가 없으면 풀수 없는 문제다. (참 이런문제가 창의력 기르기 좋은 문제인것같다.) 문제를 요약하자면, 원의 반지름을 의미하는 d 값을 주어진다. 원점을 기준으로 d값만큼 원을그려서, 양수의 점을 최대 몇점까지 찍을수 있는가를 구하는문제다. 점을찍는건 K만큼 차이가난다. 단순하게, x좌표 길이, y좌표 길이만큼 이중 for문을 작성하여 점을찍을 수있는가를 판별할수 있다. 하지만 이렇게 작성하면 효울성 에러가 뜬다. 역시 최적화 과정을 거쳐야한다. 우리가, 점을 찍을수 있는지를 판별하는건 x^2+y^2

[프로그래머스,Java] Level2: 우박수열 정적분

문제분석: 문제가 꽤나 난해한 문제다. 해야할일 3줄요약: 1. 콜라츠 추측으로 수열 만들기 2. 수열의 구간마다 넓이 구하기 3. 주어진 ranges로 정적분 구하기 1. 콜라츠 추측으로 수열만들기 + 2. 수열의 구간마다 넓이구하기 콜라츠 추측으로 점을 하나찍고, 이전의 점 current와 비교하여 넓이를 찍어 저장한다. 3. 주어진 ranges로 정적분구하기 여기서 정적분은 쉽게 말하자면 구간의 넓이다. EX) [1,-3] -> 1부터 마지막수열 -3까지의 넓이 [3,-2] -> 3부터 마지막수열 -2까지의 넓이 단, 시작점이 끝점보다 크면, 고정적으로 -1를 반환해야한다. 문제풀이 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25..

[프로그래머스,Java] Level2:귤 고르기

문제분석: 목표: 여러가지 크기의 귤을 골라서 종류의수가 최소화가 되면 된다. 정해진 귤의 갯수를 골라서 종류의수가 최소화가 되길 원하니, 가장 많은 갯수를가진 종류뷰터 먼저 골라가면 된다. 종류마다 갯수를 체크하기위해, Map을 사용하였다. Map으로 귤을 모두 종류마다 담았으면, 가장 높은갯수로 정렬한뒤, 갯수를 빼며 종류수를 체크하자. 문제풀이 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 import java.util.*; class Solution { public int solution(int k, int[] tangerine) { int answer = 0; //Key: 크기 , value: 갯수 Map map ..

[프로그래머스,Java] Level2: 숫자 카드 나누기

문제분석 문제 이해가 좀 난해한 문제다. 3줄요약: 1.조건 1에선 철수는 모두 나눌수있고, 영희는 모두 못나누는 최대값 A 2.조건 2에선 영희는 모두 나눌수 있고, 철수는 모두 나눌수있는 최대값 B 3.A와 B중 가장큰 수를 반환 제한사항을 보면 알겟지만, 원소의 크기와 길이가 좀..크다.. 그래서 제일 쉽게 푸는게 반복문이지만 반복문으로 풀다가 효율성 오류 걱정부터햇다. 근데 반복문으로해도 효율성 통과가 되더라.. 메소드를 2개 만들었다. 첫번째로, 철수나 영희의 배열을 모두 나눌수있는 숫자들을 판별해서 배열로 반환하는 메소드 두번째 메소드로, 첫번째로 구한 숫자들로 상대방의 숫자들을 나눌수 없는지를 판별한뒤, 가장큰값을 반환한다. 그 뒤, 앞서 정리한 세줄요약대로 로직을 작성한다. 문제풀이 1 2..

반응형