티스토리 뷰

💻C언어 코드 바로보기

💻JAVA 코드 바로보기

 

 

문제 설명

자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.


제한사항

  • n은 10,000,000,000이하인 자연수입니다.

입출력 예

n return
12345 [5,4,3,2,1]

 

 


🌼C언어 알고리즘

 

초기화면

 

 

 

malloc 사이즈 지정하기

각 자릿수를 구하여 배열에 넣는 알고리즘은 간단하지만,
malloc의 사이즈를 입력받은 숫자의 자릿수만큼 지정하고 싶어서

여러가지,,? 를 도전해보았다

▶int* answer = (int*)malloc(sizeof(int));

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int* solution(long long n) {
    // 리턴할 값은 메모리를 동적 할당해주세요.
    int* answer = (int*)malloc(sizeof(int));
    int i=0;
    while(n>0){
        answer[i] = n%10;
        n/=10;
        i++;
    }
    
    return answer;
}

 

 

 

▶int* answer = (int*)malloc(sizeof(int)*(size+1));

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int* solution(long long n) {
    // malloc 전에 길이 구하기
    int size=0;
    int size_n = n;
    while(size_n>0){
        size++;
        size_n/=10;
    }
    
    
    int* answer = (int*)malloc(sizeof(int)*(size+1));
    int i=0;
    while(n>0){
        answer[i] = n%10;
        n/=10;
        i++;
    }
    
    return answer;
}

 

 

완성 코드

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int* solution(long long n) {
    // 리턴할 값은 메모리를 동적 할당해주세요.
    int* answer = (int*)malloc(sizeof(int)*11);
    int i=0;
    while(n>0){
        answer[i] = n%10;
        n/=10;
        i++;
    }
    
    return answer;
}

▲자바 풀고나서 알았는데,, 문자열로 바꾼 후 그 길이로 malloc지정을 해도 괜찮을 듯 하다

 

 

 

 

코드 분석

단계 과정
변수와 배열 선언 각 자리의 값을 저장할 배열 answer
배열에 값을 추가할 때마다 다음 방으로 옮겨줄 인덱스  i
while n이 0보다 클 동안 반복한다
끝 자리수 배열에 할당하기 answer의 i방에 n의 일의 자리 수 n%10을 할당한다.
다음 자리수로 넘어가기 n = n/10을 진행하여
십의자리 -> 일의자리 와 같이 되게 한다.
예시 n = 456;

answer[0] += 456%10;   // answer[0] == 6
n = 456/10;    // n == 45

answer[1] += 45%10;    // answer[1] == 5
n = 45/10;      // n == 4

answer[2] += 4%10;    // answer[2] == 4
n = 4/10;      // n == 0

반복 종료

 

 

최종 결과

 

 

 

 


🌼JAVA 알고리즘

 

초기화면

 

 

 

 

배열 사이즈 동적할당하기

위의
▶int* answer = (int*)malloc(sizeof(int)*(size+1));
코드 방식이 자바에서는 되려나 해봣으나,,,
class Solution {
    public int[] solution(long n) {
        int size=0;
        int size_n = (int)n;
        while(size_n>0){
            size++;
            size_n/=10;
        }
                
        int[] answer = new int[size];
        
        int index = 0;
        while(n>0){
            answer[index] = (int)n%10;
            n/=10;
            index++;
        }
        
        return answer;
    }
}

실패!

그런데 정수형의 길이를 구하는 함수를 찾아보다가,
Math.log10() 함수를 발견했다! 

🔗Oracle Method / Math / Log

🔗Log를 이용하여 자리수 구하기 

 

 

 

완성 코드

class Solution {
  public int[] solution(long n) {
        int length = (int)( Math.log10(n)+1 );
        int[] answer = new int[length];
        int cnt=0;
 
        while(n>0) {
            answer[cnt]=(int)(n%10);
            n/=10;
            cnt++;
        }
      return answer;
  }
}

 

 

 

 

코드 분석

단계 과정
변수와 배열 선언 각 자리의 값을 저장할 배열 answer
배열에 값을 추가할 때마다 다음 방으로 옮겨줄 인덱스  i
매개변수 n의 길이 구하기 (int)( Math.log10(n)+1 ) 

Math함수를 이용하여 숫자의 길이를 구한다.
while n이 0보다 클 동안 반복한다
끝 자리수 배열에 할당하기 answer의 i방에 n의 일의 자리 수 n%10을 할당한다.
다음 자리수로 넘어가기 n = n/10을 진행하여
십의자리 -> 일의자리 와 같이 되게 한다.
예시 n = 456;

answer[0] += 456%10;   // answer[0] == 6
n = 456/10;    // n == 45

answer[1] += 45%10;    // answer[1] == 5
n = 45/10;      // n == 4

answer[2] += 4%10;    // answer[2] == 4
n = 4/10;      // n == 0

반복 종료

 

 

 

 

 

 

 


링크

 

코딩테스트 연습 - 자연수 뒤집어 배열로 만들기

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

programmers.co.kr

 

About Me

💻GitHub/KimSky904 KimSky904 - Overview Department of New Media Software. KimSky904 has 8 repositories available. Follow their code on GitHub. github.com

code-review.tistory.com

 

댓글