8 minute read


1. 현재 날짜와 시간 출력 - Calendar, Vector, LinkedList, StringTokenizer, ScannerPermalink

- 자바 애플리케이션이 실행될 때 시스템 날짜와 시간 정보를 다음과 같이 출력
- Calendar 클래스 활용
- 출력 결과 예)
    - 2023년 5월 1일
    - 13시 30분 20초
  • Calendar 클래스의 특징
    • java.util 패키지
    • 시간과 날짜 정보를 저장하고 관리
      • 년, 월, 일, 요일, 시간, 분, 초, 밀리초, 오전 오후 등
      • Calendar 클래스의 get()과 set()에서 사용하는 상수
  • 매우 간단한 예제이다. Calender 클래스를 활용하여 출력해보자.
field mean field mean
YEAR 년도 DAY_OF_MONTH 한 달의 날짜
MONTH 달(0~11 이므로 +1 해줘야 함) DAY_OF_WEEK 한 주의 요일
HOUR 시간(0~11) AM_PM 오전 / 오후 구분
HOUR_OF_DAY 24시간 기준 시간 MINUTE
SECOND MILLISECOND 밀리 초
Practice (1) 현재 날짜와 시간 출력 - 소스 코드 (클릭)
import java.util.Calendar;

public class _1_printDayAndTime {

    public static void main(String[] args) {
        
        // Calender 생성
        Calendar cal = Calendar.getInstance();
        
        // Month 는 default 가 0~11 로 정의 되어 있어 1월부터 12월을 표현하려면 +1을 해주어야 한다. 
        System.out.println(cal.get(Calendar.YEAR) + "년 " + (cal.get(Calendar.MONTH) + 1) + "월 " + cal.get(Calendar.DAY_OF_MONTH) + "일 ");
        System.out.println(cal.get(Calendar.HOUR) + "시 " + cal.get(Calendar.MINUTE) + "분 " + cal.get(Calendar.SECOND) + "초 ");
    }
}

1_printDayAndTime_Procdess
Practice 1 실행 결과



2. 문자열을 날짜 데이터로 변경 - CalendarPermalink

- 문자열을 다음과 같이 입력
  - “2023/05/01” 또는 “2020/5/1”, “21/05/01”
  - 년/월/일 을 추출하고 날짜 데이터로 변경하시오.

1번에서 해본 것 처럼 Calendar 클래스를 활용하여 작성해보자.

Practice (2) 문자열을 날짜로 변경 - 소스 코드 (클릭)
import java.util.Calendar;
import java.util.Scanner;

public class _2_StringToDay {
    public static void main(String[] args) {

        Scanner scan = new Scanner(System.in);
        Calendar cal = Calendar.getInstance();

        while(true) {
            System.out.println("날짜 입력 (ex. 2023/05/10 ) : ");
            String str = scan.next();

            if (str.equals("exit")) {
                System.out.println("exit");
                break;
            } else {
                String[] split = str.split("/");
                cal.set(Calendar.YEAR, Integer.parseInt(split[0]));
                cal.set(Calendar.MONTH, Integer.parseInt(split[1]));
                cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(split[2]));
            }
            System.out.println("[data] 년도 : " + cal.get(Calendar.YEAR));
            System.out.println("[data] 월 : " + cal.get(Calendar.MONTH));
            System.out.println("[data] 일 : " + cal.get(Calendar.DAY_OF_MONTH));
        }
    }
}

2_StringToDay_Procdess
Practice 2 실행 결과



3. 문자열 회전하기 - LinkedListPermalink

문자열과 정수 입력하여, 정수(양수, 음수)만큼 회전하는 문자열 출력
0 입력 시 종료.
  • 출력 예시: 3_outputEX_Procdess
    Practice 3 출력 예시
Practice (3) 문자열 회전하기 - 소스 코드 (클릭)
import java.util.LinkedList;
import java.util.Scanner;

public class _3_RollString {

    public static StringBuilder sb = new StringBuilder();

    // 연결리스트를 구분자 없는 String 으로 변환
    public static String TempAsString(LinkedList<Character> temp) {
        for (Character i : temp) {
            sb.append(i);
        }
        String tempAsString = sb.toString();
        return tempAsString;
    }

    public static void roll(String str, int n) {
        // n 값으로 0 입력시 바로 종료.
        if (n == 0) {
            System.out.println("종료함");
            return;
        }

        LinkedList<Character> list = getCharacters(str);
        LinkedList<Character> temp = (LinkedList<Character>) list.clone();

        System.out.println("초기 문자열 : " + list);
        int num = 0;

        // 입력된 정수 n 이 문자열 길이와 나누어 떨어지면 회전 중 초기 리스트와 같아지는 순간 회전 종료.
        if (str.length() % n == 0) {
            // n 이 양수인 경우.
            if (n > 0) {
                do {
                    num = rollingIfPositive(str, n, temp, num);
                } while (temp.getFirst() != list.getFirst());
            }
            // n이 음수인 경우. (n = 0 인 경우는 함수 초반에 미리 제외)
            else {
                do {
                    num = rollingIfNegative(str, n, temp, num);
                } while (temp.getFirst() != list.getFirst());
            }
            System.out.println(n + "이 문자열의 길이와 나누어 떨어지므로 처음과 같은 문자열 생성시 종료");
        }
        // 문자열의 길이가 n으로 나누어 떨어지지 않을 때
        else {
            // n 이 양수인 경우.
            if (n > 0) {
                // 다음 이동할 list(char) 범위에 초기 리스트의 첫번째 요소가 존재하면 종료
                boolean eval = true;
                int gen = 0;
                while(eval) {
                    if (num > 1) {
                        for (int i = 0; i < n; i++) {
                            if (temp.get(i) == list.get(0)) {
                                gen = i;
                                eval = false;
                                break;
                            }
                        }
                    }
                    if (eval == false) {
                        break;
                    }
                    num = rollingIfPositive(str, n, temp, num);
                }
                System.out.println("한번 더 회전시 " + "'" + temp.get(gen) + "'" + " 이(가) |" + n + "| 범위의 list 뒤 쪽으로 가기에 종료");
            }
            // n이 음수인 경우. (n = 0 인 경우는 함수 초반에 미리 제외)
            else {
                do {
                    num = rollingIfNegative(str, n, temp, num);
                } while (temp.get(temp.size() - (str.length() % n)) != list.getFirst());
                System.out.println("한번 더 회전시 " + "'" + temp.get(temp.size() - (str.length() % n)) + "'" + " 이(가) |" + n + "| 범위의 list 앞 쪽으로 오기에 종료");
            }
        }
    }

    private static int rollingIfNegative(String str, int n, LinkedList<Character> temp, int num) {
        num++;
        System.out.println(num + "번째 회전");
        System.out.println("<중간 과정>");
        // n 만큼 삭제 후 연결리스트의 뒤에 삽입
        for (int i = n; i < 0; i++) {
            temp.addFirst(temp.removeLast());
            System.out.println("remove last & add first = " + temp);
        }
        System.out.println("</중간 과정>");
        System.out.println(num + "번째 회전 끝: " + TempAsString(temp));
        // sb 초기화
        sb.delete(0, str.length());
        System.out.println("--------------------------------");
        return num;
    }

    private static int rollingIfPositive(String str, int n, LinkedList<Character> temp, int num) {
        num++;
        System.out.println("\n--------------------------------");
        System.out.println(num + "번째 회전");
        System.out.println("<중간 과정>");
        // n 만큼 삭제 후 연결리스트의 뒤에 삽입
        for (int i = 0; i < n; i++) {
            temp.add(temp.removeFirst());
            System.out.println("remove first & add last = " + temp);
        }
        System.out.println("</중간 과정>");
        System.out.println(num + "번째 회전 끝: " + TempAsString(temp));
        // sb 초기화
        sb.delete(0, str.length());
        System.out.println("--------------------------------\n");
        return num;
    }

    private static LinkedList<Character> getCharacters(String str) {
        LinkedList<Character> list = new LinkedList<>();

        // string을 list 에 char 형으로 삽입
        for (int i = 0; i < str.length(); i++) {
            list.add(str.charAt(i));
        }
        return list;
    }

    public static void main(String[] args) {

        Scanner scan = new Scanner(System.in);

        System.out.println("문자열 입력 : ");
        String str = scan.next();

        System.out.println("문자열의 길이와 같거나 작은 정수 입력 : ");
        int n = scan.nextInt();
        roll(str, n);
    }
}

3_rollstrForBlog_Procdess 3_rollstrForBlog3_Procdess 3_rollstrForBlog2_Procdess 3_rollstrForBlog4_Procdess



3_zero_ProcdessPractice 3 0 입력 시 종료



4. 문자열 입력으로 계산 후 결과 출력 - Vector , StringTokenizer, ScannerPermalink

문자열 입력 예: “35+40-543-42+42-23”


• 입력되는 문자열은 매번 변경 가능
• 길이 제한 없음
• Vector, StringTokenizer, Scanner 등 클래스 사용
• 연산은 덧셈과 뺄셈만 가능
• 앞에 있는 연산부터 순차적으로 진행
• 35++40과 같이 입력되면 프로그램 종료

  • 출력 예시
  • 4_inputStringCalculate_Procdess
    Practice 4 출력 예시 / 결과
Practice (4) 문자열 입력으로 계산 후 결과 출력 - 소스 코드 (클릭)
import java.util.Scanner;
import java.util.StringTokenizer;
import java.util.Vector;

public class _4_inputStringCalculate {
    /**
     * 실습 #4) 문자열 입력으로 계산 후 결과 출력
     * • 문자열 입력 예: “35+40-543-42+42-23”
     * • 입력되는 문자열은 매번 변경 가능
     * • 길이도 제한없음
     * • Vector<E>, StringTokenizer, Scanner 등 클래스 사용
     * • 연산은 덧셈과 뺄셈만 가능
     * • 앞에 있는 연산부터 순차적으로 진행
     * • 35++40과 같이 입력되면 프로그램 종료
     */

    public static int calc(String str) {
        Vector<String> num = tokensToVector(str);
        int sum = 0;

        if (error(num) == 0) {

            sum = Integer.parseInt(num.get(0));

            for (int i = 1; i < num.size(); i++) {

                switch (num.get(i)) {
                    case "+":
                        System.out.println("+ 연산 실행 : " + sum + "+" + Integer.parseInt(num.get(i + 1)));
                        sum = sum + Integer.parseInt(num.get(i + 1));
                        System.out.println("+ 결과: " + sum);
                        break;
                    case "-":
                        System.out.println("- 연산 실행 : " + sum + "-" + Integer.parseInt(num.get(i + 1)));
                        sum = sum - Integer.parseInt(num.get(i + 1));
                        System.out.println("- 결과: " + sum);
                        break;
                }
            }
        } else System.out.println("error code: " + error(num));
        return sum;
    }

    private static Vector<String> tokensToVector(String str) {
        // returnDelims: true로 하여 구분자인 "+", "-" 까지 token 으로 설정.
        StringTokenizer st = new StringTokenizer(str, "+-", true);
        Vector<String> num = new Vector<>();

        System.out.println("\n-----------------------");
        System.out.println("남아있는 Token의 개수: " + st.countTokens());

        while (st.hasMoreTokens()) {
            num.add(st.nextToken());
        }
        System.out.println(num);
        System.out.println("남은 토큰의 개수 = " + st.countTokens());
        System.out.println("-----------------------\n");
        return num;
    }

    private static int error(Vector<String> num) {

        int errorCode = 0;
        for (int i = 0; i < num.size(); i++) {

            if (num.get(0).equals("+") || num.get(0).equals("-")) {
                System.out.println("\n---------!!!ERROR!!!---------");
                System.out.println("연산자 우선 사용으로 종료합니다. " + num.get(0) + "\n");
                errorCode = 1;
                break;
            }
            else if (num.get(i).equals("+") && num.get(i).equals(num.get(i + 1))) {
                System.out.println("\n---------!!!ERROR!!!---------");
                System.out.println("연속된 연산자 사용으로 종료합니다. " + i + "번째 " + num.get(i) + " 와 " + (i + 1) + "번째 " + num.get(i + 1) + "\n");
                errorCode = 2;
                break;
            }
            else if (num.get(i).equals("-") && num.get(i).equals(num.get(i + 1))) {
                System.out.println("\n---------!!!ERROR!!!---------");
                System.out.println("연속된 연산자 사용으로 종료합니다. " + i + "번째" + num.get(i) + " 와 " + (i + 1) + "번째" + num.get(i + 1) + "\n");
                errorCode = 3;
                break;
            }
        }
        return errorCode;
    }


    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        do {
            System.out.println("esc 입력 시 종료");

            System.out.println("실행할 연산이 포함된 문자열 입력: ");
            String str = scan.next();

            if (str.equals("esc")) {
                System.out.println("종료");
                break;
            }

            System.out.println("\n---------------------\n연산 결과 : " + calc(str));
            System.out.println("---------------------\n");
        }while(true);
    }
}



5. 로또 번호 생성기Permalink

lotto_Procdess

로또번호는 자연수 1~45에서 총 7개 숫자를 중복없이 생성



작업 순서
• 1) 숫자 6개를 랜덤으로 추출
• 2) 추출된 수는 오름차순 정렬
• 3) 마지막 보너스 숫자도 랜덤 추출
• 4) 전체 로또번호 출력
• Vector와 같은 컬렉션 사용

  • 출력 예시
  • 5_lotto_Procdess
    Practice 5 출력 예시
Practice (5) 로또 번호 생성기 - 소스 코드 (클릭)
import java.util.Collections;
import java.util.Scanner;
import java.util.Vector;

public class _5_lotto {

    /**
     * • 로또번호는 자연수 1~45에서 총 7개 숫자를 중복없이 생성
     * <p>
     * • 작업 순서
     * • 1) 숫자 6개를 랜덤으로 추출
     * • 2) 추출된 수는 오름차순 정렬
     * • 3) 마지막 보너스 숫자도 랜덤 추출 • 4) 전체 로또번호 출력
     * • Vector<E>와 같은 컬렉션 사용
     */

    // Vector -> String 변환
    public static StringBuilder sb(Vector<Integer> vec) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < vec.size(); i++) {
            if (i == vec.size() - 1) {
                sb.append("+ (Special Number) : ");
            }
            sb.append(vec.get(i));
            sb.append(" ");
        }
        return sb;
    }

    public static Vector<Integer> genNormalNum() {
        Vector<Integer> randVec = new Vector<>(6);

        // randVec 요소의 중복이 없을 때까지 반복
        int rand;
        for (int i = 0; i < randVec.capacity(); i++) {
            // rand = 1~45 까지의 난수 생성
            rand = (int) (Math.random() * 45 + 1);

            if (randVec.contains(rand)) {
//                System.out.println((i + 1) + "번째" + "중복 난수 발견!! : " + rand);
                i--;
                continue;
            }
            randVec.add(rand);
//            System.out.println("추가: " + rand);
        }
        // 오름차순 정렬
        Collections.sort(randVec);

        return randVec;
    }

    public static void main(String[] args) {


        Scanner scan = new Scanner(System.in);
        do {
            System.out.println("ENTER 를 눌러 로또 번호를 생성: ");
            System.out.println("esc 입력 시 종료");

            if ("esc".equals(scan.nextLine())) {
                System.out.println("종료");
                break;
            }

            Vector<Integer> lotto = genNormalNum();

            System.out.println("로또 번호 생성기");
            System.out.println("앞자리 6개 : " + lotto);

            int special = (int) (Math.random() * 45 + 1);
            System.out.println("Special Number : " + special);

            System.out.println("이번 주 당첨 번호!");
            System.out.println("-----------------------------------------");
            lotto.add(special);
            System.out.println(sb(lotto));
            System.out.println("-----------------------------------------");
        }while(!"\n".equals(scan.nextLine()));
    }
}





최대한의 설명을 코드 블럭 내의 주석으로 달아 놓았습니다.

혹시 이해가 안가거나 추가적인 설명이 필요한 부분, 오류 등의 피드백은 언제든지 환영합니다!

긴 글 읽어주셔서 감사합니다. 포스팅을 마칩니다.



처음으로~

Task ListsPermalink

  • 현재 날짜와 시간 출력 - Calendar, Vector, LinkedList, StringTokenizer, Scanner
  • 문자열을 날짜 데이터로 변경 - Calendar
  • 문자열 회전하기 - LinkedList
  • 문자열 입력으로 계산 후 결과 출력 - Vector , StringTokenizer, Scanner
  • 로또 번호 생성기

Tags:

Categories:

Updated:

Comments