-
자리수 구하기 - 자료구조와 함께 배우는 알고리즘 입문(자바)컴퓨터 기초/알고리즘&자료구조 2021. 4. 13. 14:44
해당 포스팅은 "자료 구조와 함께 배우는 알고리즘 입문"이라는 책을 바탕으로 공부한 내용임.
양의 정수 자리수 구하기
위와 같이 메서드에 매개변수로 특정 숫자를 입력하면 해당 숫자의 자리수를 반환하는 문제다.
이전 세 개의 정수 중 가운데 값 구하는 문제처럼 사람이 보면 알기 쉽다.
근데 컴퓨터한테 해당 작업을 시킬 때는 좀 더 번거롭게 처리해줘야 한다.
우선 나는 이 문제를 보고 사람은 왜 이걸 보고 자리수를 금방 판단할 수 있을까 생각해봤다.
보통 사람들은 숫자의 개수를 보고 자리수를 판단한다.
137이라 가정하면 1/3/7 세 개의 숫자로 이뤄져있어서 세 자리 숫자다.
1000이라 가정하면 1/0/0/0 네 개의 숫자로 이뤄져있어서 네 자리 숫자다.
사람들이 생각하는 방식으로 식을 짜면 다음과 같다.
public static int split(int num){ String before = String.valueOf(num); // 매개변수로 전달 받은 숫자를 텍스트로 변환 String after []= before.split(""); // 텍스트를 분할해서 after 배열에 저장 return after.length; // 배열의 길이를 반환 }
매개 변수를 통해 전달 받은 숫자를 텍스트로 바꾼다.
그리고나서 해당 텍스트를 잘라서 배열에 하나씩 넣어준다.
그리고 나서 배열의 길이를 반환하면 그게 바로 자리수가 된다.
이게 일반적인 사람들이 생각하는 방식에 가장 가까운 방식으로 구현된 것이라 생각한다.
하지만 이 식의 문제점은 식이 너무 추상화되었단 것이다.
어떻게 사람들이 숫자를 분할해서 세어서 그 갯수만큼 자리수가 된다는 사실을 알고 있을까?
그것에 대한 설명이 안되있는 식이다.
위의 그림을 살펴보자.
1의 자리에서 2의 자리로 바뀌는 조건이다.
각 자리수에서 숫자가 10개가 차면 다음 자리수로 넘어가는 식이다.
그럼 위의 예시로 든 137과 1000을 이런식으로 분해해보자.
각 자리수별 숫자는 10의 제곱들과 연관을 가진다.
이게 가능한 이유는 바로 우리가 흔히 접하는 숫자들이 10진수이기 때문이다.
0~9의 숫자로 이뤄진 10진수는 9에서 한 개의 숫자가 더해지면 10으로 자리수가 변경된다.
이런 점을 이용해서 내가 생각한 방법은 매개변수로 전달된 정수를 10으로 계속 나눠주는 것이었다.
매개변수로 전달된 정수를 10으로 나누고, 나눈 몫을 10으로 나누고 그걸 0이 될때까지 반복되는 것이다.
이렇게하면 4자리 수는 0이 될때까지 4번의 연산이 수행되고, 3자리 수는 3번의 연산이 수행된다.
즉 양의 정수를 10으로 나누고 그 몫을 0이 될 때까지 나눈 연산 횟수가 자리수와 같아지는 것이다.
public static int split2(int num){ int time = 0; // 연산 횟수 // 매개변수로 전달된 정수가 0이 될때까지 정수를 계속 10으로 나누는 식 while(num > 0){ num = num/10; time++; } return time;
위의 설명을 바탕으로 내가 짠 코드는 다음과 같다.
매개 변수로 전달된 정수가 0이 될때까지 10으로 나눈 연산 횟수를 반환하는 식이다.
실제로 짜고나서 책의 정답을 보니 책에서 제시하는 답안도 이것과 동일했다.
'컴퓨터 기초 > 알고리즘&자료구조' 카테고리의 다른 글
정수합, 가우스 덧셈 - 자료구조와 함께 배우는 알고리즘 입문(자바) (2) 2021.04.12 최대값, 최소값, 중간값 구하기 - 자료구조와 함께 배우는 알고리즘 입문(자바) (0) 2021.04.12 알고리즘이란? - 자료구조와 함께 배우는 알고리즘 입문(자바) (0) 2021.04.12 알고리즘의 시간을 표현하기(시간복잡도 / Time Complexity) (0) 2020.07.21 알고리즘 - merge sort (합병정렬) (0) 2020.07.21