본문 바로가기
Programming/Cos Pro 1급

Cos Pro 1급 - 샘플 문제 5차 6번 - p진법 수를 q진법 수로 변환하기

by 우공80 2022. 11. 13.
728x90

p진법 수를 q진법 수로 변환하기

문제 지문 #6


p 진법으로 표현한 수란, 각 자리를 0부터 p-1의 숫자로만 나타낸 수를 의미합니다. p 진법으로 표현한 자연수 두 개를 더한 결과를 q 진법으로 표현하려 합니다.

예를 들어, 3진법 수 112001과 12010을 더한 결과를 8진법으로 나타내면 1005입니다.

solution 메서드의 매개변수로 p 진법 자연수를 담은 문자열 s1, s2와 두 수를 나타내는 진법의 기수 p, 두 수의 덧셈 결과를 표현할 진법의 기수 q가 매개변수로 주어집니다. p진법으로 표현된 두 수를 더한 결과를 q 진법으로 나타낸 값을 return 하도록 solution 메서드를 완성해주세요.


#####매개변수 설명

p 진법으로 자연수를 담은 문자열 s1, s2와 두 수를 표현한 진법의 기수 p, 두 수의 덧셈 결과를 표현할 진법의 기수 q가 solution 메서드의 매개변수로 주어집니다.

  • p와 q는 2 이상 10 이하인 자연수입니다.
  • s1과 s2의 길이는 1 이상 9 이하입니다.
  • s1과 s2의 원소는 '0', '1', '2', …, ‘p-1’로만 구성됩니다.
  • s1이나 s2가 ‘0’인 경우는 주어지지 않습니다.

#####return 값 설명

두 수를 더한 결과를 q 진법으로 나타낸 값을 문자열로 return 합니다.


#####예시

s1 s2 p q return
"112001" "12010" 3 8 "1005"

#####예시 설명

문제에 나온 예와 같습니다.

728x90

 

혼자 풀이


전체를 완성하는 문제입니다.
문자열로 이루어진 숫자 s1, s2의 각 자리 숫자에 p의 제곱수를 곱하고 answer에 값을 더해서
두 수의 합을 10진법으로 변환하였습니다.

그리고 이것을 다시 q진법으로 변환하였습니다. 

// 다음과 같이 import를 사용할 수 있습니다.
import java.util.*;

class Main {	
    public String solution(String s1, String s2, int p, int q) {
        // 여기에 코드를 작성해주세요.
        String answer = "";

        int answerNum =0;
        //s1,s2를 10진수로 변경해서 answerNum에 더한다.
        for(int i=0;i<s1.length();i++){										
        	answerNum+=(s1.charAt(i)-'0') * Math.pow(p,(s1.length()-i-1));					

        }
        for(int i=0;i<s2.length();i++){
        	answerNum+=(s2.charAt(i)-'0') * Math.pow(p,(s2.length()-i-1));					
        }
        int tmp=answerNum;
        while(true){
            answer=Integer.toString(tmp%q)+answer;
            tmp=tmp/q;	
            if(tmp<q){
                answer=Integer.toString(tmp)+answer;
                break;						
            }
        }
    return answer;
}
    // 아래는 테스트케이스 출력을 해보기 위한 main 메소드입니다.	
    public static void main(String[] args) {
    	Main sol = new Main();
    	String s1 = new String("112001");
        String s2 = new String("12010");
        int p = 3;
        int q = 8;
    	String ret = sol.solution(s1, s2, p, q);
        
        // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
        System.out.println("solution 메소드의 반환 값은 \"" + ret + "\" 입니다.");
   }
}

 

정답


제가 푼 것과 차이가 많은데요.

1. 우선 저는 s1, s2를 charAt()으로 하나씩 가져와서 ascii 코드를 계산해서 숫자로 변환했습니다. 반면에, 정답에서는 별도 함수를 만들어서 변경했습니다.

2. 10진법으로 변환하는 함수와 q진법으로 변환하는 함수도 차이가 있습니다.
10진법으로 변환하는 함수는 for문을 하나만 쓰면서 그 안에서 인수를 두 개를 사용하여 계산했습니다. 

저는 for문 안에서 인수를 두개 이상 쓸 수 있다는 것을 처음 알았습니다.

3. q진법 변환은 재귀함수를 사용했습니다.

class Solution {
	int [] numbers_int = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
	char [] numbers_char = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
	
	int char_to_int(char ch) {
	    for (int i = 0; i < 10; i++)
	        if (ch == numbers_char[i])
	            return numbers_int[i];
		return 0;
	}
	
	char int_to_char(int val) {
		for (int i = 0; i < 10; i++)
			if (val == numbers_int[i])
				return numbers_char[i];
		return 0;
	}
	
	String convert_scale(int num, int q) {
		if (num == 0) return "";
		return convert_scale(num / q, q) + int_to_char(num % q);
	}

	public int parse_decimal(String s, int p) {
		int num = 0;
		for (int i = s.length() - 1, mul = 1; i >= 0; i--, mul *= p) {
			num += char_to_int(s.charAt(i)) * mul;
		}
		return num;
	}
	
    public String solution(String s1, String s2, int p, int q) {
    	int num1 = parse_decimal(s1, p);
    	int num2 = parse_decimal(s2, p);
    	String answer = convert_scale(num1 + num2, q);
    	return answer;
    }
}

 

실습은 아래 참고


2022.10.25 - [Programming/Cos Pro 1급] - Cos Pro 1급 공부 사이트 추천 - 구름 에듀(https://edu.goorm.io/)

 

Cos Pro 1급 공부 사이트 추천 - 구름에듀(https://edu.goorm.io/)

구름 EDU??? YBM 공식 사이트에서 받은 문제 지문/문제 코드/정답 코드를 intellij에서 공부하다가 후배 추천으로 구름 에듀를 알게 되었습니다. 문제 지문 따로 문제 코드 따로 열어보는 게 여간 불

woogong80.tistory.com

728x90

댓글