[프로그래머스] 자연수 뒤집어 배열로 만들기

2024. 10. 14. 00:53·여러가지/알고리즘 & 자료구조

문제 설명
자연수 n이 주어졌을 때, 이 숫자를 뒤집어 각 자리 숫자를 배열의 원소로 가지는 배열을 반환하는 문제입니다. 예를 들어 n = 12345라면, 배열 [5, 4, 3, 2, 1]을 반환해야 합니다.


제한 조건

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

입출력 예

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

문제 풀이

이 문제는 주어진 자연수를 뒤집어 각 자릿수를 분리해 배열로 만드는 문제입니다. 이를 해결하기 위한 두 가지 접근 방법은 문자열로 변환하여 처리하거나, 수학적 계산을 이용하는 방식입니다.

1. Python 코드 풀이

방법 1: 문자열 변환 후 리스트로 변환

def solution(n):
    return [int(digit) for digit in str(n)[::-1]]

# 테스트 예시
print(solution(12345))  # 출력: [5, 4, 3, 2, 1]

코드 설명

  1. str(n)을 사용하여 숫자 n을 문자열로 변환합니다.
  2. 문자열을 [::-1]로 뒤집습니다.
  3. 리스트 컴프리헨션을 통해 각 문자를 int로 변환하여 배열로 반환합니다.

방법 2: 수학적 접근 (나머지 연산 사용)

def solution(n):
    result = []
    while n > 0:
        result.append(n % 10)  # n의 마지막 자릿수를 추가
        n //= 10               # n을 10으로 나눠서 마지막 자릿수 제거
    return result

# 테스트 예시
print(solution(12345))  # 출력: [5, 4, 3, 2, 1]

코드 설명

  1. 빈 리스트 result를 생성합니다.
  2. n이 0이 될 때까지 반복문을 돌면서 n % 10을 사용하여 마지막 자릿수를 구해 리스트에 추가합니다.
  3. n //= 10을 통해 n을 10으로 나눠 마지막 자릿수를 제거합니다.
  4. 모든 자릿수를 처리한 후, 리스트 result를 반환합니다.

2. Java 코드 풀이

방법 1: 문자열을 이용한 풀이

import java.util.ArrayList;
import java.util.List;

class Solution {
    public int[] solution(long n) {
        String str = Long.toString(n);  // 숫자를 문자열로 변환
        int[] result = new int[str.length()];  // 결과 배열 선언

        // 문자열을 거꾸로 순회하며 결과 배열에 저장
        for (int i = 0; i < str.length(); i++) {
            result[i] = str.charAt(str.length() - 1 - i) - '0';
        }

        return result;
    }

    public static void main(String[] args) {
        Solution sol = new Solution();
        int[] result = sol.solution(12345L);
        for (int num : result) {
            System.out.print(num + " ");
        }
    }
}

코드 설명

  1. Long.toString(n)을 사용해 n을 문자열로 변환합니다.
  2. 문자열의 길이만큼 int 배열을 선언합니다.
  3. 문자열을 뒤에서부터 순회하면서 각 문자를 숫자로 변환한 후 배열에 저장합니다.
  4. 최종적으로 결과 배열을 반환합니다.

방법 2: 수학적 접근

import java.util.ArrayList;

class Solution {
    public int[] solution(long n) {
        ArrayList<Integer> list = new ArrayList<>();

        // n이 0보다 클 때까지 반복
        while (n > 0) {
            list.add((int) (n % 10));  // 마지막 자릿수를 리스트에 추가
            n /= 10;                   // n을 10으로 나눠서 자릿수를 줄임
        }

        // 리스트를 배열로 변환하여 반환
        return list.stream().mapToInt(i -> i).toArray();
    }

    public static void main(String[] args) {
        Solution sol = new Solution();
        int[] result = sol.solution(12345L);
        for (int num : result) {
            System.out.print(num + " ");
        }
    }
}

코드 설명

  1. ArrayList를 생성하여 각 자릿수를 저장합니다.
  2. n % 10으로 마지막 자릿수를 구해 리스트에 추가하고, n /= 10으로 자릿수를 제거합니다.
  3. 리스트에 저장된 값을 배열로 변환한 후 반환합니다.

3. 시간 복잡도 분석

  • 시간 복잡도: 입력된 숫자의 자릿수를 d라고 했을 때, 숫자의 각 자릿수를 처리하므로 O(d)입니다.
    • n이 최대 10,000,000,000이라면 최대 10자리 숫자이므로, 10회 반복됩니다.

결론

이 문제는 숫자를 문자열로 변환하여 쉽게 풀 수 있으며, 수학적인 방법을 사용해서도 해결할 수 있습니다. Python과 Java 모두에서 각각의 방식으로 효율적으로 처리할 수 있으며, 시간 복잡도는 숫자의 자릿수에 비례하여 O(d)입니다.

저작자표시 (새창열림)

'여러가지 > 알고리즘 & 자료구조' 카테고리의 다른 글

[프로그래머스] 정수 제곱근 판별  (1) 2024.10.14
[프로그래머스] 정수 내림차순으로 배치하기  (1) 2024.10.14
[프로그래머스] 문자열 내 p와 y의 개수  (1) 2024.10.14
[프로그래머스] 약수의 합  (0) 2024.10.13
[프로그래머스] 자릿수 더하기  (1) 2024.10.13
'여러가지/알고리즘 & 자료구조' 카테고리의 다른 글
  • [프로그래머스] 정수 제곱근 판별
  • [프로그래머스] 정수 내림차순으로 배치하기
  • [프로그래머스] 문자열 내 p와 y의 개수
  • [프로그래머스] 약수의 합
hyeseong-dev
hyeseong-dev
안녕하세요. 백엔드 개발자 이혜성입니다.
  • hyeseong-dev
    어제 오늘 그리고 내일
    hyeseong-dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (286) N
      • 여러가지 (107)
        • 알고리즘 & 자료구조 (72)
        • 오류 (4)
        • 이것저것 (29)
        • 일기 (1)
      • 프레임워크 (39)
        • 자바 스프링 (39)
        • React Native (0)
      • 프로그래밍 언어 (38)
        • 파이썬 (30)
        • 자바 (3)
        • 스프링부트 (5)
      • 컴퓨터 구조와 운영체제 (3) N
      • DB (17)
        • SQL (0)
        • Redis (17)
      • 클라우드 컴퓨팅 (2)
        • 도커 (2)
        • AWS (0)
      • 스케쥴 (65)
        • 세미나 (0)
        • 수료 (0)
        • 스터디 (24)
        • 시험 (41)
      • 트러블슈팅 (1)
      • 자격증 (0)
        • 정보처리기사 (0)
      • 재태크 (5)
        • 암호화폐 (5)
        • 기타 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    백준
    RDS
    프로그래머스
    EC2
    FastAPI
    파이썬
    Docker-compose
    Spring WebFlux
    Python
    취업리부트
    docker
    ecs
    AWS
    reactor
    OOP
    SAA
    자바
    그리디
    완전탐색
    시험
    celery
    DP
    Spring Boot
    #개발자포트폴리오 #개발자이력서 #개발자취업 #개발자취준 #코딩테스트 #항해99 #취리코 #취업리부트코스
    Redis
    spring
    항해99
    java
    mybatis
    WebFlux
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
hyeseong-dev
[프로그래머스] 자연수 뒤집어 배열로 만들기
상단으로

티스토리툴바