목차
1. 아래 코드의 출력 결과를 작성하시오.
// Java
class A { public void foo() { System.out.println("Class A"); } }
class B extends A { public void foo() { System.out.println("Class B"); } }
class Main {
public static void main(String[] args) {
A obj = new B();
obj.foo();
}
}
// C++
class A { public : void foo() { std::cout << "Class A" << std::endl; } }
class B : public A { public : void foo() { std::cout << "Class B" << std::endl; } }
int main(){
A* obj = new B();
obj->foo();
delete obj;
return 0;
}
Java : Class B / C++ : Class A
2. 위 문제의 두 출력값이 다른 이유를 JAVA와 C++의 차이점을 이용하여 서술하고, 두 출력값이 같아지도록 C++ 코드의 class A를 수정하시오.
Java의 메서드는 기본적으로 virtual이지만, C++에서는 virtual 키워드를 명시적으로 사용해야한다.
A* obj = new B()를 통해 불러진 foo()함수 결과가 A의 foo()가 호출되는 것을 볼 수 있는데, 그 이유는 컴파일러가 포인터의 타입을 보고 타입에 맞는 메서드를 찾아주기 때문이다.
그러나 A의 foo 메서드 앞에 virtual 키워드를 붙인다면, B의 foo()가 호출된다.
=> 상속 후 오버라이드 된 객체에 대해 사용해야 할 때 virtual 키워드를 사용한다.
Java는 선언된 타입에 상관 없이 생성된 객체의 함수를 바로 호출한다.
참고 : https://marobiana.tistory.com/84
C++ 의 virtual 함수. 가상화. JAVA랑 C++의 차이점
가상화에 대해서 검색해보다가 사소하게 생각하며 지나친 부분에대해 새로이 알게됐다.C++에 있는 virtual 키워드의 용도, 그리고 JAVA와의 차이점을 알게 되었다. 1. C++에서의 상속 class Parent { public
marobiana.tistory.com
3. 노드가 v, 간선이 e인 그래프 g를 인접행렬, 인접리스트에 저장했다고 할때 DFS를 실행하면 시간복잡도는?
인접 행렬과 인접 리스트는 각각 다음과 같이 DFS를 수행할 때 시간 복잡도가 달라진다.
- 인접 행렬: 인접 행렬은 각 노드마다 모든 다른 노드들과의 연결 여부를 저장하기 때문에, 한 노드에서 다른 모든 노드들을 방문하기 위해서는 모든 열을 뒤져야 합니다. 따라서 DFS 수행 시간은 O(V^2) 입니다.
- 인접 리스트: 인접 리스트는 각 노드마다 해당 노드와 직접적으로 연결된 노드들의 리스트를 저장하기 때문에, 한 노드에서 방문 가능한 다른 노드들을 찾기 위해선 해당 노드와 연결된 모든 노드들을 방문하면 됩니다. 따라서 DFS 수행 시간은 O(V+E) 입니다.
DFS가 총 N번 호출되긴 하지만 인접행렬과 달리 인접 리스트로 구현하게 되면 DFS하나당 각 정점에 연결되어 있는 간선의 개수만큼 탐색을 하게 되므로 예측이 불가능 하다. 하지만 DFS가 다 끝난 후를 생각하면, 모든 정점을 한번씩 다 방문하고, 모든 간선을 한번씩 모두 검사했다고 할 수 있으므로 O(n+e)의 시간이 걸렸다고 할 수 있다.
따라서 시간복잡도는 O(n+e)이다.
4. [1,-1,0,0] [1,0,-1,0] [1,0,0,-1] [0,1,0,-1] [0,1,-1,0] [0,0,1,-1] 최대 독립벡터의 개수와 그 이유를 설명하시오.
3개.
5. 다음 내용을 영어 3문장으로 요약하시오.
https://spectrum.ieee.org/how-chatgpt-could-revolutionize-academia