그럼에도 불구하고

👨‍💻

[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