[TIL]231122_프로그래머스 알고리즘

ㅇㅖㅈㅣ·2023년 11월 22일
2

Today I Learned

목록 보기
30/93
post-thumbnail

👩🏻‍💻 Today Learn

  • 알고리즘 2문제
  • 뉴스피드 프로젝트 DAY1
    • 게시글 작성 페이지 css 작업

오늘은 뉴스피드 프로젝트를 진행하는것이 급해서 알고리즘 문제로 대체하는 TIL...OTL...

🔐 알고리즘 문제풀이

문제 1) 콜라츠 추측

1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될 때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다.

1-1. 입력된 수가 짝수라면 2로 나눕니다. 
1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다. 
2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다. 

예를 들어, 주어진 수가 6이라면 6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 이 되어 총 8번 만에 1이 됩니다. 위 작업을 몇 번이나 반복해야 하는지 반환하는 함수, solution을 완성해 주세요. 단, 주어진 수가 1인 경우에는 0을, 작업을 500번 반복할 때까지 1이 되지 않는다면 –1을 반환해 주세요.

풀이

function solution(num) {
    let answer = 0;

    while (num > 1) {
        if (num % 2 === 0) {
            num /= 2
         } else {
          num = (num * 3) + 1
     } 
        answer += 1;     // while문으로 홀수 짝수에 따라 반복한 횟수를 answer에 누적
    }
    if (answer >= 500){
        return -1
    } else {
        return answer;  // 누적횟수가 500이상이면 -1 반환, 그렇지 않으면 누적횟수 반환
    }}

거의 매번 for문만 사용하다가 while문을 사용해보았다. 짝수와 홀수의 조건에 나누어 연산하는 부분까지는 문제없었는데 그 횟수를 누적하는 부분에 대해 고민이 많았다. 찾아보면서 꾸역꾸역 풀었지만 구구절절해 보이는 코드가 아쉬웠다.

다른사람의 풀이!

function solution(num) {
    let answer = 0;
    while(num !=1 && answer !=500){
        num%2==0 ? num = num/2 : num = num*3 +1;
    answer++;
  }
    return num == 1 ? answer : -1;
}

if문만 사용하지 말고 삼항연산자를 이용해 풀어보는 연습도 많이 필요할 것 같다.


문제 2) 서울에서 김서방 찾기

String형 배열 seoul의 element중 "Kim"의 위치 x를 찾아, "김서방은 x에 있다"는 String을 반환하는 함수, solution을 완성하세요. seoul에 "Kim"은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다.

풀이

처음풀이

function solution(seoul) {
    let answer = '';
    for(let i=0; i< seoul.length; i++){
      answer = seoul[i] === 'Kim'  
    }
    return `김서방은 ${Number(answer)}에 있다`;
}

제목만 흥미로웠던 문제

풀면서도 엥? 했는데 역시나 return 문에 Number가 없었을 때 true로 나왔다.
(배열안에 Kim이 무조건 있으니까 당연히 true지!)
그말은 Boolean을 숫자로 바꿨을때 true면 숫자 1 / false는 숫자 0으로 변환되는것이라 성공으로 나온것은 얻어걸린것이다.
정답 아님...엉망진창!

수정한 풀이

function solution (seoul) {
    let answer = '';
    answer = seoul.indexOf('Kim');
    
    return `김서방은 ${answer}에 있다`
}

메서드를 활용하니 훨씬 간결하게 가능했다!

  • indexOf() 메서드는 배열에서 주어진 요소를 찾을 수 있는 첫 번째 인덱스를 반환하고, 찾을 수 없는 경우 -1을 반환한다.

✍🏻 회고

팀 프로젝트 작업에 대해 기록하려고 했지만 진행된 부분이 많지 않아 조금 더 진행후에 기록하려 한다.
오늘 알고리즘 문제는 평소 풀던 것 보다(?) 문제가 조금 더 어렵게 느껴져서 구글링을 통해 이해하면서 풀었다. 단계별로 쪼개서 하나씩 접근하는 것에 익숙해지도록 해야겠다.

profile
웰씽킹_나는 경쟁력을 갖춘 FE개발자로 성장할 것이다.

0개의 댓글