프로그래머스 13

[Java] 프로그래머스 Level 2 : 뉴스 클러스터링

- 문제설명 - 해결과정 - 솔루션 import java.util.*; class Solution { public int solution(String str1, String str2) { String lowerStr1 = str1.toLowerCase(); String lowerStr2 = str2.toLowerCase(); ArrayList union1 = makeUnion(lowerStr1); ArrayList union2 = makeUnion(lowerStr2); if(union1.size() == 0 && union2.size() == 0) { return 65536; } int crossSize = crossSection(union1, union2); int sumSize = union1.siz..

[Java] 프로그래머스 Level 3 : 베스트앨범

- 문제설명 & 제한사항 - 예시 - 해결과정 1. 장르별 총 몇번 플레이 됐는지 해시맵을 통해 누적합으로 구한다. 2. 총 플레이 횟수를 정렬 기준으로, 새로운 List에 장르이름만 모아서 넣는다. 3. 해당 리스트를 순회하며, 하나의 장르에서 플레이 횟수가 많은 2개 곡의 인덱스를 가져온다. 4. 결과로 내보낼 리스트에 2개 곡의 인덱스를 추가시킨다. - 솔루션 import java.util.*; class Solution { public int[] solution(String[] genres, int[] plays) { HashMap map = new HashMap(); int num = plays.length; for(int i = 0; i < plays.length; i++) { map.put(..

[Java] 프로그래머스 Level 3 : 단속카메라

- 문제설명 & 제한사항 - 예시 & 입출력 예 - 해결과정 전체적인 그림을 먼저 그려봤을 때, 주어진 배열을 임의의 기준으로 정렬 한뒤 첫 번째 차량부터 마지막 차량까지 순회하며 각각의 상황에서 카메라를 설치할지 말지 최선의 해를 구하는것이 그리디한 해법이라고 생각했다. 첫 번째 풀이는 다음과 같다. 첫 번째로 생각한 정렬의 기준은 진입 지점의 오름차순이었다. 해당 방식으로 정렬하고나면 우선 설치한 카메라의 좌표를 담고있는 리스트에 1번 차량의 이탈지점을 넣어준다. 이후 반복문을 돌면서 다음 차량의 진입 지점이 카메라 좌표를 넘지 않았다면 해당 차량은 굳이 추가 카메라를 설치할 필요 없이 기존의 카메라로 촬영 가능하다 라는 최선의 해에 도달하게 된다. 만약 차량의 진입 지점이 기존의 카메라 좌표를 넘었..

[Java] 프로그래머스 Level 1 : 체육복

- 문제설명 & 제한사항 - 예시 & 입출력 예 - 해결과정 총 3번의 시행착오를 겪었다. 가장 먼저 각 배열을 HashSet으로 만들었다. 문제를 깊게 들어가봤을 때, 배열을 그대로 놓고 푼다면 반복문마다 배열을 계속 뒤지는 상황이 발생할 것이라 판단해서 차라리 처음에 한번 쭉 배열을 돌아, 추후 필요한 값을 찾을 때 시간복잡도가 소요되지 않도록 만들었다. 1번 학생부터 n번 학생까지 반복문을 돌며 각 학생이 체육수업에 참여할 수 있는지 판단하고, 참여할 수 있다면 변수 count를 증가시켜주는 방식으로 설계했다. 가장 먼저, 반복문을 돌 때 체육복을 잃어버리지 않은 학생을 만나면 count를 증가시켜줬다. 두 번째로, 체육복을 잃어버린 학생을 만났다면 다음과 같은 순서대로 체육복을 빌릴 수 있는지 확..

[Java] 프로그래머스 Level 2 : 의상

- 문제설명 - 제한사항 - 예시 & 입출력 예 - 해결과정 코니가 가지고 있는 옷의 카테고리가 몇개이고, 각각 몇개씩 갖고 있는지 알면 해결 할 수 있는 문제이다. 예를들어 Headgear : 3개, Eyewear : 2개, Pants : 3개라면 모두 안입는 경우를 제외하고는 경우의 수를 따지면 되므로 (3 + 1) * (2 + 1) * (3 + 1) - 1 계산을 해주면 정답을 얻게된다. 각 배열값을 하나씩 맵에 형식으로 넣어줬다. 이때 처음 맵에 들어가는 의상종류는 getOrDefault() 메소드를 활용해서 기본값을 설정해줬다. 2번째 줄에서 보이는 것처럼, 실제 해당 카테고리에 가지고 있는 의상개수보다 1을 더해서 곱해줄 것이므로 디폴트값을 0이 아닌 1로 설정해주었다. 이후 곱 연산의 결과값..

[Java] 프로그래머스 Level 1 : 완주하지 못한 선수

- 문제설명 & 제한사항 - 예시 & 입출력 예 - 해결과정 해시를 이용하지 않고 이중for문을 통해 푼다면 주어진 제한조건 때문에 최악의 경우 100,000 X 100,000의 시간 복잡도가 발생할 수 있다. HashMap이나 HashSet을 이용해 풀어야 하는데, 동명이인이 있을 수 있다는 점에서 HashSet으로는 문제를 풀 수 없었다. 따라서 HashMap에 형식으로 데이터를 저장하고, 이후 완주자의 배열을 하나씩 불러오면서 동명이인이 없었다면 HashMap에서 아예 지워버리고, 동명이인이 있다면 동명이인의 수를 하나씩 빼주어 업데이트 해주는 방식으로 진행했다. 마지막엔 결국 완주하지 못한 단 한명의 선수가 HashMap에 남게되는데, 해당 키값을 빼오기 위해서 keySet() 메소드를 활용했다...

[Java] 프로그래머스 Level 2 : 주식가격

- 문제설명 - 제한사항 - 예시 & 입출력 예 - 해결과정 - 솔루션 import java.util.*; class Solution { public int[] solution(int[] prices) { Stack stack = new Stack(); int[] answer = new int[prices.length]; for(int i = 0; i < prices.length; i++) { while(!stack.empty() && prices[i] < prices[stack.peek()]) { answer[stack.peek()] = i - stack.peek(); stack.pop(); } stack.push(i); } // 계속 가격이 줄지 않으면 빈 배열로 남게된다. 아래를 추가하자. whil..

[Java] 프로그래머스 Level 2 : 올바른 괄호

- 문제설명 - 제한사항 - 예시 & 입출력 예 - 해결과정 문제 분류 자체는 스택/큐 이지만, 굳이 스택/큐를 이용하지 않아도 문자열 각 자리의 문자 하나씩 가져와 비교해보면 오히려 더 간단하게 풀 수 있었다. 그러나 분류가 스택/큐 인만큼 주어진 방식으로 풀어보고자 했다. 유효성 검사에서 통과하지 못한 첫번째 코드이다. import java.util.*; class Solution { boolean solution(String s) { Stack stack = new Stack(); for(int i = s.length() - 1; i >= 0; i—) { stack.push(s.charAt(i)); } int count = 0; while(!stack.empty()) { char c = stack...

[Java] 프로그래머스 Level 2 : 124 나라의 숫자

- 문제설명 - 제한사항 - 예시 & 입출력 예 - 해결과정 문제를 보자마자 특별한 알고리즘을 적용하는 문제가 아니고 규칙을 찾는 문제라고 직감했다. 요즘 규칙찾는 문제를 하나씩 접하게 되는데.. 이번 문제도 하나 둘씩 규칙을 찾아봤다. 아래 그림을 보자. 124 나라의 숫자가 1,2,4로만 이루어져 있다고 간단하게 3진법으로 변환하면 되겠다고 생각할 수 없었다. 0,1,2 였다면 3진법으로 변환하면 끝이지만 1,2,4 이기 때문에 나머지가 특수한 경우가 분명 있을 것이라 판단했다. 변환 전과 후를 비교해보면, 10진수를 3으로 나누었을 때 나머지가 1,2라면 맨 끝자리에 써주고 나머지가 없다면 4를 써주는 규칙이 존재한다는 것은 확인할 수 있다. 해당 규칙을 바탕으로 2개 정도 테스트를 해보자! 위의 ..

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

- 문제설명 - 제한사항 - 예시 & 입출력 예 - 해결과정 첫번째 입출력 예시인 16을 보면 1) 1층 내려가는 버튼을 6번 누른 뒤 10층 내려가는 버튼을 한번 눌러 총 7번의 버튼으로 0층까지 내려올 수 있고 2) 1층 올라가는 버튼을 4번 누른 뒤 10층 내려가는 버튼을 두번 눌러 총 6번의 버튼으로 0층까지 내려올 수 있다. 어떤 조건의 상황에서 층 수를 올리는게 좋고 내리는게 좋을까? 두번째 입출력 예시인 2554를 통해 알아보자. 하나의 버튼을 누를 때 마다 하나의 마법의 돌을 사용하므로 아래부터는 버튼을 누르는 행위를 마법의 돌을 사용했다고 표현하겠다. 먼저 마법의 돌을 최소로 사용한 경우와 아닌 경우에서, 가장 끝 단위인 +1층, -1층 버튼부터 각 자리의 숫자가 5보다 크면 층 수를 올..