그럼에도 불구하고

👨‍💻

[CodeUP] 코드업 6081번 16진수 곱셈 본문

Java, Servlet/Java question

[CodeUP] 코드업 6081번 16진수 곱셈

zenghyun 2022. 9. 26. 00:55

6081번 

 

16진수(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F)를 배운
영일이는 16진수끼리 곱하는 16진수 구구단? 에 대해서 궁금해졌다.

A, B, C, D, E, F 중 하나가 입력될 때,
1부터 F까지 곱한 16진수 구구단의 내용을 출력해보자.
(단, A ~ F 까지만 입력된다.)

예시
...
  print('%X'%n, '*%X'% i, '=%X'%(n*i), sep='')
...

참고
print('%X'%n)    #n에 저장되어있는 값을 16진수(hexadecimal) 형태로 출력
작은따옴표 2개를 사용해서 print(..., sep='')으로 출력하면, 공백 없이 모두 붙여 출력된다.
작은따옴표 2개 '' 또는 큰 따옴표 2개 ""는 아무 문자도 없는 빈 문자열(empty string)을 의미한다.


입력
16진수로 한 자리 수가 입력된다.
단, A ~ F 까지만 입력된다.

출력
입력된 16진수에 1~F까지 순서대로 곱한, 16진수 구구단을 줄을 바꿔 출력한다.
계산 결과도 16진수로 출력해야 한다.

입력 예시   
B

출력 예시
B*1=B
B*2=16
B*3=21
B*4=2C
B*5=37
B*6=42

B*7=4D
B*8=58
B*9=63
B*A=6E
B*B=79
B*C=84
B*D=8F
B*E=9A
B*F=A5

 

체감 난이도: ★★★☆

 

 

우선, 문제를 풀기에 앞서 16진수 곱셈법을 알아야 한다.

 

16진수는  숫자가 0부터 15까지 표현될 수 있다.

 

단, 10부터는 A로 표시하며, 15는 F가 된다.

 

16진수 곱셈의 가장 쉬운 풀이는 16진수를 10진수로 변환하여 곱하고, 그 후에 다시 16진수로 변환하는 것이다.

 

 

예시 

 

 A (10)

  X     C(12)       

 ---------------   

를 구한다고 하자.

 

1. 16진수를 10진수로 변환 

A의 값은 10진수로 10이고, C의 값은 10진수로 12이다.

10 X 12 = 120

 

 

2. 10진수를 16진수로 변환

여기서, 120를 16으로 나눈다.

그러면 몫이 7, 나머지가 8가 된다.

 

즉, A X C = 78이 된다.

 

 


 

 

풀이 1

 

 

  Scanner로 값을 입력받아서 tx_alphabet이라는 변수에 값을 저장한다. 

 

char num[] = tx_alphabet.toCharArray();   

입력받은 값을 char 타입으로 바꾸고 배열로 값을 저장한다.

(Scanner로 입력받을 수 있는 데이터 타입은 int와 String밖에 없기 때문)

 

즉, 입력받은 값을 char로 변환하지 않는다면 알파벳을 정수로 표현할 수 없다.

 

int decimal = num [0] - 55; // A~F 알파벳을 10진수로

16진수 곱을 10진수로 바꿔야 하기 때문에 입력받은 알파벳 값을 정수로 바꿔준다.만약 입력값이 A라면, 

 

아스키코드
A = 65
B = 66
C = 67
D = 68
E = 69 
F = 70

 

decimal = num [0] - 55

(10진수로 변환)

 

그 다음 for문을 통해 1부터 15까지 반복하여 hexadecimal과 remainder 배열에 값을 담아준다.

 


풀이 2

        

 

for문을 통해 1부터 15까지 반복하여 16진수 곱셈을 진행한다.

 

1. 곱하는 값이 1일 경우

 

입력받은 알파벳 값을 그대로 출력한다. 

 

 

2. 곱하는 값이 2이상 9이하일 경우

 

2-1. 나머지 값이 9보다 클 경우

 

곱한 값을 10진수에서 16진수로 변환하는 과정에서

나머지 값이 9보다 큰 경우가 발생한다. 

이 경우에서 다시 10진수를 16진수로 바꿔서 표현해줘야 한다. 

 

remainder [j] += 55;
char re_change1 = (char) remainder [j]; 

명시적 형 변환 (Demotion Casting) 

10진수 -> 16진수 변환

 

https://despiteallthat.tistory.com/4

 

[JAVA][형변환(Casting)] 형변환이란 무엇인가?

형 변환이란 말 그대로 변수나 상수의 데이터 타입을 다른 타입으로 바꾸는 것을 말한다. 형 변환에는 자동 형변환(Promotion Casting)과 명시적 형 변환 (Demotion Casting)이 있다. 자동 형변환(Promotion Cas

despiteallthat.tistory.com

 

2-2. 나머지 값이 9보다 작을 경우

그대로 곱하여 출력

 


 

풀이3

1. 곱하는 값이 10 이상일 경우 

 

1-1. 16으로 나눈 몫이 10이상일 때

 

hexadecimal [j] += 55;
char re_change2 = (char) hexadecimal [j];

명시적 형 변환 (Demotion Casting) 

10진수 -> 16진수 변환

 

 

1-2. 나머지 값이 10 이상일 때

 

remainder [j] += 55;
char re_change1 = (char) remainder [j]; 

명시적 형 변환 (Demotion Casting) 

10진수 -> 16진수 변환

 

 

1-3. 1-1과 1-2의  제외

그대로 곱하여 출력

 

alphabet += 1; // A ~ F 출력 

10 이상의 값을 곱할 때 A ~ F까지 출력

 

 


결과

 

 

B 입력 시 결과

결과1

 

F 입력시 결과

결과2

 

결과 1의 경우 앞자리가 10 이상이 나오지 않기 때문에 

앞자리가 10 이상이 나오는 F를 입력하여 결괏값 표현

 

 


 

후기

 

이번 문제는 아쉬움이 많이 남는다. 

 

 

1. char num [] = tx_alphabet.toCharArray();

 

처음에 이 코드를 생각하지 못해 애를 많이 먹었다. 

알파벳 값을 입력받는 게 아닌, 정수로 값을 입력받고 ( 65 ~ 70 입력 )

형 변환하여 값을 출력할 수 있었지만, 알파벳을 입력받고 싶었기 때문이다.

 

그래도 해결해서 다행이다.

 

 

2. 너무 많은 조건문

 

1부터 15까지 값을 입력받으면서 너무 많은 조건문을 사용해

가독성이 크게 떨어지는 것 같다. 

 

생각 -> 코딩 이 아닌

코딩 -> 결괏값 확인 -> 생각을 하면서 풀었다. 

 

고민을 하면서 푼 건 맞지만, 

과정이 좋지 못하고 결과만 출력한 기분이다. 

 

 

3. 반복되는 코드

 

remainder [j] += 55;
char re_change1 = (char) remainder [j]; 

위의 경우, 같은 코드를 중복하여 사용했다.

한 번만 써서 해결하고 싶지만, 지금은 잘 생각나지 않는다. 

한번만 쓰는 방식으로 바꾸거나 완전히 다른 방식으로 풀어보고 싶다.

 

 

 

지금은 더 좋은 방법이 떠오르지는 않지만, 

다음에 다시 풀어볼 것이다.

 

다시 풀면 글을 수정해서 올려야겠다.

 

 

Comments