Q4. 문제. 정수 배열을 입력받아 올림차순으로 정렬해 출력하는 메서드를 만드시오.

 

예) int arr = { 5, 3, 4, 2, 1 }

Lineup(arr);

결과: 1 2 3 4 5

 

힌트1. 배열을 입력받는 메서드는 다음과 같이 생성하면 된다.
public static void Method(int[] arr)
  
힌트2. 
선택정렬의 과정 : https://drive.google.com/file/d/1SUzKO-23atNmWn9L71l5k-ENIK45q19l/view?usp=sharing
선택정렬"은 정렬 알고리즘의 하나로, 다음과 같은 순서로 이루어진다.
주어진 배열 중에 최소값을 찾는다.
-> 그 값은 맨 앞에 위치한 값과 교체한다.

-> 맨 처음 위치를 뺀 나머지 배열을 같은 방법으로 교체한다. 

 

▶ 13일 스터디 중 가장 어려웠던 문제였다.

 

 

 

A4-1. 달거북씨 코드

public class MKY_ArrayQ {
	
	public static void main(String[] args) { 
		int[] arr = {20, 1, 9, 11, 7};
		ascending(arr);
		
	}
	
	public static int[] ascending(int[] arr) {
		for(int i=0; i<arr.length-1; i++) {	// 4번만 비교하면 됨
	        for(int j=i+1; j<arr.length; j++) {	// 배열의 끝까지 비교
	            if(arr[i]>arr[j]) {
	                int temp = arr[i];
	                arr[i] = arr[j];
	                arr[j] = temp;
	            }
	        }
	    }
		for(int i=0;i<arr.length;i++){	// 정렬된 배열을 하나씩 출력하기 위한 for문
			System.out.print(arr[i] + " ");
		}
		return arr;
	}
}

▶ 하하

▶ 선택정렬은 이해했는데 배열 내에서 움직이는 방법을 왜 죽어도 모르겠을까.

▶ 처음엔 인터넷을 뒤져서 이것저것 코드를 복사해 와서 완성했다. 문제는 출력은 제대로 되는데 왜 되는지 모르겠다는거...

▶ 다른 분들의 코드리뷰를 듣고 다시 만든 코드다.

 

 

 

728x90

Q3. 파라미터로 총 항의 수(n)를 받고, 입력한 총 항을 차례대로 출력하는 메소드를 만들어 보세요!

 

피보나치 수열이란? 
1,1,2,3,5,8,13,21,34,55,... 과 같이
1,1로 시작해서 앞의 두항의 합이 뒤의 항으로 이루어진 수열입니다.

 

예) fibonacci(10) 
출력결과 ->  1 1 2 3 5 8 13 21 34 55 (한 항씩 줄바꿈으로 출력)

 

 

 

A3-1. 달거북씨 코드

public class MKY_Fibonacci {

	public static void main(String[] args) {
		fibonacci(10);
	}

	public static void fibonacci(int n) {
		int a = 1, b = 1;	// a는 첫번째 숫자, b는 두번째 숫자로, 값은 1로 고정되어 있다.
		System.out.println("피보나치수열 출력결과");
		System.out.println(a);
		System.out.println(b);	// 처음 1이 두 번 나오는 걸 어떻게 해야할 지 몰라서 각각 출력문 사용
		for (int i = 3; i <= n; i++) {	// 세번째 숫자부터 반복문을 통해 출력
			int c = a+b;	// c는 세번째 숫자로 a와 b를 더한 값이다.
			System.out.println(c);
            
			// 세번째 숫자를 출력한 뒤 첫번째 자리와 두번째 자리가 바뀌므로 값 재할당			
			a = b;
			b = c;
		}
	}
}

▶ 수열 규칙을 찾아야 해서 인터넷의 도움을 빌렸다. 

▶ f(n) = f(n-1) + f(n-2) / (단 f(1) = 1, f(2) =1이다.)

▶ 세번째 숫자 = 첫번째 숫자 + 두번째 숫자

▶ 사실, 소스도 거의 긁어왔다ㅎ

 

 

 

A3-2. 다른 분 코드

public class CHH_Fibonacci {

	public static void main(String[] args) {
		fibonacci(10);
	}

	public static void fibonacci(int n) {
		int current = 1; 	// 현재 숫자
		int previous = 0;	// 이전 숫자
		int a = 0;		// 이전 숫자를 보관하는 변수
		
		
		for (int i = 1; i <= n; i++) {
			System.out.println(current);

			a = previous;
			previous = current;
			current = a + previous;
			
		}
	}
}

▶ 미세한 변화인데(아마도?) 조금 더 코드가 간결해졌다.

▶ 출력은 똑같이 세번째 숫자이지만 조금 더 앞에서부터 시작한다.

▶ 0, 0, 1, 1, 2, ...

▶ 이전 숫자에 0, 전전 숫자에 0을 부여함으로써 1을 따로 출력해주지 않아도 1부터 출력된다.

 

 

A3-3. 배열로 해결한 코드

package methodStudy;

public class JSH_Fibonacci {

	public static void main(String[] args) {
		 f1(10);
	}
	
    public static void f1(int x){
        int[] fibonacci = new int[x];
        fibonacci[0] = 1;
        fibonacci[1] = 1;
        System.out.print(fibonacci[0] + " " + fibonacci[1] + " ");
        
        for(int i = 2; i<x; i++){
            fibonacci[i] = fibonacci[i-1] + fibonacci[i-2];
            System.out.print(fibonacci[i] + " ");
        }
    }
}

▶ 배열 어렵다. 근데 배열이 좋은 것 같다.

▶ 배열을 사용하니 피보나치수열 공식(?)을 딱 사용할 수 있다. f(n) = f(n-1) + f(n-2) 

 

 

A3-4. 또 다른 분 코드

package methodStudy;

public class pjh_fibonacci {
	public static void main(String[] args) {
		
		for(int i = 1; i <= 10; i++) {	// for문을 통해 반복
			System.out.println(fibonacci(i));
		}
	}
	
	public static int fibonacci(int n) {	// if문을 사용해 1을 두번 출력하고 나머지 수열 로직 진행
		if(n == 1) {
			return 1;
		} else if(n == 2) {
			return 1;
		} else {
			return fibonacci(n - 1) + fibonacci(n - 2);
		}
	}
}

▶ 간결한 느낌은 아니지만 for문과 if문을 사용한 게 독특해서 가져왔다

▶ 아직 코린이라 코드가 무조건 짧아야 좋은 건지 아닌지 잘 모르겠지만, 한 문제를 푸는 다양한 방법을 일단 기록해 놓고 싶다. 나중에 좀 더 머리가 굵어지면 코멘트를 더 달 수 있지 않을까...

728x90

Q2. 파라미터로 양의 정수 n을 받고 n!을 계산해서 리턴해주는 메소드를 만들어 보세요!
*주의* 0!은 1입니다. System.out.println(factorial(0)); -> 1 출력

 

팩토리얼이란?
기호는 n!로 나타내며 1부터 어떤 양의 정수 n까지의 정수를 모두 곱한것을 말한다.
팩토리얼 예시) 2! -> 1 * 2 = 2 , 5! -> 1 * 2 * 3 * 4 * 5 = 120

예) System.out.println(factorial(6));
출력결과 -> 720

 

 

 

A2. factorial 문제는 모두 비슷하게 풀었다

public class MKY_Factorial {

	public static void main(String[] args) {
		int result = factorial(6);
		System.out.println("팩토리얼 출력결과 : " + result);
	}

	public static int factorial(int n) {
		int mul = 1;	// n! = n부터 1까지 숫자를 곱하는 것이므로 변수를 1로 초기화
		if(n==0) {	// factorial 0의 값은 1이므로 따로 설정해준다.
			return 1;
		} else {	// 0외에 다른 숫자는 else문에 들어온다.
			for (int i = 0; i < n; i++) {
				mul = mul * (n-i);
			}
			return mul;
		}
	}
}

 

728x90

Q1. 거스름돈 구하는 문제

지불한 금액을 나타내는 파라미터1, 물건의 가격을 나타내는 파라미터2
이렇게 두 개의 파라미터를 받아 가장 적은 수의 지폐를 거슬러 주는 메소드를 만들어 주세요.
(단위는 50000, 10000, 5000, 1000 원입니다.)
   
 예) change(100000, 23000);
 출력결과 -> 50000원 지폐 : 1장
 10000원 지폐 : 2장 
 5000원 지폐 : 1장
 1000원 지폐 : 2장

 

 

 

A1-1. 내가 짰던 코드

public class MKY_ChangeMoney {

	public static void main(String[] args) {
		changeMoney(100000, 23000);
	}
	
	public static void changeMoney(int money, int price) {
		int cal = money - price;	// 거스름돈 구하기
		int cal2 = 0, cal3 = 0, cal4 = 0;	// 각 지폐별 변수 생성
		
		// 최소한의 지폐를 거슬러 주기 위해 5만원 단위부터 로직 구성
		if (cal>50000) {	// 거스름돈이 5만원보다 크다면 5만원 지폐를 거슬러줘야 한다.
			int bill = cal/50000;	// 5만원 몇 장이 필요한지 계산
			System.out.println("50000원 권 : " + bill + "장");
			cal2 = cal - (50000*bill);	// 거슬러줄 5만원 지폐를 제외하고 나머지 금액을 구한다.
		} 
		
		// 나머지도 같은 형식으로 진행됨
		// 거슬러 줄 지폐가 있다면 if문 안으로 들어가서 문장을 실행한다.
		if (cal2>10000) {
			int bill = cal2/10000;
			System.out.println("10000원 권 : " + bill + "장");
			cal3 = cal2 - (10000*bill);
		} 
		
		if (cal3>5000) {
			int bill = cal3/5000;
			System.out.println("5000원 권 : " + bill + "장");
			cal4 = cal3 - (5000*bill);
		} 
		
		if(cal4>1000) {
			int bill = cal4/1000;
			System.out.println("1000원 권 : " + bill + "장");
		}
	}
}

< console >----------------------------------------------------------------------------------
50000원 권 : 1장
10000원 권 : 2장
5000원 권 : 1장
1000원 권 : 2장

▶ 코드가 너무 길어져서 짜면서도 간단하게 할 방법이 있을 것 같았는데, 아래 다른 조원분이 해결해주셨다.

 

 

 

A1-2. 다른 조원이 짠 코드

package methodStudy;

public class JSH_ChangeMoney {

	public static void main(String[] args) {
		f1(100000, 23000);
	}
	
	 public static void f1(int x, int y){
	        int [] money = {50000, 10000, 5000, 1000};	// 지폐를 배열로 묶어줌
	        int div = 0, result = 0;
	       
	        result = x - y;
	        for(int i = 0; i<money.length; i++){	
	            div = result / money[i];	// 거슬러줘야하는 지폐 수
	            System.out.println(money[i] + "원 지폐: " + div + "장" );
	            result = result % money[i];	// 남은 거스름돈
	        }
	    }
}

▶ 각 단위의 지폐를 배열로 묶어주고 for 반복문을 돌림으로써 코드의 길이가 간결해졌다.

▶ %(나머지)로 남은 거스름돈을 알 수 있는 것도 생각지도 못했던 부분

 

 

 

A1-3. 다른 조원이 짠 코드2

public class CHH_ChangeMoney {

	public static void main(String[] args) {
		change(100000, 23000);
		
	}

	public static void change(int pay,int cost) {
		int changeMoney = pay - cost;
		
		int fifty_thousand = changeMoney / 50000;				
		int ten_thousand = (changeMoney % 50000) / 10000;	
		int five_thousand = (changeMoney % 10000) / 5000;	
		int one_thousand = (changeMoney % 5000) / 1000;		
		
		System.out.println("50000원 지폐 : " + fifty_thousand);
		System.out.println("10000원 지폐 : " + ten_thousand);
		System.out.println("5000원 지폐 : " + five_thousand);
		System.out.println("1000원 지폐 : " + one_thousand);
	}
}

▶ 나는 변수를 따로 설정하고 if문을 만들어 돌렸지만, 변수를 설정하면서 바로 로직이 가능하다.

▶ 로직을 짠 후 어떻게 더 간단하게 할 수 있을지 연구해봐야겠단 걸 많이 느낀 문제

728x90

+ Recent posts