loading

알고리즘/알고리즘JAVA

[백준알고리즘/1차원 배열] 2477번 문제 : 숫자의 개수(자바/JAVA)

침착곰 2021. 5. 3. 11:43
반응형

안녕하세요

백준 알고리즘 단계별로 풀어보기 4단계 2577번 숫자의 개수를 풀어봤습니다

풀려고 하려면 간단하게 풀 수 있는 문제인데 최대한 간단하게 풀려고 고민하다가 시간이 좀 걸린 문제였습니다

제가 풀었던 여러 가지 방식에 대해서 설명해보겠습니다!!


 

문제

세 개의 자연수 A, B, C가 주어질 때 A × B × C를 계산한 결과에 0부터 9까지 각각의 숫자가 몇 번씩 쓰였는지를 구하는 프로그램을 작성하시오.

예를 들어 A = 150, B = 266, C = 427 이라면 A × B × C = 150 × 266 × 427 = 17037300 이 되고, 계산한 결과 17037300 에는 0이 3번, 1이 1번, 3이 2번, 7이 2번 쓰였다.

 

입력

첫째 줄에 A, 둘째 줄에 B, 셋째 줄에 C가 주어진다. A, B, C는 모두 100보다 크거나 같고, 1,000보다 작은 자연수이다.

 

출력

첫째 줄에는 A × B × C의 결과에 0 이 몇 번 쓰였는지 출력한다. 마찬가지로 둘째 줄부터 열 번째 줄까지 A × B × C의 결과에 1부터 9까지의 숫자가 각각 몇 번 쓰였는지 차례로 한 줄에 하나씩 출력한다.

 

 


문제풀이

문제는 총 3가지 방식으로 풀었습니다

1. 첫 번째 방식은 제가 처음 풀은 방식입니다

 3개의 곱한 것을 String으로 받아서 SubString을 사용한 방식입니다

 문제를 풀긴 풀었지만 약간 깔끔(?)하게 못 푼 느낌이라 좀 찝찝한 방식이었습니다

2. 두 번째 방식은 결과값을 10으로 나눈 나머지를 구하여 배열에 넣어주고, 결과값을 10으로 나누는 것을 계속해서 반복하는 방식입니다

 제일 깔끔한 방식이라 생각합니다

3. 세 번째 방식은 더 정리해서 a, b, c대신 배열을 사용해서 풀었습니다

 


1. a * b * c의 결과를 String으로 받아 SubString을 사용하여 배열에 1-10까지의 갯수를 넣어주는 방식입니다

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	public static void main(String[] args) throws IOException {
		// BufferedReader 선언
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		// 세 변수 abc 선언
		int a = Integer.parseInt(br.readLine());
		int b = Integer.parseInt(br.readLine());
		int c = Integer.parseInt(br.readLine());
		
		// abc를 곱하여 String으로 변환
		String sum = Integer.toString(a * b * c);
		
		// 1-10까지의 갯수를 구할 배열 선언
		int[] array = new int[10];		
		
		// 반복문을 사용 배열에 1-10까지 갯수를 넣는다
		for(int i = 0; i < sum.length(); i++)
		{
			// SubString을 사용하여 배열에 데이터를 넣는다
			array[Integer.parseInt(sum.substring(i, i + 1))]++;			
		}
		
		// StringBuilder 선언
		StringBuilder sb = new StringBuilder();
		
		// 반복문을 사용해 결과값을 넣어준다
		for(int i = 0; i < 10; i++)
		{
			sb.append(array[i] + "\n");
		}
		
		// 결과 출력
		System.out.print(sb);
	}
}

 


2. 세 변수 a, b, c를 곱하여 sum을 구하는 것까지는 똑같습니다

 1-10까지의 갯수를 구할 때 두 단계를 거쳐서 반복문을 실행합니다.

 1단계 : SUM을 10으로 나눈 나머지를 array에 넣고 +1을 합니다

 2단계 : SUM을 10으로 나눕니다

 결과적으로 10으로 나눈 값이 1보다 작아지면 sum은 0이 되어 while문을 종료하게 됩니다

 여기까지 제가 구한 방식입니다

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	public static void main(String[] args) throws IOException {
		// BufferedReader 선언
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		// 세 변수 abc 선언
		int a = Integer.parseInt(br.readLine());
		int b = Integer.parseInt(br.readLine());
		int c = Integer.parseInt(br.readLine());
		
		// a, b, c를 곱함
		int sum = a * b * c;

		// 1-10까지의 갯수를 구할 배열 선언
		int[] array = new int[10];
		
		// while문을 사용
		// 1단계 : 10으로 나눈 나머지를 배열로 넣는다
		// 2단계 : SUM을 10으로 나눈다
		while(sum != 0)
		{
			array[sum % 10]++;
			sum /= 10;
		}

		// StringBuilder 선언
		StringBuilder sb = new StringBuilder();

		// 반복문을 사용해 StringBuilder를 넣는다
		for(int i : array)
		{
			sb.append(i + "\n");
		}
		
		// 결과 출력
		System.out.print(sb);
	}
}

 


3. 세 번째 방식은 a, b, c를 abc[]배열을 통해 입력받아 속도를 조금 더 높였습니다

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	public static void main(String[] args) throws IOException {
		// BufferedReader 선언
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		// 입력 배열 선언
		int abc[] = new int[3];
		
		// 반복문으로 abc를 넣는다
		for(int i = 0; i < 3; i++)
		{
			abc[i] = Integer.parseInt(br.readLine());
		}
		
		// a * b * c를 곱한다
		int sum = abc[0] * abc[1] * abc[2];

		// 1-10까지의 갯수를 구할 배열 선언
		int[] array = new int[10];

		// while문을 사용
		// 1단계 : 10으로 나눈 나머지를 배열로 넣는다
		// 2단계 : SUM을 10으로 나눈다
		while(sum != 0)
		{
			array[sum % 10]++;
			sum /= 10;
		}

		// StringBuilder 선언
		StringBuilder sb = new StringBuilder();

		// 반복문을 사용해 StringBuilder를 넣는다
		for(int i : array)
		{
			sb.append(i + "\n");
		}

		// 결과 출력
		System.out.print(sb);
	}
}

 

여기까지 세 가지 방식을 이용하여 알고리즘 문제를 풀었습니다

마지막으로 세 가지 방식의 속도 비교입니다


속도 비교

 

백준알고리즘 2577번 숫자의 개수를 풀은 내용이었습니다

이 글이 알고리즘을 공부 하는 분들께 도움이 되었으면 좋겠습니다!

 

다음 문제 : 2021.05.04 - [알고리즘/알고리즘JAVA] - [백준알고리즘/1차원 배열] 3052번 문제 : 나머지(자바/JAVA)

이전 문제 : 2021.04.30 - [알고리즘/알고리즘JAVA] - [백준알고리즘/1차원 배열] 10818번 문제 : 최소, 최대(자바/JAVA)

반응형
그리드형