๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm

[๋ฐฑ์ค€] 2745๋ฒˆ: ์ง„๋ฒ• ๋ณ€ํ™˜

by ์ฃผ๋ฐœ2 2020. 1. 28.
๋ฐ˜์‘ํ˜•

https://www.acmicpc.net/problem/2745

 

2745๋ฒˆ: ์ง„๋ฒ• ๋ณ€ํ™˜

B์ง„๋ฒ• ์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค. ์ด ์ˆ˜๋ฅผ 10์ง„๋ฒ•์œผ๋กœ ๋ฐ”๊ฟ” ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. 10์ง„๋ฒ•์„ ๋„˜์–ด๊ฐ€๋Š” ์ง„๋ฒ•์€ ์ˆซ์ž๋กœ ํ‘œ์‹œํ•  ์ˆ˜ ์—†๋Š” ์ž๋ฆฌ๊ฐ€ ์žˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. A: 10, B: 11, ..., F: 15, ..., Y: 34, Z: 35

www.acmicpc.net

์ฝ”๋“œ

import java.util.Scanner;

public class Main {
	
	// num1 ์˜ num2 ์ œ๊ณฑ
	// numSqrt(15, 3) => 15 * 15 * 15
	static int numSqrt(int num1, int num2) {
		int result = 1;
		for(int i=1; i<=num2; i++) 
			result *= num1;
		return result;
	}
	
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int answer = 0;	// 10์ง„๋ฒ•์œผ๋กœ ์ถœ๋ ฅํ•  ์ˆ˜
		int index = 0;	// ์ œ๊ณฑ์˜ ์ง€์ˆ˜
		String[] sArr = scan.nextLine().split(" ");	// ์ˆ˜N๊ณผ B์ง„๋ฒ•์„ ์ž…๋ ฅ๋ฐ›์•„์„œ ์ž˜๋ผ์„œ ๋ฌธ์ž์—ด ๋ฐฐ์—ด์— ๋„ฃ๊ธฐ.
		int B = Integer.parseInt(sArr[1]);	// ์ง„๋ฒ• B(int ํ˜•๋ณ€ํ™˜)
		String str = sArr[0];				// ์ˆซ์ž N
		for(int i=str.length()-1; i>=0; i--) {
			// ์ˆ˜ N์ด 10์ง„๋ฒ•์„ ๋„˜์–ด๊ฐ€๋Š” ์ˆ˜์ผ๋•Œ
			int num = 0;
			char ch = str.charAt(i);	
			
			// ์•„์Šคํ‚ค์ฝ”๋“œ: A(65) ~ Z(90) ==> 10 ~ 35 ... ๋”ฐ๋ผ์„œ 55๋ฅผ ๋นผ์ค€๋‹ค.
			if(ch >= 'A' && ch <= 'Z') 
				num = sArr[0].charAt(i) - 55;
			// 0 ~ 9์˜ ๋ฌธ์ž๋Š” 0์„ ๋นผ์„œ ์ˆซ์ž๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.
			else 
				num = sArr[0].charAt(i) - '0';
			
			// N = ZZZZZ, B = 36์ผ๋•Œ
			// ๊ฐ ์ž๋ฆฟ์ˆ˜๋Š” (Z*36^0) + (Z*36^1) + (Z*36^2) + (Z*36^3) + (Z*36^4) ๊ฐ€ ๋œ๋‹ค.
			// ๋”ฐ๋ผ์„œ 
			answer += num * numSqrt(B, index);
			index ++;
		}
		System.out.println(answer);
		
		scan.close();
	}

}

 

ํ’€์ด

 

B ์ง„๋ฒ•์˜ N์„ 10์ง„๋ฒ•์œผ๋กœ ๋ฐ”๊พธ๋Š” ๋ฌธ์ œ๋‹ค.

10์ง„๋ฒ•์„ ๋„˜์–ด๊ฐ€๋Š” ์ง„๋ฒ•์€ ์ˆซ์ž๋กœ ํ‘œ์‹œํ•˜์ง€ ์•Š๊ณ  ์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž๋กœ ํ‘œ์‹œํ•œ๋‹ค.

A = 10, B = 11, C = 12, ... , Z = 35

์ง„๋ฒ• B๊ฐ€ 15์ด๊ณ , N์ด BAA๋ผ๊ณ  ๊ฐ€์ •ํ–ˆ์„๋•Œ.

BAA = 11, 10, 10์ด๋ฏ€๋กœ 11 * (15^2) + 10 * (15^1) + 10 * (15^0) ์ด ๋˜์–ด์„œ 2635๊ฐ€ ์ •๋‹ต์ด๋‹ค.

 

์ด๋•Œ B์˜ ์ง€์ˆ˜๋Š” 0๋ถ€ํ„ฐ 1์”ฉ ์ฆ๊ฐ€ํ•˜๋ฏ€๋กœ, numSqrt()๋ผ๋Š” ๋ฉ”์†Œ๋“œ์—์„œ ์ง€์ˆ˜๋งŒํผ ๊ณฑํ•˜๋„๋ก ๊ตฌํ˜„ํ–ˆ๋‹ค.

numSqrt(15, 3) => 15 * 15 * 15 => 15^3

 

ํ•œ์ค„๋กœ ์ž…๋ ฅ๋ฐ›์œผ๋ฏ€๋กœ Scannerํด๋ž˜์Šค์˜ nextLine()์„ ํ†ตํ•ด ์ž…๋ ฅ๋ฐ›๊ณ , split(" ")์„ ์ด์šฉํ•ด ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ๋ถ„๋ฆฌํ•ด์„œ String ๋ฐฐ์—ด์˜ sArr์— ์ €์žฅํ–ˆ๋‹ค.

String[] sArr = scan.nextLine().split(" ");	// ์ˆ˜N๊ณผ B์ง„๋ฒ•์„ ์ž…๋ ฅ๋ฐ›์•„์„œ ์ž˜๋ผ์„œ ๋ฌธ์ž์—ด ๋ฐฐ์—ด์— ๋„ฃ๊ธฐ.
int B = Integer.parseInt(sArr[1]);	// ์ง„๋ฒ• B(int ํ˜•๋ณ€ํ™˜)
String str = sArr[0];				// ์ˆซ์ž N

๋ฐฐ์—ด์˜ 0๋ฒˆ์งธ ๊ฐ’์€ ์ˆซ์ž N์ด๊ณ , ์ฒซ ๋ฒˆ์งธ ๊ฐ’์€ ์ง„๋ฒ• B์ด๋‹ค.

 

 

N์ด BAA ์ผ๋•Œ, ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ์ˆ˜ ๋ถ€ํ„ฐ ๊ณ„์‚ฐํ•ด์ฃผ๊ธฐ ์œ„ํ•ด for๋ฌธ์˜ i๊ฐ’์„ ๋งˆ์ง€๋ง‰์œผ๋กœ ์„ค์ •ํ–ˆ๋‹ค.

๋งŒ์•ฝ ์ˆ˜ N์ด ์•ŒํŒŒ๋ฒณ์ผ๋•Œ(A ~ Z) => ์•„์Šคํ‚ค์ฝ”๋“œ๊ฐ’(65~90) ์—์„œ 55๋ฅผ ๋นผ์ฃผ๊ณ ,

0~9์˜ ๋ฌธ์ž์ผ๋•Œ๋Š” '0'์„ ๋นผ์ค˜์„œ ์ˆซ์ž๋กœ ๋งŒ๋“ค์–ด ์ค€๋‹ค.

 

		for(int i=str.length()-1; i>=0; i--) {
			// ์ˆ˜ N์ด 10์ง„๋ฒ•์„ ๋„˜์–ด๊ฐ€๋Š” ์ˆ˜์ผ๋•Œ
			int num = 0;
			char ch = str.charAt(i);	
			
			// ์•„์Šคํ‚ค์ฝ”๋“œ: A(65) ~ Z(90) ==> 10 ~ 35 ... ๋”ฐ๋ผ์„œ 55๋ฅผ ๋นผ์ค€๋‹ค.
			if(ch >= 'A' && ch <= 'Z') 
				num = sArr[0].charAt(i) - 55;
			// 0 ~ 9์˜ ๋ฌธ์ž๋Š” 0์„ ๋นผ์„œ ์ˆซ์ž๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.
			else 
				num = sArr[0].charAt(i) - '0';

 

 

 

๊ทธ ํ›„ ์ผ์˜์ž๋ฆฌ๋ถ€ํ„ฐ ์ง€์ˆ˜๋ฅผ ํ•˜๋‚˜์”ฉ ๋†’์ด๋ฉฐ ๊ณฑํ•œ๊ฐ’์„ ๋”ํ•ด์ค€๋‹ค.

B = 15, N = BAA ์ผ๋•Œ,

answer = 10 + 10 * (15^0) = 10

answer = 10 + 10 * (15^1) = 160

answer = 160 + 11 * (15^2) = 2635

answer += num * numSqrt(B, index);
index ++;

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€