프로그래머스_점프와 순간 이동

LeeYulhee·2023년 9월 20일
0

💻 문제 출처 : 프로그래머스_점프와 순간 이동

👉 내가 작성한 답


public class Solution {
    public int solution(int n) {
        
        int answer = 0;
        
        while(n != 0) {
            if(n % 2 == 0) {
                n /= 2;
            } else {
                n--;
                answer++;
            }
        }
        
        return answer;
    }
}
  • 📌 접근 방식
    • n을 2로 최대한 많이 나눠서 0을 만들어야 함
    • 2로 나눴을 때 나머지가 없다면 n을 2로 나누고, 나머지가 있다면 -1을 해준 뒤 count하는 걸 반복
  • 📌 문제 풀이 설명
    • int 변수 answer를 선언하고 0으로 초기화
    • while문으로 n이 0과 같지 않은 경우 순회
      • 만약 n 을 2로 나눈 나머지가 0과 같다면
        • n에 n / 2를 대입
      • 그게 아니라면
        • n을 1 감소
        • answer 1 증가
    • while문 종료 후 return answer



👉 다른 사람이 작성한 답 - 1


public class Solution {
    public int solution(int n) {
        
        int answer = 0;

        for(char c : Integer.toBinaryString(n).toCharArray()) {
            if (c == '1') answer++;
        }
        
        return answer;
    }
}
  • 📌 접근 방식
    • 2씩 나누는 게 결국엔 왼쪽으로 한 칸씩 쉬프트 연산을 하는 것과 같음
    • 이 과정에서 첫째 자리에 1이 있으면 홀수가 되니까 그냥 1 개수를 카운트하면 점프해야 하는 수가 나옴
  • 📌 문제 풀이 설명
    • int 변수 answer를 선언하고 0으로 초기화
    • 향상된 for문으로 n을 이진수로 변환한 String을 char 배열로 바꿔서 순회
      • 만약 해당 요소(char)가 ‘1’과 같다면 answer 1 증가



👉 다른 사람이 작성한 답 - 2


public class Solution {
    public int solution(int n) {
        int sub = 1;
        int ans = 0;
        while(n != 0){
            if(n % 2 == 1){
                n -= sub;
                ans += 1;
            }
            n /= 2;
        }
        return ans;
    }

}
  • 📌 접근 방식
    • 내가 푼 방식이랑 비슷한데, 1을 빼면 무조건 짝수니까 한 반복에서 1을 빼주고 2로 나눠주기까지 함
  • 📌 문제 풀이 설명
    • int 변수 sub를 선언하고 1로 초기화
    • int 변수 ans를 선언하고 0으로 초기화
    • while문으로 n이 0과 같지 않은 경우 순회
      • 만약 n을 2로 나눈 나머지가 1과 같다면
        • n에서 sub를 뺀 수를 n에 대입
        • ans에 1 증가
      • n에 n / 2를 대입
    • while문 종료 후 return ans
profile
공부 중인 신입 백엔드 개발자입니다

0개의 댓글