JAVA 다항식 덧셈계산에서 p1.hapPoly(p2) 구현이 어렵습니다

조회수 1479회

ArrayList 클래스 (정정>> ArrList 입니다)

import java.util.NoSuchElementException;

public class ArrayList<E> { //ArrayList가 아닌 ArrList입니다.
    private E a[];
    private int size;

    public ArrayList() {
        a = (E[]) new Object[1];
        size = 0;
    }

    public E peek(int k) {
        if (size == 0 || k >= size)
            throw new NoSuchElementException();
        return a[k];
    }

    public boolean isEmpty() {
        if (size == 0)
            return true;
        return false;
    }

    public void insertLast(E newItem) {
        if (size == a.length)
            resize(2 * a.length);
        a[size++] = newItem;
    }

    private void resize(int newSize) {
        E[] t = (E[]) new Object[newSize];
        for (int i = 0; i < size; i++)
            t[i] = a[i];
        a = t;
    }

    public void insert(E newItem, int k) {
        if (size == a.length)
            resize(2 * a.length);
        for (int i = size - 1; i >= k; i--)
            a[i + 1] = a[i];
        a[k] = newItem;
        size++;
    }

    public void insert(E newItem) {
        insertLast(newItem);
    }

    public E delete(int k) {
        if (isEmpty())
            throw new NoSuchElementException();
        E item = a[k];
        for (int i = k; i < size; i++)
            a[i] = a[i + 1];
        size--;
        if (size > 0 && size <= a.length / 4)
            resize(a.length / 2);
        return item;
    }

    public void print() {
        for (int i = 0; i < a.length; i++) {
            if (i < size)
                System.out.printf(a[i] + "\t");
            else
                System.out.printf("null\t");
        }
        System.out.println();
    }
}

위 코드를 상속받아 ArrListPoly를 구현해야 합니다.

여기서 int k: 최고 차수 / int[] arr: 다항식의 계수인 메소드 hapPoly 구현방법을 모르겠습니다.

지금까지 작성한 ArrListPoly 클래스와 메인함수는 아래와 같습니다.

import java.util.NoSuchElementException;

class ArrListPoly extends ArrList{
    int highestDegree;
    private int k;
    private int[] arr=new int[20];

    public void setPoly(int highestDegree, int[] arr) {
        int i;
        for(i=arr.length-1;i>=0;i--) {
            super.insertLast(arr[i]);
        }
        this.highestDegree=highestDegree;
    }

    public int getHighestDegree() {
        return this.highestDegree;
    }

    void setPoly(int k){
        this.k=k;
        for(int i=0;i<=k;i++) { this.arr[i] = 0; }
    }

    public int getDegree() { return this.k; }
    public int getArr(int i) { return this.arr[i]; }
    public int setArr(int i, int arr) { return this.arr[i]=arr; }   
}
public class ArrListPolyTest {

    public static void main(String[] args) {
        ArrListPoly p1 = new ArrListPoly();
        int[] poly1 = { 2, 8, -4, 9, 1 };
        int p1highestDegree = poly1.length - 1;
        p1.setPoly(p1highestDegree, poly1);
        printPolyEq(p1, 1);

        ArrListPoly p2 = new ArrListPoly();
        int[] poly2 = { 6, 2, 9 };
        int p2highestDegree = poly2.length - 1;
        p2.setPoly(p2highestDegree, poly2);
        printPolyEq(p2, 3);

        ArrListPoly p3 = p1.hapPoly(p2); // 해당 hapPoly 구현에서 막혔습니다.
        printPolyEq(p3, 1);
    }

    public static void printPolyEq(ArrListPoly p, int nTabs) {
        for (int i = 0; i < nTabs; i++)
            System.out.printf("\t");
        for (int i = p.getHighestDegree(); i >= 0; i--)
            System.out.printf("%+d x%d\t", p.peek(i), i);
        System.out.println();
    }
}

ArrayList가 아닌 ArrList가 맞습니다. 상속받은 것도 ArrList가 맞습니다.

"int k: 최고 차수 / int[] arr: 다항식의 계수"은 메소드 setPoly(k,arr)에서 사용됩니다.

setPoly에서 다항식을 저장하고, hapPoly에서 차수에 맞게 p1과 p2 덧셈 후 새로운 다항식 p3에 저장하려는데 어떻게 해야 할 지 모르겠습니다ㅠㅠ

  • 맨 위에 있는 클래스의 이름이 ArrList인데 잘못 적으신거죠? 편집요청빌런 2020.4.13 15:54
  • 그리고 "int k: 최고 차수 / int[] arr: 다항식의 계수"가 무슨 의미인지, 기대값은 무엇인지를 알아야 답이 가능하겠네요. 편집요청빌런 2020.4.13 16:02
  • 앗 네! 옮기는 도중에 오류가 있었네요... ArrayList가 아닌 ArrList가 맞습니다. 상속받은 것도 ArrList가 맞습니다. "int k: 최고 차수 / int[] arr: 다항식의 계수"은 메소드 setPoly(k,arr)에서 사용됩니다. setPoly에서 다항식을 저장하고, hapPoly에서 차수에 맞게 덧셈 후 새로운 다항식에 저장하려는데 어떻게 해야 할 지 모르겠습니다ㅠㅠ 알 수 없는 사용자 2020.4.13 16:18

1 답변

  • 개념이 잘 안잡혀서 하는 질문인것 같으니 힌트만 드릴께요.

    hapPoly()에서 리스트 두 개를 계산한 결과를 만드려면 (1)일단 hapPoly() 메서드에서 p1p2의 실제 값이 있는 리스트 ArrList.a 에 접근할 수 있어야겠죠. (2)그리고 highestDegree에 접근할 수 있어야 합니다.

        int highestDegree;
    
        public ArrListPoly hapPoly(ArrListPoly p2) {
            System.out.println(this.highestDegree);
            System.out.println(p2.highestDegree);
        }
    

    (2)는 이미 가능하니까 (1)만 다시 보면:

    public class ArrList<E> {
        private E a[];
        private int size;
    
    ...
    
        public int getSize() {
            return this.size;
        }
    }
    
        public ArrListPoly hapPoly(ArrListPoly p2) {
            for (int i = 0; i < super.getSize(); ++i) {
                int ele = (Integer) super.peek(i);
                System.out.println("index: " + i + ", value: " + ele);
            }
    
            for (int i = 0; i < p2.getSize(); ++i) {
                int ele = (Integer) p2.peek(i);
                System.out.println("index: " + i + ", value: " + ele);
            }
            // 여기서 p1(super)와 p2의 a로 뭔가를 함
            // 새 리스트를 만들어서 원하는 값을 할당 후 반환
        }
    

    이런식으로 ArrList에서 메서드를 제공해야 합니다. 이 예시에서는 getSize()라는 메서드만 추가한 뒤 ArrList.peek()을 활용한 방식이구요. 이것 외에 ArrList.a를 직접 반환한다거나 이터레이터를 제공한다거나 하는 방법이 있습니다만, 무슨 방법이 됐든 요지는 hapPoly에서 ArrList.a의 값에 접근할 수 있어야 한다는 겁니다.

    그런 다음에는 해당 값들을 지지고 볶아서 반환하면 됩니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)