Algorithm (여러가지 문제들)

이진석·2022년 9월 3일
1

20220903

한 번에 끝내는 Java/Spring 웹 개발 마스터


1) 잔돈 구하기 문제

///가게에 간 철수는 8370원짜리 물건을 구매하였습니다. 
///철수는 500원짜리 20개, 100원짜리 20개, 50원짜리 20개, 10원짜리 20개의 동전을 가지고 있습니다. 
///철수는 금액을 지불할 때 가장 큰 동전부터 사용하려고 합니다. 이때 사용되는 동전의 개수를 구하세요.

package ch08;

public class GreedyTest {

	public static void main(String[] args) {
	
		int[] coins = {500, 100, 50, 10};   // 
		int price = 8370;
		int count;
		
		for (int i = 0; i< coins.length; i++) {
			count = 0;
			count += price / coins[i];
			price = price % coins[i]; 
			
			System.out.println( coins[i] + "짜리 동전 " + count + "가 필요합니다.");
            }
      }
 }

  • 여러가지 값을 가진 동전과 지폐를 이용해서 원하는 가격을 계산하는 문제이고, 제시되는 조건에 따라 문제를 푸는 문제이다.
  • 이 문제에서는, 500원짜리 동전부터 사용하는 경우이므로 이를 이용해서 문제를 풀었다.
  • Greedy(탐욕) 알고리즘 문제라고도 한다.

2) 경우의 수 구하기 문제

///심각한 인플레이션을 겪고 있는 나라에서 1만원, 2만원, 5만원, 10만원, 20만원, 50만원짜리 여섯가지 지폐를 사용중이다.
///배고파서 100만원 어치 빵을 사려고 할때, 여섯가지 지폐를 사용해서 빵을 사는 방법이 모두 몇가지인지 구하시오.

package ch09;

public class BruteForceSearch {

	public static void main(String[] args) {
		int[] bills = { 1, 2, 5, 10, 20, 50 };
		
		int count = 0;
		int money = 100;
		int i0, i1, i2, i3, i4;

		for (i0 = money; i0 >= 0; i0 -= bills[0]) {
			for (i1 = i0; i1 >= 0; i1 -= bills[1]) {
				for (i2 = i1; i2 >= 0; i2 -= bills[2]) {
					for (i3 = i2; i3 >= 0; i3 -= bills[3]) {
						for (i4 = i3; i4 >= 0; i4 -= bills[4])
							if (i4 % bills[5] == 0)
								count++;
					}
				}
			}
		}

		System.out.println("지불 가능한 가지 수는: " + count + "가지 입니다.");
        }
 }

  • 수학에서 배우는 수열을 이용해서 푸는 문제이다.
  • for문을 지폐의 수에 맞게 구성해서, 각 지폐를 사용하는 경우의 수를 구현하면 쉽게 풀 수 있다.

3) 특정 범위의 숫자가 나열되어 있을 때, 각 숫자의 개수를 세는 문제

package ch10;

public class CountingTest {

	public static void main(String[] args) {
		int[] people = { 55, 40, 27, 99, 76, 81, 29, 31,33, 62}; 
		int[] ages = new int[10]; // 연령대 구분하기 위해서 필요
        
        for (int i=0; i<people.length; i++) {
            int age = people[i];
            if(age < 19)
                ages[0]++;
            else if(age < 40)
                ages[1]++;
            else if(age < 50)
                ages[2]++;
            else if(age < 60)
                ages[3]++;
            else if(age < 70)
                ages[4]++;
            else if(age < 80)
                ages[5]++;
            else if(age < 90)
                ages[6]++;
            else if(age < 100)
                ages[7]++;
        }

        int number = people.length;

        System.out.println(number + "명 중 20대는 " + ages[0] + "명 입니다.");
        System.out.println(number + "명 중 30대는 " + ages[1] + "명 입니다.");
        System.out.println(number + "명 중 40대는 " + ages[2] + "명 입니다.");
        System.out.println(number + "명 중 50대는 " + ages[3] + "명 입니다.");
        System.out.println(number + "명 중 60대는 " + ages[4] + "명 입니다.");
        System.out.println(number + "명 중 70대는 " + ages[5] + "명 입니다.");
        System.out.println(number + "명 중 80대는 " + ages[6] + "명 입니다.");
        System.out.println(number + "명 중 90대는 " + ages[7] + "명 입니다.");
    }
}

  • 주어진 인원중 각 연령대의 인원이 몇명인지 파악하는 문제이다.
  • 배열을 새로 만들어서 연령대를 구분해주었고, 새로운 배열에 포함되는 사람이 기존 people배열에 들어있는 사람이라는 식으로 구현해서 해결해주었다.

  • 오늘로써, JAVA, 알고리즘, 자료구조에 대한 과정을 마무리하고, 이제 다음주부터 스프링을 배우게 된다.
  • 스프링에 대한 지식이 거의 없어서, 다음주부터는 아마 어렵고 힘든 과정이 되겠지만, 훌륭한 백엔드 개발자가 되기 위해서 노력해보려고 한다.
  • 나뿐만 아니라, 백엔드 개발자를 꿈꾸면서 공부하는 모든 사람들이 힘내서 다들 좋은 일만 있으면 좋겠다!!
profile
혼자서 코딩 공부하는 전공생 초보 백엔드 개발자 / https://github.com/leejinseok0614

0개의 댓글