wisePocket

[Algorithm] 출생년도를 구해주는 계산기 만들기 본문

Java & Algorithm/Algorithm Practice

[Algorithm] 출생년도를 구해주는 계산기 만들기

ohnyong 2023. 8. 1. 22:43

계산기의 기본 틀을 익힌 이후로 나만의 정해진 규칙이 생겼다.

핵심이 되었던 연습 과정은 아래 두개 과정이다.
물론 이 구조가 이제 Java를 배우면서 더 깊게 변경 될 예정이다.
하지만 해당 카테고리 페이지는 
알고리즘 문제 해결을 하기 위한 연습이 주 목적이라서
기본적으로 내가 객체 인스턴스화를 통해 메서드 호출을 구분하면서 
"연산"에 집중 할 수 있는 나만의 틀로 활용하고자 한다.
 
https://ohnyong.tistory.com/177
 [Algorithm★] 4칙연산을 해주는 계산기 - 객체 지향 - 혼자 만들기+ChatGPT의 피드백 받기

https://ohnyong.tistory.com/178
 [Algorithm★] 4칙연산을 해주는 계산기 - 객체 지향 - 혼자 만들기+ChatGPT의 피드백 적용

 

객체 지향형 계산기를 외운 토대로, 내가 정한 규칙에 따라 알고리즘 연습 문제를 풀이해보고자 한다.

이 두과정으로 종료된다. 변경되는 것은 결국 변수, 연산식이 얼마나 복잡하거나 생각해야 하는 것이지. 기본적으로 프로그램이 돌아가는 구조는 위처럼 고정하여 작업하고 있다. 이 방식의 틀이 외어져서 문제를 보면 일단 기본 구조부터 잡고 연산에 대해서 생각하는 것이 오히려 로직에만 집중 할 수 있어서 빠르게 문제를 해결 할 수 있는 장점이 있었다.

 

1. 문제 파악 과정
 - 필요 데이터 파악
    +--- 데이터 타입 확인

 - 필요 메서드 파악
    +--- 기본 입력부 input(){} 
             +-- 입력 값 갯수 확인
             +-- 데이터 제한조건 파악(유효성검사 while loop)
    +--- 기본 계산부 calculate(){}
             +-- 필요 연산 확인
             +-- 필요 조건 확인
    +--- 기본 출력부 output(){}
             +-- 출력할 데이터, 내용 확인
    +--- 각 메서드 별 파라미터 전달 필요 부분 확인
 
2. 코드 작성 과정
 - Main.java 실행부 생성 , Solution.java 클래스(설계도) 생성

 - 클래스 member 구현
    +--- 필요 데이터 정리에 따라 변수 선언
    +--- 기본 생성자 선언
    +--- 필요 메서드 정리에 따른 메서드 선언
             +-- input(){}과 관련된 메서드부터 작성, 유효성 체크(진입부 메서드)
             +-- calculate(){}의 실제 연산 로직 작성
             +-- output(){}의 출력 관련 정리

 - 실행부 Main.java에서 객체 인스턴스 생성 및 객체로부터 진입부 메서드 호출

 


1. Main.java

package Algorithm02;

public class Main {
    public static void main(String[] args) {
        System.out.println(
                "[문제]머쓱이는 40살인 선생님이 몇 년도에 태어났는지 궁금해졌습니다.\n" +
                "나이 age가 주어질 때,\n" +
                "2022년을 기준 출생 연도를 return 하는 solution 함수를 완성해주세요.\n" +
                "\n" +
                "제한사항 0 < age ≤ 120\n" +
                "나이는 태어난 연도에 1살이며 1년마다 1씩 증가합니다.\n");


        Solution solution = new Solution();
        solution.inputAge();
    }
}

 

2. Solution.java

package Algorithm02;

import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.Scanner;

public class Solution {
    int age; //입력 나이 //0<age<=120 //0=0+1=1살
    int birthYear; //출생 년도
    int currentYear; //현재 년도
    int result; //계산결과 = ????년생
    Scanner sc = new Scanner(System.in);

    public Solution() {
        //기본 생성자

    }

    //필요한 함수
    //inputAge(){}; 나이 입력
    //유효성검사 나이입력 범위 0<age<=120만 허용
    //calculate(){}; 나이 계산 = currentYear - (age -1) = birthYear //ex) 2023-(36-1) =
    //outputBirthYear(){} 계산 결과 알려주기

    void inputAge() {
        while (true) {
            int age;
            System.out.println("출생년도를 알고싶은 사람의 나이를 입력하세요");
            age = sc.nextInt();
            if (age < 0 || age >= 120) {
                System.out.println("나이는 1~120까지만 입력 할 수 있습니다.");
                continue;
            }else {
                calculate(age);
                outputBirthYear(result);
                break;
            }
        }
    }

    void calculate(int age) {
        LocalDate now = LocalDate.now();
        int currentYear = now.getYear();

        result = currentYear - (age-1);
    }

    void outputBirthYear(int result) {
        System.out.println("당신은 "+result+"년생입니다.");
    }
}