[복습] 자료구조 다항식 덧셈

이지현·2023년 4월 13일
0

✔️ Algorithm

💡 고차항부터 저차항 순으로 입력됨, 항은 다항식 2개 모두 3개씩 입력됨

  • read() 메서드 : 사용자로부터 다항식을 입력받음
  • add() 메서드 : 덧셈 연산 수행
  • print() 메서드 : 곱셈 연산이 완료된 최종 다항식을 출력함

✔️ Code

PolynomialImpl.java

public interface PolynomialImpl {
    void read();
    static Polynomial add(Polynomial a, Polynomial b) {
        return new Polynomial();
    }
    void print();
}

Term.java

public class Term {
    private int coef; // 계수
    private int exp; // 지수

    public Term(int c, int e) {
        coef = c;
        exp = e;
    }

    public int getCoef() {
        return coef;
    }

    public void setCoef(int newCoef) {
        coef = newCoef;
    }

    public int getExp() {
        return exp;
    }

    public void setExp(int newExp) {
        exp = newExp;
    }

    @Override
    public String toString() {
        return getCoef() + "x^" + getExp();
    }
}

Polynomial.java

import java.util.Scanner;

public class Polynomial implements PolynomialImpl{
    Scanner sc = new Scanner(System.in);
    private final Term[] termArr; // 0이 아닌 항의 배열
    private int terms; // 0이 아닌 항의 수

    public Polynomial() {
        termArr = new Term[3];
        terms = termArr.length;
    }

    // 다항식 입력
    @Override
    public void read() {
        int c = 0, e = 0;
        for(int i = 0; i < termArr.length; i++) {
            termArr[i] = new Term(c, e);
        }
        for (Term term : termArr) {
            term.setCoef(sc.nextInt());
            term.setExp(sc.nextInt());
        }
    }

    // 다항식 덧셈 연산
    static Polynomial add(Polynomial a, Polynomial b) {
        Polynomial c = new Polynomial(); // 덧셈 결과 저장할 다항식 c
        int aPos = 0, bPos = 0, cPos = 0;
        int coef = 0, exp = 0;
        int at = a.terms, bt = b.terms; // a와 b의 항의 개수

        while((aPos < at) && (bPos < bt)) {
            if(a.termArr[aPos].getExp() == b.termArr[bPos].getExp()) { // a와 b가 같을 때
                c.termArr[cPos] = new Term(coef, exp);
                c.termArr[cPos].setCoef(a.termArr[aPos].getCoef() + b.termArr[bPos].getCoef());
                c.termArr[cPos].setExp(b.termArr[bPos].getExp());
                aPos++; bPos++; cPos++;
            }
            else if(a.termArr[aPos].getExp() < b.termArr[bPos].getExp()) { // b가 더 클 때
                c.termArr[cPos].setCoef(b.termArr[bPos].getCoef());
                c.termArr[cPos].setExp(b.termArr[bPos].getExp());
                aPos++; bPos++; cPos++;
            }
            else { // a가 더 클 때
                c.termArr[cPos].setCoef(a.termArr[aPos].getCoef());
                c.termArr[cPos].setExp(a.termArr[aPos].getExp());
                aPos++; bPos++; cPos++;
            }
        }
        return c;
    }

    // 결과값 출력
    @Override
    public void print() {
        for(int i = 0; i < termArr.length; i++) {
            if(i == termArr.length-1) {
                System.out.print(termArr[i].toString());
            }
            else {
                System.out.print(termArr[i].toString() + " + ");
            }
        }
        System.out.println();
    }
}

PolyAddApp.java

public class PolyAddApp {
    public static void main(String[] args) {
        Polynomial poly1 = new Polynomial();
        Polynomial poly2 = new Polynomial();
        Polynomial resPoly = new Polynomial();

        System.out.println("첫번째 다항식을 계수-지수 순으로 입력하세요");
        poly1.read();
        System.out.print("다항식 1 : ");
        poly1.print();
        System.out.println("두번째 다항식을 계수-지수 순으로 입력하세요");
        poly2.read();
        System.out.print("다항식 2 : ");
        poly2.print();

        resPoly = Polynomial.add(poly1, poly2);
        System.out.println("========================================");
        System.out.print("덧셈 결과 : ");
        resPoly.print();
    }
}


✔️ 수정해야 할 부분

  • 결과 다항식의 항의 개수가 3개 이상일 경우도 고려해야 함
    ➡️ newTerm 메소드를 만들어 배열의 길이를 1칸씩 늘려줌
  • 지수가 고차항부터 저차항 순으로 입력되지 않아도 자동으로 정렬되게 해야 함
    ➡️ 지수를 기준으로 결과 다항식을 내림차순으로 정렬하는 sort 메소드를 만들어야 함
  • 지수가 0이 입력되었을 때 x가 출력되지 않아야 함
profile
느슨하지 않게 꾸준히

0개의 댓글