[20230306_프로그래머스 알고리즘_Lv.1]

YunTrollpark·2023년 3월 6일
0

1. 예산

문제 설명

S사에서는 각 부서에 필요한 물품을 지원해 주기 위해 부서별로 물품을 구매하는데 필요한 금액을 조사했습니다. 그러나, 전체 예산이 정해져 있기 때문에 모든 부서의 물품을 구매해 줄 수는 없습니다. 그래서 최대한 많은 부서의 물품을 구매해 줄 수 있도록 하려고 합니다.

물품을 구매해 줄 때는 각 부서가 신청한 금액만큼을 모두 지원해 줘야 합니다. 예를 들어 1,000원을 신청한 부서에는 정확히 1,000원을 지원해야 하며, 1,000원보다 적은 금액을 지원해 줄 수는 없습니다.

부서별로 신청한 금액이 들어있는 배열 d와 예산 budget이 매개변수로 주어질 때, 최대 몇 개의 부서에 물품을 지원할 수 있는지 return 하도록 solution 함수를 완성해주세요.

제한 사항
• d는 부서별로 신청한 금액이 들어있는 배열이며, 길이(전체 부서의 개수)는 1 이상 100 이하입니다.
• d의 각 원소는 부서별로 신청한 금액을 나타내며, 부서별 신청 금액은 1 이상 100,000 이하의 자연수입니다.
• budget은 예산을 나타내며, 1 이상 10,000,000 이하의 자연수입니다.

function solution(d, budget) {
let answer = 0
let count = 0
d.sort((a,b)=> a-b)
for(i=0; i<d.length; i++){
  answer = answer + d[i]
  if(answer <= budget){
    count++
  }
}
  return count
}


// 해설
// 1. 변수 answer와 count 선언
// 2. d를 작은수에서 큰수로 sort(최대한 많은 부서에 줘야함)
// 3. for 반복문을 d의 길이만큼 돌아서
// 4. answer에 받은 배열 d의 i번째부터 차례대로 더함
// 5. 만약 그렇게 더한수가 인자로 받은 budget 보다 작거나 같다면 count++
// 6. 그리고 count를 retrun
  • 하... 문제를 잘 못 이해함 ㅠㅜㅠㅜㅠ 무조건 budeget을 0으로 만들 필요는 없고 받은 예산은 남아도 상관없고 최대한 budget안에서 많은 부서에게 전달만 하면 되는거였다...

2. 시저 암호

문제 설명

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.

제한 사항
• 공백은 아무리 밀어도 공백입니다.
• s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다.
• s의 길이는 8000이하입니다.
• n은 1 이상, 25이하인 자연수입니다.

function solution(s, n) {
const upper = Array.from({length:26}, (v,i)=> String.fromCharCode(i+65))
const lower = Array.from({length:26}, (v,i)=> String.fromCharCode(i+65).toLowerCase())
let answer = ''
for(i=0; i<s.length; i++){
  if(s.charAt(i) === ' '){
    answer += ' '
  }
  else if(upper.indexOf(s.charAt(i)) !== -1){
    if(25 - upper.indexOf(s.charAt(i)) < n ||  upper.indexOf(s.charAt(i))
       === 25){
      answer += upper[n-1-(25 - upper.indexOf(s.charAt(i)))]
    } else {
      answer += upper[upper.indexOf(s.charAt(i))+n]
    }
  } else if(lower.indexOf(s.charAt(i)) !== -1){
    if(25 - lower.indexOf(s.charAt(i)) < n || lower.indexOf(s.charAt(i)) === 25){
      answer += lower[n-1-(25 - lower.indexOf(s.charAt(i)))]
    } else {
      answer += lower[lower.indexOf(s.charAt(i))+n]
    }
  }
}
  return answer
}


// 해설
// 1. 대문자, 소문자 배열을 만들어줌
// 2. answer 선언
// 3. for 반복문을 s의 길이만큼 돌아서
// 4. 첫번째 조건 공백이면 answer 공백 할당, 두번째 조건 대문자 배열에서 s(i)를 찾았을때 -1이 아니라면 해당 조건문 돌기, 세번째 조건 소문자 배열에서 s(i)를 찾았을때 -1이 아니라면 해당 조건문 돌기
// 5. 두번째 조건과 세번째 조건의 부속 조건은 동일(배열의 indexOf(s.charAt(i)가 25거나 혹은 25에서 indexOf(s.charAt(i) 뺀 수가 n보다 작으면 알파벳 배열의 0번째에서 n-1-(25 - upper.indexOf(s.charAt(i))) 문자열을 할당, 그렇지 않으면  알파벳 배열의 indexOf(s.charAt(i))+n 할당!)
  • 이제 가면 갈수록 문제가 복잡해진다 아직 레벨1인데...(정답률 높은 문제순으로 푸는 중...) 흑흑... 다른 사람들 풀이 보니까 최종 숫자로 조건문을 주는 방법이 있었는데 그걸로 추후에 다시 해볼예정! 오늘도 첫번째 문제 제외하고는 힌트 안봤당! 이번주 안에 2페이지 문제 전부 풀어야지!
profile
코딩으로 세상에 이야기하는 개발자

0개의 댓글