이노캠5주차(수)-알고리즘 문제 풀이

rimhye·2023년 6월 21일
0

이노캠

목록 보기
19/39

📌알고리즘 문제 풀기

1.자릿수 더하기

[문제설명]
자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.
[제한사항]
N의 범위 : 100,000,000 이하의 자연수

📖문제풀이

function solution(n)
{   
    let str=n.toString().split('') //n을 배열로 만듦
    var newArr = str.map(Number); //배열로 만든 후 요소를 숫자로 변환
    // console.log(typeof(str[0]))
    let sum=''
  
     sum = newArr.reduce(function (accumulator, currentValue) {
     return accumulator + currentValue;
    }, 0);

    // console.log(sum)
    return sum
}

🔨시행착오

reduce()함수를 쓰는 것까진 수월하게 됐는데 숫자의 합이 6이 아니라 123으로 떠서 왜 그런지 살펴봤다. 알고 보니 요소가 문자타입이라 그런 것을 알게 됐음! 그래서 map으로 숫자로 변경 후 작동시켜보니 잘 돌아갔다.

2.자연수 뒤집어 숫자로 만들기

[문제설명]
자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.
[제한 조건]
n은 10,000,000,000이하인 자연수입니다.

📖문제풀이

이 문제는 쉽게 풀림.

function solution(n) {
    //reverse함수 존재는 알고 있었는데 없이 풀어보고 싶었음
    
    const a=n.toString().split('') //n을 배열로 만들어주고
    let result='';
    const sum=[];
    // console.log(a)
    for(i=0;i<a.length;i++){
     result=a[a.length-(i+1)] //반대로 들어가는데 0번째는 length-1은 null값이 되어버리므로 i+1을 빼줌.
     sum.push(result)
    } 
    var newArr = sum.map(Number); //sum 안 값이 문자라 숫자로 바꿔줌
    return newArr
}

또 다른 풀이방법

return n.toString().split('').reverse().map(o => o = parseInt(o));

  var arr = [];

   do {
       arr.push(n%10);
       n = Math.floor(n/10);
   } while (n>0);

   return arr;

로도 풀 수 있음.

3.Triangular Output

[문제설명]
첫째 줄에 정수 n이 주어진다. (0≤n≤100)
다음 예제와 같이 삼각형 모양으로 ‘*’을 출력하세요.
(공백의 개수와 별의 개수를 정확하게 확인해주시길 바랍니다.)

[예시]

📖문제풀이

어렵긴 어려웠지만 용케 풀어냈다. 내 식은 이렇다.

let star= 9; //확인용 예시코드 

function solution(star){
  let arr=[]; //세로줄 지정(9개의 줄로 삼각형 만들어야함)  
  let answer=[]; //"*"의 개수 
  arr.length=star; 
  let x=star-1; 

  for(i=0;i<star;i++){  
      answer.push((i*2)+1) //별 개수가 1,3,5,7이런 식으로 늘어나서 i*2+1로 지정함 
    }
  for(i=0;i<answer.length;i++){ //여백을 넣기 위한 for문 
    let x=star-1
    x-=i
    console.log(" ".repeat(x)+"*".repeat(answer[i]+" ".repeat(x)))  
  } //star-1값은 여백을 반으로 나눈 값이라서 여백+"*"+여백이 되도록 했다.
 
}
solution(star);

🔨시행착오

여백을 더해 가운데로 솟아오른 삼각형을 만드는게 제일 어려웠다. 직각 삼각형으로 *을 찍는 건 정말 금방이었는데... 그래서 어떻게 저런 삼각형이 나왔을까 생각하다 보니 배열의 인덱스 개수는 제일 마지막 줄, 17개로 고정한 채로 가운데에 별을 두고 여백을 넣도록 했다. 그래서 이리저리 콘솔을 돌려 let x=star-1값으로 한쪽 여백을 설정해서 양쪽에 여백을 붙여 만들었다. 솔직히 첨엔 이렇게 만들 생각 못 했는데 노트에 별과 인덱스값을 쓰며 규칙성을 찾다보니 찾아낼 수 있었다.

다른 팀원 풀이

function solution(star){
    // 코드 작성
    let temp = ''; // 트리를 담아줄 변수 생성
    
    for(let i = 0; i < star; i++) {
    temp += '\n'; // 줄 바꿈
    for(let j = 0; j < star - i; j++) {
    temp += ' '; // 공백 생성
    }
    for(let k = 0; k < 2 * i + 1; k++) {
    temp += '*'; // 별 찍기
    }
    }
    
    console.log(temp);
    }
    let star= 9;
    solution(star)
    
    // 별의 개수가 2개씩 늘어나기 때문에, 2의 배수가 필요한 것으로 보임
    // 별의 개수가 1개부터 시작해야 하기 때문에, +1을 대입
function solution20 (n){
let str = "";
for(let i = 0; i < n; i++)
str += " ".repeat(n - (1 + i)) + "*".repeat(1 + (i * 2)) + "\n";
return str;
}

✍️느낀점

내일 알고리즘 테스트라 어려운 문제를 여럿 도전해봤는데 진짜 엄청 빡셌다. 이 값이 어떻게 나왔는지 고민하는 과정에서 엄청 삽질을 많이 한 듯... 끝으로 내가 만들었던 여러 삼각형을 남기면서 글을 마치겠다.

산타모자🎅보고가세요✨

profile
개발자가 되고 싶어요

1개의 댓글

comment-user-thumbnail
2023년 6월 22일

어제 보여주신 별찍기군요!
산타모자 잘 찍으셨네요! ㅋㅋ 이번주 너무 고생하셨고 다음주도 화이팅입니다!

답글 달기