일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- HTML
- webpack
- node.js
- frontend
- media query
- TypeScript
- max-width
- java
- node
- @media
- 코드업
- JS
- 코딩테스트
- 자바문제풀이
- 그럼에도불구하고
- github
- 그럼에도 불구하고
- react
- Servlet
- CSS
- cleancode
- 반응형 페이지
- 프론트엔드
- JavaScript
- redux
- 변수
- 자바
- coding
- react-router-dom
- git
- Today
- Total
그럼에도 불구하고
[CodeUP] 코드업 6081번 16진수 곱셈 본문
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이 된다.
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 배열에 값을 담아준다.
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
2-2. 나머지 값이 9보다 작을 경우
그대로 곱하여 출력
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 입력 시 결과
F 입력시 결과
결과 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];
위의 경우, 같은 코드를 중복하여 사용했다.
한 번만 써서 해결하고 싶지만, 지금은 잘 생각나지 않는다.
한번만 쓰는 방식으로 바꾸거나 완전히 다른 방식으로 풀어보고 싶다.
지금은 더 좋은 방법이 떠오르지는 않지만,
다음에 다시 풀어볼 것이다.
다시 풀면 글을 수정해서 올려야겠다.
'Java, Servlet > Java question' 카테고리의 다른 글
[CodeUP] 코드업 6080번 주사위 경우의 수 구하기 (0) | 2022.09.26 |
---|---|
[CodeUp] 코드업 6079번 입력값과 같거나 작을 때까지만 정수합 구하기 (0) | 2022.09.26 |
[CodeUP] 코드업 6078번 소문자 입력받기 (0) | 2022.09.25 |
[CodeUp] 코드업 6077번 짝수 합 구하기 (0) | 2022.09.25 |