[사전 코스] Programmers - 3진법 뒤집기

Kim Hyen Su·2024년 3월 14일
0

⏲️ 알고리즘

목록 보기
85/95

3진법 뒤집기 : 문제 링크

보통 진법 문제는 기존의 2진법, 8진법, 10진법, 16진법의 변환 과정을 기반으로 구현되는 경우가 많습니다.

하지만, 매번 볼때마다 어떻게 구현했었는지 기억이 잘 안나고 구현하기 까다로운 문제 유형 중 하나였던 것으로 기억합니다.

이번주에도 해당 문제만 풀지 못하였는데 너무 아쉬웠던 찰나, 다른 팀원분의 기똥찬 코드를 발견하고 바로 블로그 포스팅하여 줍줍하게 됐습니다.ㅎㅎ

해당 문제에 대해 설명하면 우선 다음과 같습니다.

자연수 n이 매개변수로 주워지고, n을 3진법을 통해 앞뒤로 뒤집은 후, 10진법으로 표현한 수를 반환하도록 작성하는 알고리즘 문제입니다.

팀원분의 코드를 분석해보겠습니다.

import java.util.*;

class Solution {
    public int solution(int n) {
        int answer = 0;
        ArrayList<Integer> nList = new ArrayList<>();
        while (n!=0) {
            nList.add(n % 3);
            n /= 3;
        }

우선, 10진법을 3진법으로 변환하는 방식은 2진법과 동일합니다. 따라서 위처럼 n을 3으로 나눈 뒤 나머지 값을 nList에 담아주고, n을 3으로 나눈 몫으로 초기화해주는 방식으로 구현하였습니다.

        Collections.reverse(nList);
        
        for (int i = 0; i <nList.size(); i++) {
            answer += nList.get(i) * Math.pow(3,i);
        }
        return answer;
    }
}

Collections는 Collection 관련 유틸리티 클래스로 유용한 메서드들을 가지고 있습니다. 위에서는 reverse() 를 통해 현재 리스트를 반전하도록 하였습니다.

이는 문제에서 3진법 상에서 앞뒤로 뒤집으라는 조건에 따라 구현한 것입니다.

그 다음 리스트 요소를 순회하여 요소의 값에 Math.pow(3,i) 를 사용하여 3의 제곱한 값을 곱해주도록 구현하였습니다.

여기서 Math.pow(int a, int b)는 a가 밑, b가 지수인 제곱된 수를 구할 때 사용하는 수학적 메서드입니다.

👍 성공

import java.util.*;

class Solution {
    public int solution(int n) {
        int answer = 0;
        ArrayList<Integer> nList = new ArrayList<>();
        
        while (n!=0) {
            nList.add(n % 3);
            n /= 3;
        }
        
        Collections.reverse(nList);
        
        for (int i = 0; i <nList.size(); i++) {
            answer += nList.get(i) * Math.pow(3,i);
        }
        return answer;
    }
}

덕분에 정말 값진 코드를 얻고 이해할 수 있게 됐습니다.👍👍

profile
백엔드 서버 엔지니어

0개의 댓글