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

TIL 230411 3진법 뒤집기, 같은 숫자는 싫어, 두 개 뽑아서 더하기, 최소직사각형, 모의고사, 로또의 최고 순위와 최저 순위, 문자열 내림차순으로 배치하기

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

TIL 230411_3진법 뒤집기, 같은 숫자는 싫어, 두 개 뽑아서 더하기, 최소직사각형, 모의고사, 로또의 최고 순위와 최저 순위, 문자열 내림차순으로 배치하기

 

✅문제 

-3진법 뒤집기

자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.

✍문제풀이

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

// //접근 방식: 10진법의 n을 3진법으로 바꿈 -> 배열화->앞뒤 반전-> 10진법으로 다시 바꿈
//막힘: 3진법으로 바꾼 후 앞뒤반전 한 배열까진 만들었으나,
//0021이 10진법을 통해 어떻게 변화되는지의 과정을 몰라서 검색해봄.

 

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

//첫 번째 자리: 0 × 3³ = 0
//두 번째 자리: 0 × 3² = 0
//세 번째 자리: 2 × 3¹ = 6
//네 번째 자리: 1 × 3⁰ = 1
//따라서 0021은 10진수로 변환하면 7이 됩니다.

//즉 내 생각엔 0021의 각 요소를 10진수로 변화 시킨 후 , 그 요소를 전부 더하면 된다.

var n = 45; // result = 7

function solution(n) {
  var teRnary = n.toString(3).split(""); //45->1200->[1,2,0,0]
  var answer = [];
  for (let i = teRnary.length - 1; i >= 0; i--) {
    answer.push(Number(teRnary[i])); // [0,0,2,1]
  }

  var sum = 0; //[0,0,2,1]의 각 요소를 10진수 화 한다.
  for (let i = 0; i < answer.length; i++) {
    sum += answer[i] * Math.pow(3, answer.length - i - 1); //이 부분이 이해가 안감!!, 아마도 10진수를 구하는 방법에서 비롯된 것 같아서 그냥 외우는게 나을듯.
  }

  return sum;
}
console.log(solution(n));

 

 

 

✅문제 

-같은 숫자는 싫어

//배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 합니다. 예를 들면,arr = [1, 1, 3, 3, 0, 1, 1] 이면 [1, 3, 0, 1] 을 return 합니다.arr = [4, 4, 4, 3, 3] 이면 [4, 3] 을 return 합니다.배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요.

✍문제풀이

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

//나의 접근 방법 : for 문을 돌면서 만약 arr1[i]안에 중복 되는 값을 파악,
//if 문으로 중복되는 값은 1번만 출력하게 함.
//p,y 문자열 찾았던 것 처럼 1, -1로 값을 줄까? 연속적으로 나타나는 숫자는 +1값으로 표현?
 

 

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

//해결 : 생각의 차이....결국 새로 생성되는 배열은 i값과 i+1값이 같지 않은것이니까..
//오히려 같으면 놔두고, 다른것들만 내려오게하면 연속된 같은 것중에 첫번째는 통과하고 두번째는 통과하지 못하여 내려올것. 어렵다 어려워 ..

var arr1 = [1, 1, 3, 3, 0, 1, 1]; //answer = 1,3,0,1
var arr2 = [4, 4, 4, 3, 3]; //answer = 4,3

function solution(arr) {
  var answer = [];
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] !== arr[i + 1]) {
      answer.push(arr[i]);
    }
  }

  return answer;
}

console.log(solution(arr1));

 

 

✅문제 

-두개 뽑아서 더하기

정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.

✍문제풀이

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

//나의 접근 : nums 안의 요소들을 더한 값을 더한 값과 비교하여 새 배열에 배치
//요소를 더했을때의 경우의 수 부터 생각하자 예를 들어 2,1,1이라면 경우의 수는 6이고 결과 값은 2, 3두가지다.

//막힌 부분: for 문안에서 2+1, 2+1을 어떻게 만드는건지 모르겠음..
//차라리 2,1,1이라는 같은 배열을 만들어서 비교한 후에 값을 내는건 어떨지?

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

function solution(numbers) {
  var answer = [];
  for (let i = 0; i < numbers.length; i++) {
    for (let j = 0; j < numbers.length; j++) {
      let sum = numbers[i] + numbers[j];
      answer.push(numbers[i]);
    }
  }
  return answer;
}

console.log(nums);

//여기까지 만들었으나 더한 값도 안나오고 계속 [2,1,1]만 나옴. 왜일까?
//1. if문을 사용해 i와 j가 같지 않은 경우에만 합을 구할 수 있다.
//2. j가 무조건 i보다 1 큰수에서 시작하면 된다.
//3. i와 j를 더하는것 까진 했는데,

// i= 0일시 2+1=3
// i= 1일시 1+1=2, 다음 식이 성립이 안되잖아?
// i= 2일시 j= 3인데, 그럼 더하는 작업을 안한다는 것 아닌가?

//그래서 numbers.length-1로 수정했떠니,
//i= 0일시 함수 조건이 성립되어 2+1,
//i= 1일시 함수 조건이 성립되어 1+1
//i= 2일때 함수 조건이 성립되지 않아 멈춤. 결과 값은 3,2
 

 

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

//set은 중복을 허용하지 않는 자료구조입니다. set을 사용하여, numbers 배열의 서로 다른 두 요소를 더한 값을 중복 없이 저장하고, 이 값을 배열로 변환하여 answer에 저장하고 반환합니다.

//빈 set을 생성합니다.
//numbers 배열의 모든 요소를 순회하면서, 두 요소를 더한 값을 set에 추가합니다. (i번째 요소와 j번째 요소를 더한 값을 추가합니다. 단, i와 j가 같은 경우는 제외합니다.)
//set의 모든 요소를 forEach() 메소드를 사용하여 answer 배열에 추가합니다.
//answer 배열을 반환합니다.
//위 코드에서 set은 중복을 제거하고 유니크한 값을 저장하므로, set에 추가된 모든 값은 서로 다른 두 요소를 더한 결과입니다. set을 배열로 변환하여 answer에 저장하면, numbers 배열의 서로 다른 인덱스끼리 더한 값 중 중복이 제거된 값들이 저장되어 있습니다. 따라서 answer를 반환하면, 문제에서 요구한 결과를 얻을 수 있습니다.

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

function solution(numbers) {
  var answer = [];
  const set = new Set();
  for (let i = 0; i < numbers.length; i++) {
    for (let j = 0; j < numbers.length; j++) {
      if (i != j) {
        set.add(numbers[i] + numbers[j]); //i와 j가 같지 않을 시 더한 값을 구함
      } // 값은 원래대로라면 3,3,3,2,3,2가 나올테지만 중복값을 없애주는 set를 이용
    }
  }
  set.forEach((numbers) => {
    //그래서 set로 정리된 2,3값을 각각 새로운 배열에 푸쉬해줌
    answer.push(numbers);
    //'set'객체의 'forEach()'메소드는 'set'객체에 저장된 값들을 순회하면서, 각 값에 대해 콜백함수를 실행한다. 콜백함수는 'forEach()'메소드를 호출할때 전달된 함수로서, 화살표함수 '(numbers)=>{answer.push(numbers)}가 이 부분에 해당함.
    //그래서 여기까지의 결과물은, 중복값을 제거한 값이 배열에 들어간 상태.
  });
  //이제 여기서 오름차순 정렬
  answer.sort((a, b) => a - b);
  return answer;
}

console.log(solution(nums));

 

 

 

✅문제 

-최소직사각형

//문제 설명: 명함 지갑을 만드는 회사에서 지갑의 크기를 정하려고 합니다. 다양한 모양과 크기의 명함들을 모두 수납할 수 있으면서, 작아서 들고 다니기 편한 지갑을 만들어야 합니다. 이러한 요건을 만족하는 지갑을 만들기 위해 디자인팀은 모든 명함의 가로 길이와 세로 길이를 조사했습니다.

✍문제풀이

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

//나의 접근 : 전혀 감이 안잡히지만..배열안의 가장 큰 수와 비교하면 되는거 아닐까 ..
//명함은 가로로 눕힐 수 있기 때문에 가로를 큰 쪽, 세로를 작은 쪽으로 돌린다
//가로를 제일 긴 변으로 설정 후 회전

 

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

var sizes = [
  [60, 50],
  [30, 70],
  [60, 30],
  [80, 40],
];

function solution(sizes) {
  var answer = [];
  for (let i = 0; i < sizes.length; i++) {
    if (sizes[i][0] < sizes[i][1]) {
      [sizes[i][0], sizes[i][1]] = [sizes[i][1], sizes[i][0]];
    }
  }
  let max_width = Math.max(...sizes.map((size) => size[0]));
  let max_height = Math.max(...sizes.map((size) => size[1]));
  answer = max_width * max_height;
  return answer;
}

console.log(solution(sizes));

 

 

 

✅문제 

-모의고사 난이도 ★★★★

//문제 설명: 수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.

 

아래 규칙대로 찍음
1번 수포자가 찍는 방식: 1, 2, 3, 4, 5...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5...
const three = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]

 

1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.
 

✍문제풀이

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

//나의 접근 : 전혀 감이 안잡히지만..배열안의 가장 큰 수와 비교하면 되는거 아닐까 ..
//명함은 가로로 눕힐 수 있기 때문에 가로를 큰 쪽, 세로를 작은 쪽으로 돌린다
//가로를 제일 긴 변으로 설정 후 회전

 

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

for 문에서 답을 비교하는 함수를 꼭 이해하고 있어야 해결이 가능한 문제.

//막힘: 문제를 찍는 특정 패턴과 답안지를 배열 비교하는 것 까진 알겠는데 방법을 모르겠다..

var answers = [2, 1, 2, 3, 5]; // result = [1]

function solution(answers) {
  //수포자들의 반복되는 규칙의 수를 배열로 지정
  const one = [1, 2, 3, 4, 5];
  const two = [2, 1, 2, 3, 2, 4, 2, 5];
  const three = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];
  let supo1 = 0;
  let supo2 = 0;
  let supo3 = 0;
  let answer = [];
  let fiNal = [];

  for (let i = 0; i < answers.length; i++) {
    if (one[i % one.length] === answers[i]) supo1++; 
    if (two[i % one.length] === answers[i]) supo2++;
    if (three[i % one.length] === answers[i]) supo3++;
  }

  answer.push(supo1, supo2, supo3); //[5,0,0]
  let max = Math.max(...answer);
  if (max === supo1) {
    fiNal.push(1);
  }
  if (max === supo2) {
    fiNal.push(2);
  }
  if (max === supo3) {
    fiNal.push(3);
  }

  return fiNal;
}

console.log(solution(answers));

 

 

 

✅문제 

-로또의 최고 순위와 최저 순위

로또 6/45(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 아래는 로또의 순위를 정하는 방식입니다. 

 

순위당첨 내용

1 6개 번호가 모두 일치
2 5개 번호가 일치
3 4개 번호가 일치
4 3개 번호가 일치
5 2개 번호가 일치
6(낙첨) 그 외

로또를 구매한 민우는 당첨 번호 발표일을 학수고대하고 있었습니다. 하지만, 민우의 동생이 로또에 낙서를 하여, 일부 번호를 알아볼 수 없게 되었습니다. 당첨 번호 발표 후, 민우는 자신이 구매했던 로또로 당첨이 가능했던 최고 순위와 최저 순위를 알아보고 싶어 졌습니다.
알아볼 수 없는 번호를 0으로 표기하기로 하고, 민우가 구매한 로또 번호 6개가 44, 1, 0, 0, 31 25라고 가정해보겠습니다. 당첨 번호 6개가 31, 10, 45, 1, 6, 19라면, 당첨 가능한 최고 순위와 최저 순위의 한 예는 아래와 같습니다.

당첨 번호3110451619결과

최고 순위 번호 31 0→10 44 1 0→6 25 4개 번호 일치, 3등
최저 순위 번호 31 0→11 44 1 0→7 25 2개 번호 일치, 5등
  • 순서와 상관없이, 구매한 로또에 당첨 번호와 일치하는 번호가 있으면 맞힌 걸로 인정됩니다.
  • 알아볼 수 없는 두 개의 번호를 각각 10, 6이라고 가정하면 3등에 당첨될 수 있습니다.
    • 3등을 만드는 다른 방법들도 존재합니다. 하지만, 2등 이상으로 만드는 것은 불가능합니다.
  • 알아볼 수 없는 두 개의 번호를 각각 11, 7이라고 가정하면 5등에 당첨될 수 있습니다.
    • 5등을 만드는 다른 방법들도 존재합니다. 하지만, 6등(낙첨)으로 만드는 것은 불가능합니다.

민우가 구매한 로또 번호를 담은 배열 lottos, 당첨 번호를 담은 배열 win_nums가 매개변수로 주어집니다. 이때, 당첨 가능한 최고 순위와 최저 순위를 차례대로 배열에 담아서 return 하도록 solution 함수를 완성해주세요.

✍문제풀이

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

 

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

우선 숫자를 비교하기 쉽게 각 배열을 오름차순 정리 해준 후 시작한다. 

for문을 두 번 만드는 이유? 0의 갯수를 비교할 데이터와 맞춘개수를 비교할 데이터를 각 각 구해야하기 때문에. 

 

출처: GPT

이 함수에서 for 루프는 두 개의 목적을 위해 사용됩니다.

  1. zeroCount: 0의 개수를 세는 루프

첫 번째 for 루프는 주어진 lottos 배열에서 0의 개수를 세는 데 사용됩니다. 0의 개수는 뒤에서 사용되며, 제출한 로또 번호에서 일치하는 번호가 0의 위치에서 발견되는 경우에만 유용합니다.

  1. matchCount: 일치하는 번호의 개수를 세는 루프

두 번째 for 루프는 두 배열의 모든 요소를 비교하여 일치하는 번호의 개수를 세는 데 사용됩니다. 일치하는 번호의 개수는 제출한 로또 번호에서 실제 당첨 번호와 일치하는 번호의 개수를 세는 데 사용됩니다.

즉, 이중 for 루프를 사용하여 함수는 0의 개수와 일치하는 번호의 개수를 모두 계산합니다. 이 정보를 사용하여 로또 번호에서 이길 수 있는 최고 순위와 최저 순위를 계산하고 반환합니다.

function solution(lottos, win_nums) {
  lottos.sort((a, b) => a - b);
  lottos.sort((a, b) => a - b);
  var zeroCount = 0;
  var matchCount = 0;

  for (let i = 0; i < lottos.length; i++) {
    if (lottos[i] === 0) {
      zeroCount++;
    }
    for (let j = 0; j < lottos.length; j++) {
      if (lottos[i] === win_nums[j]) {
        matchCount++;
      }
    }
  }

완성 코드

function solution(lottos, win_nums) {
  lottos.sort((a, b) => a - b);
  lottos.sort((a, b) => a - b);
  var zeroCount = 0;
  var matchCount = 0;

  for (let i = 0; i < lottos.length; i++) {
    if (lottos[i] === 0) {
      zeroCount++;
    }
    for (let j = 0; j < lottos.length; j++) {
      if (lottos[i] === win_nums[j]) {
        matchCount++;
      }
    }
  }
  let x = zeroCount + matchCount; //맞출 수 있는 경우의 수
  var rank = [6, 6, 5, 4, 3, 2, 1]; //차례대로 등수 곧 0개 맞추면 6등

  if (zeroCount > 0) {
    //zeroCount = 2 + matchCount = 1 --->x=3
    switch (x) {
      case x:
        return [rank[x], rank[x - zeroCount]]; //최고는 4등이고, 최저는 6등
    }
  } else {
    switch (x) {
      case x:
        return [rank[x], rank[x]]; //최고, 최저를 맞춰야됌
    }
  }
}

console.log(solution([44, 1, 0, 0, 31, 25], [31, 10, 45, 1, 6, 19]));

//lottos = [0, 0, 1, 25, 31, 40]
//이 경우 0을 고려했을때 최고 3개, 최저 1
//win_nums = [15, 19, 20, 25, 38, 40]

 

 

✅문제 

-문자열 내림차순으로 배치하기

//문제 설명
문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수, solution을 완성해주세요.
s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주합니다.

✍문제풀이

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

 
//나의 접근 : s를 배열로 만들고 그 배열을 뒤에서부터 다시 정렬해준 후, 배열에 있는 문자를 끄내서 문자화시킨다.

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

//오류: 문자를 배열화 시킨후 반대로 정렬 sort().reverse(); 를 써줌, for문으로 결과값을 +=하면 완성 ~ ~
function solution(s) {
  var answer = "";
  var arr = s.split("");
  arr.sort().reverse();
  for (let i = 0; i < arr.length; i++) {
    answer += arr[i];
  }

  return answer;
}
console.log(solution(s1));

 

**참고할 간략한 코드

function solution(s) {
    return s.split('').sort().reverse().join('');
}
반응형