반응형

  별 그리기

파이썬의 print옵션 중 format과 % 옵션을 사용하여 역삼각형을 그리도록 하겠습니다.

역삼각형을 그리기전 print에 대한 이해와
format, % 문자열 포맷팅에 대해 간단히 이해하고 이 두개를 사용하여 별 그리기를 진행하도록 하겠습니다.

포맷팅이란?

bskyvision.com/820

 

[python] 문자열 포맷팅이란? 3가지 문자열 포맷팅 방법들

문자열 포맷팅(string formatting)은 문자열 속 특정한 위치에 특정한 값을 삽입해 주는 것을 의미합니다. 만약에 문자열 중에 일부가 변할 수 있는 가능성이 있는 경우 문자열 포맷팅을 통해 그 부분

bskyvision.com

1. format옵션의 사용 예

format이란 {}를 이용한 포매팅 방법입니다.

출력에 대해 서식을 지정하고 그 서식에 값을 대입하는 것으로 아래와 같이 사용할 수 있습니다.

print("실행결과: {0}, {1}".format("1번", "2번"))

실행결과: 1번, 2번 

2. %옵션의 사용 예

%옵션은 format옵션과 마찬가지로 문자열 포맷팅 기술입니다.
대입하려는 값의 타입과 길이를 지정할 수 있으며 아래와 같이 사용할 수 있습니다.

print("실행결과: %s, %s"%("1번", "2번"))


실행결과: 1번, 2번

 

3. 두 가지를 혼합하여 print하기

print("실행결과: %{0}s".format(5)%"ab")
실행결과:    ab

format을 통해 값이 들어간 후 %옵션이 실행되기 때문에 위와 같이 사용 가능 

 

  구현

replayCount = 0;
star = "*";
replayCount = int(input("몇 번 반복하시겠습니까? "));

for i in range(0,replayCount,1):
    print("%{0}s".format(replayCount)%star);
    star+="*";
반응형
반응형

  자바 별 그리기(역삼각형)

자바에는 출력을 위해 System.out.pruint, println, printf 등 다양한 방법을 사용하여 출력할 수 있다.

그중 printf를 사용하면 쉽게 역삼각형을 그릴 수 있다.

printf("%숫자s\n",star)의 의미는 숫자만큼의 범위를 잡고 뒤에서부터 내용을 채우는 것이다.

이를 사용해서 역삼각형을 그리는 예제를 구현해보겠다.

  흐름

우선 별 그리기의 흐름을 정리해보자.

1. 몇 층짜리 별을 그릴지 입력
2. 해당 층수만큼 반복하며 별의 개수 증가
3. 출력이 완료될 경우 종료

  구현

import java.util.*;

public class Star {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		int replayCount = 0;
		String star = "*";
        
		System.out.print("몇층짜리 별을 그리겠습니까?");
		replayCount = sc.nextInt();
		
		for(int i=0;i<replayCount;i++) {
			System.out.printf("%"+replayCount+"s\n",star);
			star += "*";
		}
	}
	
}

  실행결과

결과



  해결방법

입력받은 숫자를 출력할 범위로 잡고 별을 출력하도록 구현

 

여러방식으로 별그리기

2019/06/14 - [자바(JAVA)] - 자바예제 01 - 별 그리기

 

자바예제 01 - 별 그리기

6가지의 경우를 가진 별 그리기 예제입니다. 1번 경우 ***** ***** ***** 2번 경우 * ** *** 3번 경우 --* -** *** 4번 경우 --*  -*** ***** 5번 경우 --*  -*** ***** -*** --* 6번 경우: 숫자를 입력받아 해..

gilu-world.tistory.com

 

반응형
반응형

 문제설명

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

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

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도를 하여 문제를 해결했습니다.

반응형
반응형

 

# 은행 프로그램
import os

# 파일 입출력 방식
file = "C:/Py3/Bank.txt"
#f = open(file,"r")
all_id = list()


#한 사람의 계좌정보를 담아서 관리할 목적으로 구현되는 클래스
class Account:
    def __init__(self, userid= "", name = "", balance=0):        # 생성자
        if(userid == ""):
            self.userid = input("계좌번호 = ")
            self.name = input("고객이름 = ")
            self.balance = int(input("예금금액 = "))
        else:
            self.userid = userid
            self.name = name
            self.balance = balance
            
    # 출력함수
    def disp(self):            
        print("계좌번호:{0}\t이름: {1}\t잔액: {2}".format(self.userid, self.name, self.balance))
    
    # 데이터 호출 함수
    def info(self):
        return "{0}:{1}:{2}\n".format(self.userid, self.name, self.balance)
    
    # 
    def getid(self):
        return self.userid
    
    # 입금
    def deposit(self, money):
        self.balance += money
        return self.balance
    
    # 출금
    def withdraw(self, money):
        if self.balance < money:
            return 0
        else:
            self.balance -= money
            return money
    
    # 잔액 조회
    def getBalance(self):     
        return self.balance

###########################
# 저장된 계좌 파일 호출                 
try:
    f = open(file,"r")
    
    while True:
        line = f.readline()
        if not line:
            break

        a,b,c = line.split(":")
        all_id.append(Account(a,b,int(c)))
    f.close()
except Exception as ex:
    print("파일 없습니다")
    print(ex)
    
###########################
# 화면 초기화                 
def clr():
    os.system('cls')
    
###########################
# 계좌정보를 이용하여 구현될 기능을 담고 있는 클래스 멤버필드 
# 멤버메서드 : makeAccount() - 계좌개설을 담당할 메서드
class BankManager:
    # 출금처리를 담당할 메서드
    def withdraw(self,userid):    
        for i in all_id:
            if i.getid() == userid:
                money = int(input("출금금액 = "))
                return i.withdraw(money)
        print("해당하는 계좌가 없습니다.")
        
    # 입금처리를 담당할 메서드
    def deposit(self,userid):     
        for i in all_id:
            if i.getid() == userid:
                money = int(input("입금금액 = "))
                bal = i.deposit(money)
                print("잔액은 {0} 입니다.".format(bal))
                return 0
        print("일치하는 계좌번호가 존재하지 않습니다")
    
    # 계좌번호의 중복여부를 판단할 메서드
    def new_id(self,user):             
        for i in all_id:
            if i.getid() == user.getid():
                return "입력하신 계좌번호는 이미 존재하는 계좌번호 입니다."
            
        all_id.append(user)
        return "계좌 개설이 완료되었습니다."   
    
    # 전체고객의 계좌정보를 출력할 메서드
    def showAccount(self):             
        if len(all_id) != 0:
            for i in range(0,len(all_id)):
                all_id[i].disp()
        else:
            print("보유한 계좌가 없습니다.")
                 
    # 파일 저장 메서드
    def save(self):
        f = open(file,"w")
        for i in all_id:
            f.write(i.info())
            
        f.close()
            
############################
# 사용자와의 인터페이스를 담당할 목적의 클래스
class BanckingSystem: 
    def run():
        while True:
            print("==== Bank Menu ====")
            print("1. 계좌개설")
            print("2. 입금처리")
            print("3. 출금처리")
            print("4. 전체조회")
            print("5. 프로그램 종료")
            print("===================")
            cho = input("입력: ")
            if cho == "1":       # 계좌개설
                clr()
                print("=======계좌개설=======")
                print(BankManager().new_id(Account()))
                print("===================")
                
            elif cho == "2":     # 입금
                clr()
                print("========입 금========")
                userid = input("계좌번호 =")
                BankManager().deposit(userid)
                print("===================")
                 
                
            elif cho == "3":    # 출금
                clr()
                print("========출 금========")
                userid = input("계좌번호 =")
                a = BankManager().withdraw(userid)
                if a != None:
                    print("{0}원 출금하셨습니다.".format(a))
                
            elif cho == "4":
                clr()
                print("========조 회========")
                BankManager().showAccount()
                print("===================")
                
            elif cho == "5":
                BankManager().save()
                print("종료")
                break

##############################
if __name__ =='__main__':
    BanckingSystem.run()
반응형
반응형

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