[프로그래머스 코딩테스트 연습문제] 3진법 뒤집기 | 알고리즘 설명 & 문제 풀이 with 자바스크립트(Javascript)

Re_Go·2024년 1월 1일
0

코딩테스트연습

목록 보기
59/98
post-thumbnail
post-custom-banner

1. 문제 설명

2. 제한사항

3. 입출력 예

4. 입출력 예 설명

5. 첫번째 문제 풀이(2023-12-30)

이번 문제는 3진법에 대해 잘 몰라서 검색을 해봤는데 말 그대로 각 자리수가 0부터 2까지 총 세 개의 정수로 변환을 하는 형태라고 하네요.

그래서 일단 10진법을 정수로 변환하는 부분은 해당 정수를 3으로 나눈 나머지를 저장하고, 다시 그 몫을 3으로 나누어 몫이 0이 될 때 까지 진행을 하여 3진법에 해당하는 숫자를 도출해 낸 후 다시 그 3진법을 역으로 돌린 후 (split 후 reverse) 각 자리의 값에 3의 i번째 승을 곱하여 누적시킨 값을 반환시켰습니다.

중요한건 우리가 알고있는 진법의 변환 결과가 알고리즘에서 생각한 진법의 결과가 다르게 나온다는 것이었습니다. 가령 45를 3진법으로 나누면 0021(왼쪽부터 나머지를 누적) 가 나오는데, 보통은 1200 이라고 하잖아요? 우리는 진법을 변환할 때에는 오른쪽이 0의 자리부터 시작을 하는데에 반해 컴퓨터는 왼쪽으로 계산을 하니까 다르게 나타나더라고요.

그렇다고 해서 잘못된건 아니고, 그저 방향만 바뀌었다보니 도출된 3진법 값을 역으로 바꾸어 준 후 각 자리의 값을 3의 자리승으로 곱하는 양상에는 변함이 없었습니다.

function solution(n) {
   
    let convert = ""; // 3진법으로 각 자리수를 변환한 값을 저장할 convert 변수
    while(n > 0){
        const remain = n%3; // 남은 값을 remain에 저장
        n = Math.floor(n/3); // n에는 n/3의 몫을 저장
        convert += remain; // remain의 값을 convert에 누적
    }    
   
    convert  = convert.split('').reverse().join(''); //convert를 반대로 뒤집음

    let result = 0; // 3 to 10으로 변환한 값을 누적 저장

    for(let i = 0 ; i < convert.length ; i++){
        result += (Number(convert[i]) * (3 ** i)) //3의 각 i승에 convet의 각 i자리의 값을 Number로 변환하여 곱한 후 result에 누적 저장
    }
    return result; // return 반환
}
profile
인생은 본인의 삶을 곱씹어보는 R과 타인의 삶을 배워 나아가는 L의 연속이다.
post-custom-banner

0개의 댓글