본문 바로가기
국비교육기관/숙제

자바_알고리즘_문제풀이_1차

by 밀키스 2021. 4. 11.

1. 현재 몸무게와 목표 몸무게를 각각 입력 받고 주차별 감량 몸무게를 입력 받아 목표 달성 시 축하메세지를 띄우는 프로그램. 

 풀이 

더보기
package java_fes;
import java.util.Scanner;
public class moon_01 {
	public static void main(String[] args) {
		// 현재몸무게와 목표몸무게를 각각 입력 받고
		// 주차별 감량몸무게를 입력받아 목표 달성 시 축하메세지를 띄우는 프로그램
		Scanner sc = new Scanner(System.in);
		System.out.print("현재 몸무게: ");
		int r_m = sc.nextInt();
		System.out.print("목표 몸무게: ");
		int m_m = sc.nextInt();
		int i=1;
		while (true) {
			System.out.print(i + "주차 감량 몸무게 : ");
			int w = sc.nextInt();
			r_m-=w;
			if(r_m<=m_m) {
				System.out.println(r_m+"kg 달성!! 축하합니다!");
				break;}
			i+=1;}}}

현재/목표 몸무게를 입력 받고, 주차별 감량 몸무게 또한 직접 입력 받아, 목표 몸무게 달성시 종료하는 구문

- Scanner를 통해 현재/목표 몸무게를 입력 받음

- 무한 반복문을 통해 주차별 감량 몸무게를 입력

- 목표 몸무게 달성시 축하 메세지를 띄움과 동시에 무한반복문을 종료. 

2. 일한 시간을 입력 받아 임금을 계산하는 시급계산기 만들기. 

 풀이 

더보기
package java_fes;
import java.util.Scanner;
public class moon_02 {
	public static void main(String[] args) {
		// 일한 시간을 입력 받아 총 임금을 계산하는 문제
		// 시급은 5000원이며 8시간보다 초과 근무한 시간에 대해 1.5배의 시급이 책정 됨.
		// 10시간 근무  ==>  55000원.
		Scanner sc = new Scanner(System.in);
		System.out.print("일한시간을 입력하세요 : ");
		int time = sc.nextInt();
		int siga = 5000;
		if(time > 8) {
			System.out.println("총 임금은 "+ (int)(siga*8+((time-8)*1.5*siga)) + "입니다.");}
		else {
			System.out.println("총 임금은 "+ time*siga + "입니다.");}}}

시간에 따른 임금을 계산하는 문제. 초과근무 수당을 고려한다.

- Scanner를 통해 일한 시간을 입력 받는다.

- 시급은 siga라는 변수를 통해 5000으로 초기화하였다.

- 일한 시간이 8시간 이상일 때 그 차이만큼의 시간은 시급의 1.5배만큼 주었다.

3. 1-2+3-4+...+99-100을 계산하여 출력하기. 

 풀이 

더보기
package java_fes;
public class moon_03 {
	public static void main(String[] args) {
		// 1-2+3-4+...+99-100를 계산하기
		// 즉, 1~100까지 모두 더하는데, 짝수는 음수로서 계산.
		int result=0;
		for(int i=1;i<101;i++) {
			if (i%2==0){
				result+=(-1*i);
				System.out.print(-1*i+" ");}
			else {
			result+=i;
			System.out.print(i+" ");}}
		System.out.println("\n결과 : "+result);}}

1~100까지 모두 더한 값을 출력, 짝수의 경우 음수로서 계산한다.

- for문을 통해 1~100까지 반복토록 함

- % 연산자를 통해 짝수일 시, 빼주도록 코드 작성

- 매번 값을 연산할 때마다 출력문을 통해 출력되도록 함.

4. 거스름 돈을 입력받아 내줘야하는 지폐 개수 출력.

 풀이 

더보기
package java_fes;
import java.util.Scanner;
public class moon_04 {
	public static void main(String[] args) {
		// 거스름돈을 입력 받아 내어줘야 하는 지폐의 개수를 출력하는 프로그램.
		// 단, 최대 단위는 10000원, 최소단위는 100원.
		Scanner sc = new Scanner(System.in);
		System.out.print("총 금액 입력 : ");
		int cn = sc.nextInt();
		System.out.println("잔돈 : "+cn+"원");
		System.out.println("10000원 : "+(cn/10000)+"개");
		System.out.println("5000원 : "+(cn%10000)/5000+"개");
		System.out.println("1000원 : "+(cn%5000)/1000+"개");
		System.out.println("500원 : "+(cn%1000)/500+"개");
		System.out.println("100원 : "+(cn%500)/100+"개");}}

거스름 돈을 입력 받으면 지폐와 동전의 갯수를 계산하는 코드 지폐는 만원~천원 / 동전은 500원과 100원만.

- Scanner를 통해 거스름 돈을 입력 받는다.

- 만원짜리의 경우, 거스름돈을 만으로 나눴을 때의 몫이 해당 값이다.

- 거스름돈%만원 하면 만원짜리 지폐 수만큼의 금액을 뺀 나머지 값을 도출할 수 있다.

- 위에서 도출한 값을 5000으로 나누면 5000원짜리 지폐 갯수를 받을 수 있다.

- 위의 2가지 항목을 100원짜리까지 반복.

5. 정수를 입력받아 1의자리에서 반올림한 결과를 출력. 

 풀이 

더보기
package java_fes;
import java.util.Scanner;
public class moon_05 {
	public static void main(String[] args) {
		// 정수를 입력받아 1의 자리에서 반올림한 결과를 출력하시오.
		Scanner sc = new Scanner(System.in);
		System.out.print("숫자 입력 : ");
		int num = sc.nextInt();
		if(num%10>=5) {
			System.out.println("반올림 수 :"+(num+10-num%10));}
		else {
			System.out.println("반올림 수 : "+(num-num%10));}}}

정수를 입력 받의 1의자리만 반올림하여 출력

- 단순히 10으로 나눴을 때의 나머지를 계산하여 5보다 크거나 같으면 10을 더해주고 아니면 뺐다.

6. 두 정수를 입력받아 최대공약수 & 최소공배수 출력하기. 

 풀이 

더보기
package java_fes;
import java.util.Scanner;
public class moon_06 {
	public static void main(String[] args) {
		// 두 정수를 입력받아 최대공약수 & 최소공배수를 출력하시오,
		Scanner sc = new Scanner(System.in);
		System.out.print("숫자1 입력 >> ");
		int num1 = sc.nextInt();
		System.out.print("숫자2 입력 >> ");
		int num2 = sc.nextInt();
		int cnt=2;
		int yak =1;
		int be = 1;
		while(true) {
			if (num1%cnt ==0 && num2%cnt==0) {
				yak*=cnt;
				num1/=cnt;
				num2/=cnt;}
			else if(num1<cnt || num2<cnt) {
				be=num1*num2*yak;
				break;}
			else {
				cnt+=1;}}
		System.out.println("최대공약수 : " + yak+"\n최소공배수 : "+be);}}

두 개의 정수를 입력 받아 최대공약수 및 최소공배수 구하기. 최대공약수 = 공약수들의 곱 / 최소공배수 = 최대공약수 * 최대공약수로 각 수를 나눈 몫

- yak와 be라는 변수에 각각 최대공약수, 최소공배수를 담는다.

- cnt라는 변수에 나눌 약수를 지정, 무한반복문을 통해 계속 나눠주며 공약수가 맞다면 yak 변수에 곱해갔다.

- 입력 받은 두 정수에 나머지 연산자를 사용하여 나머지가 0이라는건 두 수의 공약수라는 뜻이다.

- 공약수를 구했다면 공약수로 두개의 정수를 나눈 몫의 값을 다시 각 정수에 저장한다.

- 나눠가는 수 cnt 변수가 입력받은 정수보다 큰 경우에 반복문을 종료한다.

- cnt라는 변수가 두 정수의 공약수가 아니라면 1씩 증가시킨다.

7. 행 개수를 입력 받아 다음과 같이 삼각형을 출력하시오. 

 풀이 

더보기
package java_fes;
import java.util.Scanner;
public class moon_07 {
	public static void main(String[] args) {
		// 행개수를 입력 받아 삼각형을 출력하기
		// 삼각형은 밑변이 긴 직각삼각형 형태.
		Scanner sc = new Scanner(System.in);
		System.out.print("행 개수 : ");
		int row = sc.nextInt();
		for(int i=0;i<row;++i) {
			for(int j=0;j<i;++j) {
				System.out.print("*");}
			System.out.println("");}}}

* 문자를 1개부터 입력 받은 수까지 한 행씩 출력하는 코드

- row 변수에 입력 받은 행의 수를 저장한다.

- 입력 받은 행의 수가 만들 삼각형의 총 행수가 될

- 이중 for문을 통해 풀이

8. (77*1) + (76*2) + (75*3) +...+(1*77)를 계산하여 출력. 

 풀이 

더보기
package java_fes;
public class moon_08 {
	public static void main(String[] args) {
		// (77*1) + (76*2) + (75*3)+...+(1*77)를 계산하여 출력하기
		int a=77;
		int b=1;
		int cnt=0;
		while(b<78) {
			cnt+=(a*b);
			a-=1;
			b+=1;}
		System.out.println(cnt);}}

(77X1) + (76X2) + (75X3) +...+ (1X77) 계산

- 결국 값은 1~77까지가 범위이다.

- 1부터 시작하는 b라는 변수를 1씩 증가, 77부터 시작하는 a라는 변수를 1씩 감소하게 하였다.

- while문을 통해 b라는 변수가 78보다 작을 때까지는 반복토록 진행

- cnt라는 변수에 a,b 변수를 곱한 값을 계속해서 더해줌.

9. 행 개수를 입력 받아 다음과 같이 삼각형을 출력하시오. 

 풀이 

더보기
package java_fes;
import java.util.Scanner;
public class moon_09 {
	public static void main(String[] args) {
		// 행 개수를 입력 받아 삼각형 출력
		// 삼각형은 윗변이 긴, 직각삼각형의 형태
		Scanner sc = new Scanner(System.in);
		System.out.print("행 개수 : ");
		int row = sc.nextInt();
		for(int i=row;i>0;--i) {
			for(int j=i;j>0;--j) {
				System.out.print("*");}
			System.out.println("");}}}

7번과 마찬가지로 입력 받은 행수만큼의 삼각형을 만들되, 방향만 반대인 삼각형 생성

- 반복문의 초기값은 행수부터 시작하여 1씩 감소한다.

10. 입력받은 나열된 수를 대시로 표현했을 때, 대시의 갯수. 

더보기
package java_fes;
import java.util.Scanner;
public class moon_10 {
	public static void main(String[] args) {
		// 짝대기로 이뤄진 디지털 숫자가 있다고 할때,
		// 입력한 숫자의 짝대기 갯수 구하는 문제.
//		2개 -> 1
//		3개 -> 7
//		4개 -> 4
//		5개 -> 2, 3, 5
//		6개 -> 0, 6, 9
//		7개 -> 8
		Scanner sc = new Scanner(System.in);
		System.out.print("숫자 입력 >> ");
		String inp = sc.next();
		int cnt=0;
		int nu=Integer.parseInt(inp);
		System.out.println(nu);
		for(int i=0;i<inp.length();++i) {
			int num = nu%10;
			nu/=10;
			if(num==1) {cnt+=2;}
			else if(num==7) {cnt+=3;}
			else if(num==4) {cnt+=4;}
			else if(num==2 || num==3 ||num==5) {cnt+=5;}
			else if(num==0 || num==6 || num==9) {cnt+=6;}
			else if(num==8) {cnt+=7;}}
		System.out.println("대시('-')의 총 합 >> "+cnt);}}

주석을 보면 대시 갯수별 해당 숫자를 기입해 놓았다. 이를 통해 입력 받은 나열된 수가 총 몇개의 대시로 있는지

- 일단 숫자를 String 형으로  inp 라는 변수에 입력 받았다.

- for문을 돌리는데 반복횟수에 String 문자열의 길이만큼 반복을 진행

- 그리고  Integer.parseInt 라는 명령어를 통해 받은 문자열을 int형으로 변환하여 nu라는 변수에 주었다.

- nu라는 값을 10으로 나눈 나머지는 대시 갯수를 구별하고, 몫은 그대로 nu 변수에 저장하였다.

 

%더 쉽게 풀기 

위의 과정으로 풀었긴 하지만 이를 더 간단하게 푸려면, switch case 문을 사용한다면 더 간단하게 풀 수 있다.

- 우선 굳이 for문으로 하지 말고 while문으로 범위를 정해 놓고 반복하면 String으로 받을 필요도 없다.

- 위의 코드를 기준으로 nu라는 변수가 0이 되면 반복을 종료하도록 만들면 되니까.

11. 소인수 분해를 해주는 프로그램. 

더보기
package java_fes;
import java.util.*;
public class moon_11 {
	public static void main(String[] args) {
		// 소인수 분해를 해주는 프로그램 작성하기
		Scanner sc = new Scanner(System.in);
		System.out.print("소인수분해 할 수를 입력하세요. : ");
		int num = sc.nextInt();
		int cnt=2;
		System.out.print(num+" = ");
		while(true) {
			if(num/cnt==1 && num%cnt==0) {
				System.out.println(cnt);
				break;}
			else if(num%cnt==0) {
				System.out.print(cnt + "*");
				num/=cnt;}
			else {
				cnt+=1;}}}}

입력받은 정수를 소인수 분해하는 프로그램

- 나누려하는 수로 cnt라는 변수에 값을 주었다.

- 2부터 시작하여 나머지가 0이라면 무조건 출력토록 하였다.

- 위 사항에 대해선, 약수가 존재하는 (소인수가 아닌) 수들에 대해서는 이미 작은 값부터 나누기를 진행하기 때문    에 절대 나올 수 없을 것.

- 몫이 1이고 나머지가 0이라는건 해당 수에 대한 분해가 끝났다는 뜻이므로 " * "를 출력하지 않고 반복을            종료한 다.

12. 10진수 정수를 입력받아 2진수로 변환. 

더보기
package java_fes;
import java.util.Scanner;
public class moon_12 {
	public static void main(String[] args) {
		// 10진수 정수를 입력 받아 2진수로 변환해서 출력하기.
		Scanner sc = new Scanner(System.in);
		System.out.print("숫자 입력");
		int num = sc.nextInt();
		String ans = "";
		while(true) {
			if(num==1) {
				ans="1 "+ans;
				break;}
			ans = num%2+" "+ans;
			num/=2;}
		System.out.println(ans);}}

입력 받은 정수를 2진수로 변환하는 코드

- 답이 될 ans라는 변수를 String형으로 초기화한다.

- 입력 받은 정수 num을 2로 나눴을 때 나머지를 ans 변수에 더해준다. (int를 String에 더하면 문자열이 된다.)

- num이란 변수는 2로 나눴을 때의 몫으로 계속 값을 변경해준다.

- 반복 중 정수 num이 1이 된다면 ans 변수에 문자로 1을 추가하고 반복을 종료한다.

반응형

댓글