반응형

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

[프로그래머스,자바] Level2: 뉴스 클러스터링

문제분석 뭔가 겁나많이 복잡한데, 요약하자면 A 집합과 B집합의 합집합과, 교집합을 구한뒤 교집합 갯수/합집합 갯수를 구하면된다. A집합, B집합의 원소는 앞에서부터 2글자씩끊어서생성하고, 글자안에 특수문자가 들어있는경우는 제외한다. 예외) A,B모두 공집합일경우 1반환 풀이접근 -> 교집합을 먼저 구하자 교집합을 먼저구한다면 합집합은 A+B - 교집합 으로 구할수있다. 풀이방식: 1. 집합 A, 집합 B를 구한다. ->두글자씩 끊어서 A,B에저장한다. 2.두글자씩 끊은 원소가 특수문자가 들어있으면 제외한다. ->이 경우는 정규표현식이나 아스키코드를 통해서 제외한다. 3. A와 B의 교집합을구한다. 4. 합집합공식을 사용해 갯수를 구하고 교집합/합집합을 구한다. 5.문제에서 65536곱하라고하니 곱한다...

[프로그래머스,Java] Level2:괄호 변환

문제분석 설명서대로만 하면된다. 이 문제는 설명서대로 정확하게 구현이 가능한지를 묻는다. 1. 빈 문자열이면 빈 문자 반환 ->이거는 간단하다. 2. 문자열 w를 두개의 "균형잡힌 괄호" 분리. -> u는 균형잡힌 괄호문자열이되면 바로 끝, v는 빈 문자열이 될수있음 how? ( 갯수와 )갯수를 각각 세서, 동일해지면 문자열을 분리해서 저장한다. 3.분리한 문자열 u가 올바른 문자열이면 v를 1단계부터 다시 재귀를돌린다. -> 문자열 u뒤에 이어서 재귀를돌린v를붙힌다. how? 올바른지판별은, Stack을 사용해서 판별하자. Pop과 입력값이 같다면 짝이맞으므로 제거하다보면, Stack의 문자열이 0이되는데, 이때가 올바른 괄호가된다. 4.분리한 문자열 u가 올바른 문자열이 아니라면, -> 빈 문자열에 ..

[프로그래머스,Java] Level2: 피로도 (위클리 챌린지 12주차)

문제분석 RPG 게임에서나 보는 피로도 관련된 문제다. 던전을 도는 조건은 '최소 필요 피로도'를 넘겨야하고, 넘겼다면 '소모 피로도'를 깍아야한다. 아니.. 어느게임이 최소 필요 피로도가 있습니까.. 소모 피로도만 충족하면되지.. 언뜻 보면 쉬워보인다. 그냥.. 최소 필요 피로도가 큰 순서대로 피로도를 먼저 빼면 될것같다. -> 하지만, 만약 [80,80] 이라면 첫번째 던전만 돌고, 2번 3번 던전을 못돈다. -> 차라리, 첫번째 던전을 안돌고 2번 3번을 도는게 피로도 적으로 더 이득이다. 그러면.. 소모 피로도가 적은 순서대로 피로도를 먼저 빼면 되나..?? -> 이러면, 3번 2번 순서대로 던전을 돌텐데 그러면 1번던전을 못간다. -> 모든던전을 도는방법 1, 3, 2로 도는방법이 실제로 있는데..

[프로그래머스,Java] Levle2: 메뉴 리뉴얼

문제분석 여러모로 할게 많은문제다.. 1. 각 손님들이 주문한 메뉴들을 기준으로, n개의 메뉴조합을 만든다. 2. 모든 메뉴조합의 카운트를 세준다. 2회 이상 나온것만 메뉴후보로 친다. 3.메뉴 후보를 정했다면, 가장 많이나온 메뉴후보를 선정한다. 4.만약, 가장 많이 나온 메뉴후보가 여럿있다면, 모두 출력하라. 필자의 문제 접근 우선, 순수한 단품메뉴들을 모아보고싶었다. 순수한 단품메뉴들의 모든 N개의 조합을 List로 넣어, 모든 조합을 정해놓고 손님들에게 넣어보며 카운트를 세주고싶었다. 1.Set 배열로,모든 손님의 단품메뉴들을 모아보았다. 2.단품메뉴들을 토대로, course[]의 숫자에따라 조합알고리즘을 적용한다. 모든 조합은 List case로 저장을했다. 3.cases에 들어있는 메뉴들의 조..

[프로그래머스,java] Levle2: n^2배열 자르기

문제분석 문제를 읽어보니 꽤나 친절한 문제다! 1. n^2 크기의 배열을 만들고 2. i행 i열 까지 i로 숫자를 세우고 3. 행 마다 모두 잘라서 새로운 1차원 배열을 만들고 4. left~right 사이에 있는 숫자들을 뽑아오면 된다! 만약, 문제설명 1~4번 과, 애니메이션이 설명하는 영상처럼 구현한다면 당신은 함정에 빠졋습니다. (필자도 당함) 그대로 구현하면 안되는이유 1.메모리초과 -> n이 10^7 이면, n^2 이 int범위를 넘어가서 Overflow 2.String, list ,StringBuilder는 Long타입(left,right)를 지원하지않음 따라서, 다시한번 생각을 정리해서 새로운 접근을 시도해봐야합니다. 이렇게보니, 각 열 각 행 마다 일정한 규칙이존재합니다. 네, 바로 Ma..

[프로그래머스,Java] Level2:짝지어 제거하기

문제분석 문제 예시로, baabaa 라면, 문자열이 들어오면서 중복이 일어나면 제거하는 연산을 해주면된다. 문제를 많이풀면 눈치가 생기는데, 바로 Stack알고리즘이 안성맞춤이다. 문자열 S를 하나씩끊어서 Stack에다 집어넣고, Stack.pop() 과 넣을문자가 같으면, 제거연산을 실행하면된다. 모든 문자열을 넣엇을때, 제거할수있으면 1 return 없으면 0을 return한다. 문제풀이 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 import java.util.*; class Solution { public int solution(String s) { int answer = 0; Stack stack = new Stack(); fo..

[프로그래머스,Java] Level2: 교점에 별 만들기 [위클리 챌린지 10주차]

https://programmers.co.kr/learn/courses/30/lessons/87377 코딩테스트 연습 - 10주차 [[2, -1, 4], [-2, -1, 4], [0, -1, 1], [5, -8, -12], [5, 8, 12]] ["....*....", ".........", ".........", "*.......*", ".........", ".........", ".........", ".........", "*.......*"] [[0, 1, -1], [1, 0, -1], [1, 0, 1]] ["*.*"] [[1, -1, 0], [2, -1, 0], [4, - programmers.co.kr 문제분석 문제에서 여러개의 직선을 입력으로 주어집니다. 여러개의 직선이 만나는 점을 교점이..

[프로그래머스, 자바] Level2:전력망을 둘로 나누기 (위클리 챌린지 9주차)

문제분석 목표: 어떤 간선을 잘랐을때, 나누어진 두개의 전력망의 차이가 최소가되는 경우구하기 간선을 잘랐을때, 두개의 전력망의 차이가 최소가 되는경우를 구해야하기때문에 일단, 간선을 하나씩은 다 잘라봐야한다. (완전탐색) 간선을 자르는행위는, wires간선에 원소를 없애버려야한다. 하지만, 입력값을 건드릴수는 없으니... wires배열의 복사본으로 List를 선언했다. BFS탐색을위해, Queue를 선언한다. (이유: 간선이 연결되어있는걸 탐색하기위해) 예시를 하나 들어보자면, wires간선에 [4,7]을 자르기로했다. 그러면, List=[[1,3],[2,3],[3,4],[4,5],[4,6],[4,7],[7,8],[7,9]] 이 되어야한다. 자르고나면, 왼쪽이든 오른쪽이든 갯수를 세어야한다. 본인은 부모..

[프로그래머스,자바] Level2 : 타겟 넘버

문제분석 여러개의 숫자가있는 배열 numbers와 target이 입력으로 주어집니다. 목표: numbers의 숫자를 모두활용하여, + - 만으로 target을 만드는 경우의수를 세기 모든 숫자를 사칙연산중 +,-만을 활용하여 target이 나오는경우를 세주면된다. 사칙연산중 2개의 연산만 고려하면되니, 재귀함수를 활용하면 간단하게 풀수있다. 문제풀이 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 28 29 30 31 32 33 34 35 class Solution { boolean[] visited; int cnt=0; public int solution(int[] numbers, int target) { int answe..

[프로그래머스,자바] Level2: 행렬 테두리 회전하기

https://programmers.co.kr/learn/courses/30/lessons/77485 코딩테스트 연습 - 행렬 테두리 회전하기 6 6 [[2,2,5,4],[3,3,6,6],[5,1,6,3]] [8, 10, 25] 3 3 [[1,1,2,2],[1,2,2,3],[2,1,3,2],[2,2,3,3]] [1, 1, 5, 3] programmers.co.kr 문제분석 문제가 길어서 링크로 대체하겠습니다. 문제설명은 가로,세로 길이가 주어진 2차원배열이 주어집니다. 2차원배열은 1부터 가로X세로까지 +1씩 채워져있습니다. 이 2차원배열을 쿼리[x1,y1,x2,y2] 에 따라 회전시키고, 회전이 종료하고 움직인 숫자들중 가장 낮은숫자를 answer 배열에 추가합니다. 모든 쿼리를 순회했다면, answe..

반응형