Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 서블릿
- 문자열 압축
- 고모네 콩탕
- 동적 프로그래밍
- Spring
- 양꼬치
- 포두부 보쌈
- 설탕 배달
- BFS
- 백준
- 2589
- HTTP API
- 맛집
- dp
- Servlet
- 호유동
- 완도산회
- 알고리즘
- 프로그래머스
- 쓰레드 풀
- 맛집 투어
- 스프링 MVC
- 투어
- 2839
- 2020 KAKAO BLIND
- 다이나믹 프로그래밍
- 1로 만들기
- 2638
- 스프링
- mvc
Archives
- Today
- Total
프로그래밍 공방
[프로그래머스] 보석 쇼핑 본문
문제
programmers.co.kr/learn/courses/30/lessons/67258
문제해결방법
이 문제를 풀기 위해 시작 인덱스와 끝 인덱스 두 개의 포인터를 사용하였다.
1. gems를 돌면서 Map에 존재하면 pass, 존재하지 않으면 해당 보석 이름을 Key로, Value를 0으로 해서 맵에 넣어준다
-> 맵에 넣어줄때마다 카운트해서 보석의 종류의 개수를 알 수 있다.
2. 끝 인덱스를 배열의 0에서부터 증가시켜가며 보석의 종류별로 나온 횟수를 센다.
(0에서 1이 되는 경우 카운트 하여 보석 종류 숫자가 될 때까지 탐색한다.)
3. 시작 인덱스를 0부터 끝 인덱스까지 하나씩 증가시키면서 보석이 나온 횟수를 -1 하는데 0이 되지 않는 경우만 증가시켜준다.
4. 끝 인덱스를 하나씩 뒤로 미뤄가면서 3번 과정을 반복한다.
5. 3번 과정을 할 때마다 길이를 최소 길이와 비교해가면서 더 작아질 때 시작 인덱스와 끝 인덱스를 기록한다.
코드
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | package Programmers; import java.util.Arrays; import java.util.HashMap; import java.util.Map; public class Solution_보석쇼핑 { public static Map<String, Integer> map = new HashMap<>(); public static int removeDupGems(int si, int ei, String[] gems) { for(int i=si; i<ei; i++) { if(map.get(gems[i])==1) break; map.put(gems[i], map.get(gems[i])-1); si++; } return si; } public static int[] solution(String[] gems) { int count = 0; for(int i=0; i<gems.length; i++) { if(!map.containsKey(gems[i])) { map.put(gems[i], 0); count++; } } int si = 0, ei = 0; int curCount = 0; while(curCount<count) { if(map.get(gems[ei])==0) curCount++; map.put(gems[ei], map.get(gems[ei])+1); ei++; } int min = ei-si; int minStartIndex = si, minEndIndex = ei-1; si = removeDupGems(si, ei, gems); if(min>ei-si) { min = ei-si; minStartIndex = si; minEndIndex = ei-1; } while(ei<gems.length) { map.put(gems[ei], map.get(gems[ei])+1); ei++; si = removeDupGems(si, ei, gems); if(min>ei-si) { min = ei-si; minStartIndex = si; minEndIndex = ei-1; } } int[] answer = {minStartIndex+1, minEndIndex+1}; return answer; } public static void main(String[] args) { String[] gems = {"A", "B", "A", "A", "A", "C", "A", "B"}; System.out.println(Arrays.toString(solution(gems))); } } | cs |
코드에 대한 피드백이나 더 좋은 아이디어는 언제나 환영입니다.
'개발 > 문제해결' 카테고리의 다른 글
[프로그래머스] 뉴스 클러스터링 (0) | 2020.12.30 |
---|---|
[프로그래머스] 비밀지도 (0) | 2020.12.30 |
[백준] 16932번 : 모양 만들기 (0) | 2020.12.29 |
[백준] 1113번 : 수영장 만들기 (0) | 2020.12.23 |
[백준] 16234번 : 인구 이동 (0) | 2020.12.17 |