인사이트
[JAVA] int값 뒤집기 본문
num의 값 123456789를 뒤집어서 987654321을 만들어보자!
int num = 123456789;
int reverse = 0;
while (num != 0) {
int digit = num % 10;
reverse = reverse * 10 + digit;
num /= 10;
}
System.out.println(reverse);
계획
1. 123456789를 끝에서부터 한 개씩 자른다
2. 잘려진 숫자를 맨 앞에 차례대로 위치시킨다
어떻게 끝에 숫자를 가져올 수 있을까?
num을 10으로 나눈 나머지를 가져오면 된다.
무슨 말이냐면
123456789를 10으로 나누면 몫이 123456780이고 나머지가 9가 된다.
그래서 나머지를 가져온다는 건 마지막 자리 숫자를 가져오겠다는 말과 같은 말이 된다.
이제 그 숫자를 어떻게 맨 앞으로 가져올 수 있을까?
reverse에 10을 곱하고 내가 가져온 마지막 숫자를 더한다
이게 뭘 하는 코드냐면
마지막에 가져온 숫자를 앞자리부터 채워주는 코드이다
왜 그렇게 되는가? (계속 마지막 숫자를 가져올 수 있다는 가정하에 계산해보자면)
reverse(9) = reverse(0) * 10 + 9 = 9
reverse(98) = reverse(9) * 10 + 8 = 98
reverse(987) = reverse(98) * 10 + 7 = 987
reverse(9876) = reverse(987) * 10 + 6 = 9876
reverse(98765) = reverse(9876) * 10 + 5 = 98765
reverse(987654) = reverse(98765) * 10 + 4 = 987654
reverse(9876543) = reverse(987654) * 10 + 3 = 9876543
reverse(98765432) = reverse(9876543) * 10 + 2 = 98765432
reverse(987654321) = reverse(98765432) * 10 + 1 = 987654321
이렇게 되기 때문에 맨 앞자리부터 채워준다고 했던 것이다.
맨 위에서 이미 맨 마지막 숫자9를 가져왔던 것처럼 이제 8을 가져올 차례이다.
그건 어떻게 해야할까?
마지막이 12345678로 끝나야 다시 나머지를 8로 만들어서 가져올 수 있지 않을까?
그렇게 하기 위해서 num을 10으로 나눠준다
123456789 을 10으로 나누면 몫이 12345678*이 되기 때문이다.
* int형 타입은 딱 정수만을 나타내기 때문에(소수점은 버림) 몫만 가져오는 게 된다
그리고 이걸 반복해주면 된다.
근데 언제까지 반복해줘야할까?
num이 0.1*이 되기 전까지만 하면 된다.
* 0.1은 num이 123456789 → 1로 남았을 때 1을 10으로 나눈 값이다
그래서 그냥 간단하게 0이 아닌 정수일 동안 작업을 수행하라는 의미인 num != 0을 while의 조건으로 걸어준 것이다
'JAVA' 카테고리의 다른 글
[JAVA] 클래스의 구성요소 (0) | 2021.06.03 |
---|---|
[JAVA] 향상된 for문 (0) | 2021.06.02 |
[JAVA] int배열 정렬 (오름차순, 내림차순) (0) | 2021.06.02 |
[JAVA] int배열의 합과 평균 구하기 (0) | 2021.06.02 |
[JAVA] 정리 1 (0) | 2021.05.31 |