wisePocket

[Algorithm] 좌표의 사분면 위치 알려주는 계산기 만들기 본문

Java & Algorithm/Algorithm Practice

[Algorithm] 좌표의 사분면 위치 알려주는 계산기 만들기

ohnyong 2023. 8. 3. 21:18

좌표의 사분면 위치 알려주는 계산기

 

정해진 나의 룰에 따라서 연습 문제를 계속해서 답안을 보지 않고 스스로 풀어보고자 한다.

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

https://ohnyong.tistory.com/178
 [Algorithm★] 4칙연산을 해주는 계산기 - 객체 지향 - 혼자 만들기+ChatGPT의 피드백 적용
 
이번에는 좌표를 입력하면 1,2,3,4 사분면중 어디에 위치하는지 알려주는 프로그램이다. 문제가 길지만 그만큼 조건을 다 주어진다는 점에서 대충보고 작성하다가 1차배열로 해결되는 것을 2차배열로 작성할 뻔 했다. 문제를 유심히보는 버릇을 들여야 겠다.
 
1. 문제 파악 과정
 - 필요 데이터 파악
    +--- 데이터 타입 확인

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

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

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

1. Main.java

이제 Main 부분은 객체 생성 호출 이외엔 남는게 없다.

package Algorithm09;

public class Main {
    public static void main(String[] args) {
        Solution solution = new Solution();
        solution.inputElement();
    }
}

 

 

2. Solution.java

조건 부분을 천천히 생각하면서 풀어냈다. 연산은 이미 제한조건으로 다 주어줬기 때문에 조건을 실수하지 않고 작성하면 된다. 마음이 급해서 조건을 생략하고 보다가 2차 배열을 사용해야하는지 착각했다. 다음부턴 제한 조건을 유의하면서 진행해야 겠다.

package Algorithm09;

import java.util.Scanner;

public class Solution {
    /*문제 설명
사분면은 한 평면을 x축과 y축을 기준으로 나눈 네 부분입니다.
사분면은 아래와 같이 1부터 4까지 번호를매깁니다.
스크린샷 2022-07-07 오후 3.27.04 복사본.png

x 좌표와 y 좌표가 모두 양수이면 제1사분면에 속합니다.
x 좌표가 음수, y 좌표가 양수이면 제2사분면에 속합니다.
x 좌표와 y 좌표가 모두 음수이면 제3사분면에 속합니다.
x 좌표가 양수, y 좌표가 음수이면 제4사분면에 속합니다.
x 좌표 (x, y)를 차례대로 담은 정수 배열 dot이 매개변수로 주어집니다.
좌표 dot이 사분면 중 어디에 속하는지 1, 2, 3, 4 중 하나를 return 하도록 solution 함수를 완성해주세요.*/
    //    dot의 길이 = 2
    //    dot[0]은 x좌표를, dot[1]은 y좌표를 나타냅니다
    //-500 ≤ dot의 원소 ≤ 500
    //    dot의 원소는 0이 아닙니다.

    //필요한 데이터
    //int x 입력 y 입력 2개
    //x, y 2개 값을 담는 배열
    //////////// [{x,y}, {x,y}, ... ] XXXX
    //////////// 그럼 가변배열이여야 되는가. XXXX
    //////////// 배열의 [n][0] idx = x XXXX
    //////////// 배열의 [n][1] idx = y XXXX
    // 제한조건을 늦게 봤다. 1차배열로 진행
    // [{x}, {y}] <- 1개의 배열, length = 2
    // 단건으로 찍어내는 것이다. 착각함.

    //연산은
    //x>0 && y>0 = 1 + "사분면"
    //x<0 && y>0 = 2 + "사분면"
    //x<0 && y<0 = 3 + "사분면"
    //x>0 && y<0 = 4 + "사분면"

    //메서드는 input x, y
    //계산 calculate(){}
    //output(){}

    int x;
    int y;
    String locationStr = "사분면";
    int[] arr;
    int locationNum;
    Scanner sc = new Scanner(System.in);

    public Solution() {

    }

    void inputElement() {
        //System.out.println("몇개의 점을 찍으시겠습니까?"); //배열의 크기 설정
        //arrSize = sc.nextInt();
        System.out.println("좌표의 x값을 입력하십시오.");
        arr = new int[2];
        while (true) {
            x = sc.nextInt();
            if (x < -500 && x > 500) {
                System.out.println("좌표 값은 -500~500 사이의 값을 입력해주십시오.");
                continue;
            }
            arr[0] = x;
            break;
        }

        System.out.println("좌표의 y값을 입력하십시오.");
        while (true) {
            y = sc.nextInt();
            if (y < -500 && y > 500) {
                System.out.println("좌표 값은 -500~500 사이의 값을 입력해주십시오.");
                continue;
            }
            arr[1] = y;
            break;
        }
        System.out.println("입력한 값은 [" + x + ", " + y + "] 입니다.");
        calculate(arr);
    }

    void calculate(int[] arr) {
        //x>0 && y>0 = 1 + "사분면"
        //x<0 && y>0 = 2 + "사분면"
        //x<0 && y<0 = 3 + "사분면"
        //x>0 && y<0 = 4 + "사분면"
        if (arr[0] > 0 && arr[1] > 0) {
            locationNum = 1;
        } else if (arr[0] < 0 && arr[1] > 0) {
            locationNum = 2;
        } else if (arr[0] < 0 && arr[1] < 0) {
            locationNum = 3;
        } else {
            locationNum = 4;
        }
        outputLocation(locationNum);
    }

    void outputLocation(int locationNum) {
        System.out.printf("입력한 좌표의 위치는 %d%s 입니다.", locationNum, locationStr);
    }
}