반응형

 문제설명

컴퓨터실에서 수업 중인 정보 선생님은 냉난방기의 온도를 조절하려고 한다.

냉난방기가 멀리 있어서 리모컨으로 조작하려고 하는데, 리모컨의 온도 조절 버튼은 다음과 같다.

1) 온도를 1도 올리는 버튼

2) 온도를 1도 내리는 버튼

3) 온도를 5도 올리는 버튼

4) 온도를 5도 내리는 버튼

5) 온도를 10도 올리는 버튼

6) 온도를 10도 내리는 버튼

이와 같이 총 6개의 버튼으로 목표 온도를 조절해야 한다.

현재 설정 온도와 변경하고자하는 목표 온도가 주어지면 이 버튼들을 이용하여 목표 온도로 변경하고자 한다.

이 때 버튼 누름의 최소 횟수를 구하시오.

예를 들어, 7도에서 34도로 변경하는 경우,

7 -> 17 -> 27 -> 32 -> 33 -> 34

이렇게 총 5번 누르면 된다.

 출력

최소한의 버튼 사용으로 목표온도가 되는 버튼의 횟수를 출력한다.

 입력 예시

7 34

 출력 예시

5 (10도 -> 10도 -> 5도 -> 1도 -> 1도)

 제출

import java.util.Scanner;
public class Main{

    static int temp(int start, int finish){
    int num = 0; // 반복 횟수
    int need = finish - start; // 필요한 온도
    
    if(need < 0) need*= -1;
    
    while(true){
        if(need >= 10){ // 필요한 온도가 10도 이상
            need -= 10;
            num++;
        }else if(need > 7){ // 필요한 온도가 8도 이상일 경우 10도를 더하고 1도를 빼는것이 최소횟수
            need -= 10;
            num++;
        }else if(need >= 5){ // 필요한 온도가 5도 이상
            need -= 5;
            num++;
        }else if(need > 3){ // 필요한 온도가 4도 이상일 경우 5도를 더하고 1도를 빼는것이 최소횟수
            need -= 5;
            num++;
        }else if(need > 0){ // 필요한 온도가 1~3일 경우
            need -= 1;
            num++;
        }else if(need == 0){ 
            break;
        }else{ // 필요한 온도가 - 인 경우
            need += 1;
            num++;
        }
        
    }

        return num; // 횟수 반환
    }
    
    public static void main (String[] args) {
        Scanner sc = new Scanner(System.in);
        
        System.out.println(temp(sc.nextInt(),sc.nextInt()));
    }
}

 문제 해결

필요 온도(현재 온도 - 목표 온도, 음수일 경우 *-1을 통해 양수로 변환)에 따라 최소 횟수를 구하기 위해 10도, 5도, 1도 뿐 아니라 3도 7도를 기준으로 잡았습니다.

기준보다 클 경우 각각 ±5도 ±10도를 하여 문제를 해결했습니다.

반응형
반응형

6가지의 경우를 가진 별 그리기 예제입니다.

 

1번 경우

****
****
****

 

2번 경우 

*
**
***

 

3번 경우

--*
-**
***

 

4번 경우

--*  
-***
*****

 

5번 경우

 

--*  
-***
*****
-***
--*

 

6번 경우: 숫자를 입력받아 해당하는 층의 마름모 그리기

ex) 13 입력시

------*     
-----***     
----*****    
---*******   
--*********  
-*********** 
*************
-*********** 
--*********  
---*******   
----*****    
-----***     
------

 

 

코드

import java.util.Scanner;

public class StarExam {

	public static final String STAR = "*";

	// star-1번 과제
	void starOne() {
		for (int i = 1; i <= 12; i++) {
			System.out.print(STAR);
			if (i % 4 == 0)
				System.out.println(); // 4개씩 끊어서 출력
		}
	}

	// star-2번 과제
	void starTwo() {
		for (int i = 1; i < 4; i++) {// 행
			for (int j = 0; j < i; j++) { // i행일때 별 개수 i개 입력
				System.out.print(STAR);
			}
			System.out.println();
		}
	}

	// star-3번 과제
	void starThree() {
		int fr = 2;
		for (int i = 1; i < 4; i++) { // 행
			for (int j = 1; j <= 3; j++) {// 열
				if (j <= fr) { // 공백
					System.out.print(" ");
				} else { // 별
					System.out.print(STAR);
				}
			}
			fr--;
			System.out.println();
		}
	}

	// star-4번 과제
	void starFour() {
		int fr = 2, ba = 3;
		for (int i = 1; i <= 3; i++) {// 행
			for (int j = 1; j <= 6; j++) {// 열
				if (j <= fr) {// 공백 삽입
					System.out.print(" ");
				} else if (j > ba) {// 공백 삽입
					System.out.print(" ");
				} else { // 별 삽입
					System.out.print(STAR);
				}
			}
			fr--;
			ba++;
			System.out.println();
		}
	}

	// star-5번 과제
	void starFive() {

		int fr = 3, ba = 3; // 공백이 들어가는 조건 fr앞 공백, ba뒷 공백 조건으로 사용
		for (int i = 1; i <= 5; i++) { // 5번 반복
			for (int j = 1; j <= 5; j++) { // 5열 생성
				if (j < fr) { // 각 열을 fr과 비교해 공백이 들어갈 부분에 공백 삽입, 중간열을 기준으로 앞 공백
					System.out.print(" ");
				} else if (j > ba) { // 각 열을 ba와 비교해 공백 삽입, 중간열을 기준으로 뒷 공백
					System.out.print(" ");
				} else { // 별이 들어갈 곳
					System.out.print(STAR);
				}
			}
			if (i < 3) { // 중간층까지 별 개수를 늘리도록 조건을 증가 및 감소
				fr--;
				ba++;
			} else { // 중간층 이후 별 개수를 줄이도록 조건을 증가 및 감소
				fr++;
				ba--;
			}
			System.out.println();
		}
	}

	// star-6번 과제
	void starSix() {
		Scanner sc = new Scanner(System.in);

		System.out.print("몇층까지 하겠습니까? (홀수만 가능):");
		int re = sc.nextInt(); // 층 입력
		if (re % 2 == 0) {
			System.out.println("홀수를 입력해주세요.");
		} else {
			int fr = re / 2 + 1, ba = re / 2 + 1; // 공백이 들어가는 조건 fr앞 공백, ba뒷 공백 조건으로 사용
			for (int i = 1; i <= re; i++) { // i를 입력받은 re층 만큼 반복
				for (int j = 1; j <= re; j++) { // j는 입력받은 re의 열 만큼 반복
					if (j < fr) { // 앞부분이 공백이 들어가는 조건일 경우 공백 삽입
						System.out.print(" ");
					} else if (j > ba) { // 뒷 부분이 공백이 들어가는 조건일 경우 공백 삽입
						System.out.print(" ");
					} else {
						System.out.print(STAR);
					}
				}
				if (i < re / 2 + 1) { // 중간층까지 별 개수를 늘리도록 조건을 증가 및 감소
					fr--;
					ba++;
				} else { // 중간층 이후 별 개수를 줄이도록 조건을 증가 및 감소
					fr++;
					ba--;
				}
				System.out.println();
			}
		}
	}

	public static void main(String[] args) {
		StarExam starexam;
		starexam = new StarExam(); // static이 아닐 경우 new를 해야한다.
		// 클래스로 받아 오는것들은 static이다

		Scanner sc;
		sc = new Scanner(System.in);
		int num1;
		String replay;
		do {
			System.out.print("1~6 입력");
			num1 = sc.nextInt();

			switch (num1) { // 번호에 따라 case를 나눈다
			case 1:
				starexam.starOne();
				break;

			case 2:
				starexam.starTwo();
				break;

			case 3:
				starexam.starThree();
				break;

			case 4:
				starexam.starFour();
				break;

			case 5:
				starexam.starFive();
				break;

			case 6:
				starexam.starSix();
				break;

			default: // 다른 값이 들어올 경우
				System.out.println("잘못 입력했습니다.");
			}
			System.out.println("다시 하시겠습니까? (Y/N)");
			replay = sc.next(); // 비교할 값을 입력받음
		} while (replay.equals("y") || replay.equals("Y"));
		// replay가 "y"나 "Y"일 경우 true값으로 do를 반복

		System.out.println("끝났습니다."); // false일 경우 출력 후 종료
	}
}

실행 결과

반응형

+ Recent posts