프로그래머스 lv.2 정답률 높은 순서대로
풀어보기로 결심한 첫 날!
이 문제는 생각보다 빨리 풀렸다.
lv.2여도 쉬운 문제는 쉽고,
어려운 문제는 한도 끝도 없이 어렵다..
문제
https://school.programmers.co.kr/learn/courses/30/lessons/131127
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
설계
알고리즘 설계[접근 방법] : 슬라이딩 윈도우
슬라이딩 윈도우는 고정된 사이즈의 윈도우가 이동하면서 윈도우 내에 있는 데이터를 이용해 문제를 풀이하는 알고리즘이다.
배열이나 리스트의 요소의 일정 버 ㅁ위 값을 비교할 때 사용하면 유용하다.
풀이 과정
1.
가장 먼저 첫 날부터 10일까지 discount 배열을 반복문을 돌며, 할인되는 품목인지 확인한다.
만약 해당 날짜가 할인하기를 원하는 품목이라면 num의 배열에서 -1을 해준다.
2.
1일부터 10일까지 반복문이 끝나면, num배열을 반복문을 돌며 모든 품목을 할인받을 수 있는지 확인한다.
만약 num배열의 값이 모두 0이라면, 원하는 품목 모두 할인받을 수 있기 때문에 answer을 +1해준다.
3.
11일부터 할인하는 품목이 내가 원하는 품목인지 확인한다.
여기서 중요한 점은, 11일날에는 2일부터 11일을, 3일은 3일부터 12일을 확인해야 한다.
그렇기에, 2일-11일의 범위를 확인할 때는 1일차 품목을 num배열에서 +1 해준다.
만약 1일차 품목이 할인을 받지 않았던 품목이면 그냥 지나간다.
4.
하루가 끝날 때마다 num 배열을 반복문을 돌며, 모든 품목을 할인받을 수 있는지 확인한다.
코드
import java.util.*;
class Solution {
public int solution(String[] want, int[] number, String[] discount) {
int answer = 0;
//1일부터 10일 초기화
for(int i=0; i<10; i++){
for(int j=0; j<want.length; j++){
if(discount[i].equals(want[j])) number[j]--;
}
}
//할인 받을 수 있나 확인
boolean isempty = true;
for(int j=0; j<number.length; j++){
if(number[j]!=0) isempty=false;
}
if(isempty) answer++;
//10일부터 하루씩 반복문
for(int i=10; i<discount.length; i++){
//그 전 물건 초기화, 새로운 날 할인 확인
for(int j=0; j<want.length; j++){
if(discount[i-10].equals(want[j])) number[j]++;
if(discount[i].equals(want[j])) number[j]--;
}
//모든 물건을 할인 받을 수 있나 확인
isempty = true;
for(int j=0; j<number.length; j++){
if(number[j]!=0) isempty=false;
}
if(isempty) answer++;
}
return answer;
}
}
(❁´◡`❁)
끝!
'[자료구조] 알고리즘' 카테고리의 다른 글
[백준] 1003번 피보나치함수 (DP_JAVA) (1) | 2024.01.09 |
---|---|
[백준] 1018번 체스판 다시 칠하기 (완전탐색_JAVA) (1) | 2024.01.08 |
[프로그래머스] 구명보트(투포인터_JAVA) (1) | 2023.11.29 |
[프로그래머스] 점프와 순간이동 (DP_JAVA) (0) | 2023.11.23 |
[백준] 1021번 회전하는 큐(deQueue_JAVA) (0) | 2023.08.27 |