일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- JPA
- post
- AOP
- STREAM
- 액세스회선
- Linux
- Pipeline
- gradle
- 캐시서버
- sonarQube
- container
- Jenkins
- ansible
- DevOps
- cloud
- map
- tomcat
- 방화벽
- jdk
- Java
- 소켓
- IntelliJ
- mybatis
- 허브
- LAN어댑터
- Set
- Collection
- 라우터
- docker
- Spring
- Today
- Total
거북이-https://velog.io/@violet_evgadn 이전완료
N 진법 본문
코딩 테스트 시 필요한 이유
처음에는 진법으로 변환하는 메서드가 너무 간단하기도 하고 나누기를 통해 N진법 수로 변환하는 함수를 만들면 된다고 생각해 정리할 필요 없다고 생각하였다.
그런데 생각보다 코딩 문제에 "N진법으로 바꾸는 문제"가 많았다.
이때마다 N진법을 만드는 방법을 검색하는 것도 귀찮았고 한 번 정리해놔야 다음에는 검색하지 않고서도 사용할 수 있기에 한 번 정리하도록 하겠다.
int형 데이터 N진법으로 표현
Integer.toString(int i, int radix) // 숫자 i를 radix진법으로 변환
int형 데이터를 N진법으로 변환하는 방법은 이미 Java 내에 구현되어 있다.
물론 Integer.toBinaryString(), Integer.toHexString() 같은 특정 진법으로 변환하는 메서드도 존재하긴 하지만, 위에 기입한 메서드가 이 모든 것을 담을 수 있기에 1개만 외우도록 하자.
위 코드처럼 Integer.toString(int i, int radix)를 입력하면 Integer 데이터 i를 radix에 지정된 값의 진법으로 변환해준다.
2진법으로 변환하려면 Integer.toString(x, 2), 14진법으로 변환하려면 Integer.toString(x, 14)로 변환하면 된다.
"toString()" 메서드에서 유추할 수 있듯이 진법으로 변환한 결과는 String형 데이터로 반환된다.
코드를 통해 정상적으로 동작하는지 알아보자.
Random random = new Random();
for(int i =0;i<5;i++) {
int randomNum = random.nextInt(100);
int randomRadix = random.nextInt(10);
System.out.println(randomNum+"을 "+randomRadix+"진법으로 변환 : "
+Integer.toString(randomNum, randomRadix));
}
직접 계산을 해 수를 변환해보면 변환 결과가 일치함을 확인할 수 있다.
N진법 데이터 int형 데이터로 변환
Integer.parseInt(String s, int radix) // radix진법으로 표현된 s를 int 데이터로 변환
N진법 데이터를 int형 데이터로 변환하는 것 또한 위 메서드만 알고 있으면 된다.
int형 데이터는 toString() 메서드를 통해 String 데이터로 변환했다면, N진법 데이터는 String Type 데이터를 pareInt의 Parmeter로써 넣어줘야 int형 데이터로 반환받을 수 있다.
사용 방법은 비슷하다. radix 진법으로 표현된 String s를 int형 데이터로 변환하는 것으로써 Integer.parseInt(String s, int radix) 방식으로 사용하면 된다.
코드를 통해 정상적으로 동작하는지 알아보자.
Random random = new Random();
for(int i =0;i<5;i++) {
String randomNum = random.nextInt(1000)+ "";
Object[] c = Arrays.stream(randomNum.split("")).sorted((s1, s2) -> s2.compareTo(s1)).toArray();
int max = ((String) c[0]).charAt(0) - '0';
int radix = random.nextInt(10) + max + 1;
System.out.println(radix+"진법으로 표현된 수 "+randomNum+"을 10진법 수로 표현 : "
+Integer.parseInt(randomNum,radix));
}
코드가 좀 복잡한 이유가 있다.
2진법으로 표현한 "234"를 숫자로 바꿔보자.
....????? 2진법인데 어떻게 234가 존재할 수 있지?
이런 상황을 막기 위해 radix를 정하는데 추가적인 로직이 들어가야 한다. 바로 String의 수 중 가장 큰 수를 선택하여 최소한 그 수보다는 큰 값으로 radix를 설정해줘야 하는 것이다.
이런 과정을 거치면 결과가 제대로 출력되는 것을 알 수 있다.
'코딩 테스트 시 알면 좋은 것들' 카테고리의 다른 글
문자열 뒤집기 (0) | 2023.01.03 |
---|---|
Compare 관련 메소드 (0) | 2022.12.31 |
log & 거듭제곱 (0) | 2022.12.30 |
Long & Int 범위 (0) | 2022.12.30 |
Stream을 활용한 Collection to Array & Array to Collection (0) | 2022.12.30 |