[Lv.2] 할인 행사 (JS)

hoheesu·2025년 6월 22일

알고리즘

목록 보기
3/5
post-thumbnail

문제를 푸는동안은 반복문 한번 썼다고 기분 좋았지만, 사실 중첩반복인 것 같아서 정말 속상했다,,,

문제 : 할인 행사

📘 문제

XYZ 마트는 일정한 금액을 지불하면 10일 동안 회원 자격을 부여합니다. XYZ 마트에서는 회원을 대상으로 매일 한 가지 제품을 할인하는 행사를 합니다. 할인하는 제품은 하루에 하나씩만 구매할 수 있습니다. 알뜰한 정현이는 자신이 원하는 제품과 수량이 할인하는 날짜와 10일 연속으로 일치할 경우에 맞춰서 회원가입을 하려 합니다.

제한사항

1 ≤ want의 길이 = number의 길이 ≤ 10
1 ≤ number의 원소 ≤ 10
number[i]는 want[i]의 수량을 의미하며, number의 원소의 합은 10입니다.
10 ≤ discount의 길이 ≤ 100,000
want와 discount의 원소들은 알파벳 소문자로 이루어진 문자열입니다.
1 ≤ want의 원소의 길이, discount의 원소의 길이 ≤ 12

💡 접근방식

  1. want 와 number 를 기반으로 Map(hash)에 각 물품과 필요한 수량을 저장
  2. discount 배열을 앞에서부터 탐색
  3. 조건 불일치 시에도 리셋
  • 일단 하나씩 읽는다.
  • 필요한 거면 체크해나간다.
  • 10개가 다 만족하면 카운트하고 다시 처음처럼.
  • 중간에 틀리면 다시 처음처럼.

🔎 해결 코드

진짜 너무나도 못생긴 코드인 것 같다. 가독성도 최악이고,,, 아무리봐도 알고리즘을 더 많이 풀면서 사고를 길러야 될 것 같다는 생각이 들었다.

내가 푼 문제를 다시 보면서 생각을 해봤는데, 10일 이내에 틀린 값이 시작일 → 옳지 않은 물건의 날짜 까지는 다시 확인을 하지 않아도 계속해서 틀린 값으로 인식될 것이 뻔한데, 틀린 물건이 중간에 끼어있다는 것을 알면서도 탐색한 것을 줄인다면 더 효율적인 코드를 짤 수 있지 않을까? 라고 생각이 든다. 다음번에 다시 풀어봐야겠다!

function solution(phone_book) {
    let answer = true
    phone_book.sort().forEach((e,i)=>{
        if( i < phone_book.length - 1 ) {
            if( e === phone_book[i + 1].slice(0, e.length) ) {
                return answer = false
            }
        }
    })
    return answer
}
profile
🤔👏💡👨🏻‍💻🤯😇

0개의 댓글