[백준 11005번] 진법 변환 2
백준알고리즘 11005번 : 진법 변환 2
처음 제시된 x값 10진수 숫자를 y진수로 변환하는 문제이다.
처음에는 시간초과가 났다. 왜 그런 것인지 고민해보니,
while문을 두번씩 돌리려고 하다보니 발생한 것이라는 결론이 났다.
이를테면 1234를 2진수로 바꾸려고 할때,(10011010010)
나는 이 2진수의 길이를 찾기 위해 while문을 돌리고,
1234에서 2의 10승인 1024를 빼고,
남은 숫자에서 2의 9승을 빼보고
...
이런식으로 하여 while문을 두 번씩 돌렸던 것이다. for문은 덤이다.
비효율적인 풀이 방식이라고 생각은 했었으나..
아무튼 결국엔 아랫자리부터 뽑아내야하는 것이다.
헷갈릴때는 10진수의 숫자를 다시 10진수로 변환하는 것 처럼 생각해보면 편하다.
1234는,
1. 10으로 나눈 나머지값(4)을 추출한다.
2. 1234를 10으로 나누어 버린다. [1234 => 123]
3. 10으로 나눈 나머지값(3)을 추출한다.
4. 123을 10으로 나누어 버린다. [123 => 12]
5. 10으로 나눈 나머지값(2)을 추출한다.
6. 12를 10으로 나누어 버린다. [12 => 1]
7. 10으로 나눈 나머지값(1)을 추출한다.
8. 1을 10으로 나누어 버린다. [1 => 0]
로직은 10진법이든, 35진법이든 동일하다.
그저 이 process에 기반하면 된다.
풀이 과정
1. n과 b를 받고, character type의 list를 선언한다.
2. n이 0이 될때까지 while문을 돌리고, n에서 b를 나눈 나머지 값을 list에 담는다.
또한, n을 b로 나누어준다. 자동으로 나머지 값도 절삭된다.
3. list에는 작은 자리숫자부터 담겼을 것이므로, 반대 순서로 출력한다.
소스 ▽
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {// 11005번 진법 전환 2
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
int y = sc.nextInt();
List<Character> lst = new ArrayList<>();
while (x > 0) {
if (x % y < 10)
lst.add((char) (x % y + '0'));
else
lst.add((char) (x % y - 10 + 'A'));
x /= y;
}
for (int i = lst.size() - 1; i >= 0; i--)
System.out.print(lst.get(i));
}
}