본문 바로가기
개발/알고리즘 풀기

TIL 230411 소수만들기, 약수의 개수와 덧셈, 시저 암호, 예산

by 코딩하는짱구 2023. 4. 11.
반응형

TIL 230411 소수만들기, 약수의 개수와 덧셈, 시저 암호, 예산

 

✅문제 

-소수 만들기

주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.

✍문제풀이

1. 나의 접근방식 및 실패한 코드

나의 접근: 배열안의 숫자를 3 더한 값을 구한 , 값이 %1 수를 센다.
막힘: 배열안의 서로 다른 인덱스 3 더하는 방법이 뭘까

var nums = [1, 2, 3, 4]; //result = 1
//var nums2 = [1,2,7,6,4] result = 4

function solution(nums) {
  var answer = [];

  for (let i = 0; i < nums.length; i++) {
    for (let j = 0; j < nums.length; j++) {
      for (let k = 0; k < nums.length; k++) {
        if (i !== j && j !== k && i !== k) {
          answer.push(nums[i], nums[j], nums[k]);
        }
      }
    }
  }
  return answer;
}

console.log(solution(nums));

// //위의 방법으로 하면 배열안의 합이 아니라 배열 자체가 합쳐진 값이 나옴!!
// //이제 그 안의 합을 구해야함.

중첩 for문이 어떻게 작동하는지 정확히 몰라서 이해를 못하기 시작. 

중첩 for문에서 for문은 한바퀴, 두바퀴 이렇게 도는게 아니라 맨 안쪽 즉 아래에서는 k문이 완료되고 그 이후에 j, i순으로 완료 된다는 점을 꼭!! 알고있자. 

i=0 1, j=1 2, k=2 3 (1,2,3)
i=0 1, j=1 2, k=3   (1,2,4)
i=0 1, j=2 3, k=3 4 (1,3,4)
i=1 2, j=2 3, k=3 4 (2,3,4)//j k 조건문은 다끝남

2. 문제파악 및  해결한 코드

var nums2 = [1, 2, 7, 6, 4]; //result = 4

// var nums = [1, 2, 3, 4]; //result = 1

function solution(nums) {
  let answer = 0; //소수의 개수
  for (let i = 0; i < nums.length; i++) {
    for (let j = i + 1; j < nums.length; j++) {
      for (let k = j + 1; k < nums.length; k++) {
        const sums = nums[i] + nums[j] + nums[k]; //중첩된 for문이 어떻게 동작하는지 잘 알고있어야함
        //6.7.8.9
        if (isPrime(sums)) answer += 1;
      }
    }
  }

  return answer;
}

function isPrime(sum) {
  for (let i = 2; i <= Math.sqrt(sum); i++) {
    if (sum % i === 0) return false;
  }
  return true;
}

console.log(solution(nums2));

 

 

 

 

 

✅문제 

-약수의 개수와 덧셈

//두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.

✍문제풀이

1. 나의 접근방식 및 실패한 코드

//나의 접근 : left와 right 사이의 수를 배열로 구함,
//그 수의 약수의 갯수들을 구함, if문써서 짝수면 +
//약수의 갯수를 어떻게 구해야될지 모르겠다.. .

2. 문제파악 및  해결한 코드

for문을 돌며 약수의 갯수를 구할 수도 있지만 아래와 같이 제곱수의 성질을 이용하면 가독성이 좋다. 

//제곱수인 숫자는 약수갯수가 홀수, 아닌수는 짝수이다.
//예를 들어 16의 경우, 약수는 [1,2,4,8,16]인데, [1,16], [2,8]은 각각 곱하면 16이 되는 짝이다. 4같은 경우는 4 스스로를 다시 곱해야 16이 되므로 짝이 없게 된다. 그래서 결국 제곱수는 홀수개의 약수를 갖게 된다.

function solution(left, right) {
  var answer = 0;
  for (let i = left; i <= right; i++) {
    if (Number.isInteger(Math.sqrt(i))) {
      //제곱수를 구하는 함수,  제곱수가 맞다면(약수의 갯수는 홀수)
      answer -= i;
    } else {
      answer += i; //제곱수가 아니라면(약수의 갯수는 짝수) false를 인출함.
    }
  }
  return answer;
}
console.log(solution(left, right));

 

 

 

 

 

✅문제 

-시저 암호

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

✍문제풀이

1. 나의 접근방식 및 실패한 코드

//접근; 각각의 요소로 생각해야댐
이 부분에서 abc, ABC 각각의 배열이 필요하다는 것 까진 유추했지만 그 다음엔 어떻게 해야할지.. 

2. 문제파악 및  해결한 코드

 

팀원의 조언으로 index0F함수를 이용해서 해결.

index0f에서 -1은 왜 들어가고 어떻게 이용하는가?

 

정답:-1 값은 해당 문자열에서 찾는 문자가 없을 때 반환되는 값입니다. 따라서, str1.indexOf(s[i]) !== -1 과 같이 사용되면, s[i]가 str1 문자열 안에 존재할 때에만 조건문이 실행됩니다. 만약 s[i]가 str1 문자열 안에 존재하지 않는 경우, -1을 반환하게 됩니다. 이 경우, 조건문이 실행되지 않고, 다음 조건문이 실행됩니다.

 

var s = "AB";
var n = 1; // result= "BC"

function solution(s, n) {
  var str1 = "ABCDEFGHIJKLMNOPQRSTUVXYZABCDEFGHIJKLMNOPQRSTUVXYZ";
  var str2 = "abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyz";
  let answer = "";

  for (let i = 0; i < s.length; i++) {
    if (str1.indexOf(s[i]) !== -1) {
      //리턴하는 값은 위치 즉 INDEX를 반환 위치를 알려줌!!
      answer += str1[str1.indexOf(s[i]) + n]; //B
    }
    if (str2.indexOf(s[i]) !== -1) {
      answer += str2[str2.indexOf(s[i]) + n]; //주어진 s가 str1, str2에 포함되있는지 확인
    }
    if (s[i] === " ") {
      answer += " ";
    }
  }

  return answer;
}

console.log(solution(s, n));

//-1값은 왜 넣는건지 꼭 파악해라

 

 

 

 

 

✅문제 

-예산

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

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

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

✍문제풀이

1. 나의 접근방식 및 실패한 코드

//접근; 각각의 요소로 생각해야댐
이 부분에서 abc, ABC 각각의 배열이 필요하다는 것 까진 유추했지만 그 다음엔 어떻게 해야할지.. 

2. 문제파악 및  해결한 코드

포인트는 예산 안에서 숫자가 더해질때마다 카운트를 올려주는것.

d에서 숫자가 하나 더해지는것(1+3+2+5...) = 예산이 지급되는 것 의 개념.

var d = [1, 3, 2, 5, 4];
var b = [9]; // result = 3

//접근; 주어진 각 부서의 요청금액을 오름차순 정렬; for문으로 더한 값이 budget을 초과할 때 정지;
//budget을 초과하는지를 판별할 값, 한번 for문돌때 몇팀이나 사줬는지(얼마나 더해졌는지)

function solution(d, budget) {
  var sum = 0; //예산 안에서 총 지원된 금액
  var cnt = 0; //지원받은 팀의 수
  var arrd = d.sort(function (a, b) {
    return a - b;
  });
  for (let i = 0; i < d.length; i++) {
    if (sum + arrd[i] <= budget) {
      sum = sum + arrd[i];
      cnt++;
    }
  }

  var answer = cnt;
  return answer;
}

 

 

반응형