가상 소멸자

상속구조에서 생성자는 자식클래스는 자식클래스 생성자를 사용한다.
하지만 소멸자는 가상 소멸자를 사용하는게 좋다.

소멸자를 생성하지 않으면 자식소멸자,부모소멸자 순으로 실행된다.

하지만 부모클래스에 자식클래스를 대입한후 부모클래스를 delete하면 자식클래스의 소멸자가 실행안돼
메모리 릭이 생긴다.

부모클래스 소멸자에 virtual 을 해주면 자식 클래스의 소멸자도 실행시켜준다.

 

#include <iostream>

using namespace std;

class Base
{
public:
	virtual ~Base() {
		cout << "~Base()" << endl;
	}

};

class Derived : public Base
{
private:
	int *m_array;

public:
	Derived(int len)
	{
		m_array = new int[len];
	}

	~Derived() {
		cout << "~Derived" << endl;
		delete[] m_array;
	}

};
int main()
{
	Derived *d = new Derived(5);
	Base *b = d;

	delete b;

	return 0;
}

'개발 소발 > 개발 C++(기초)' 카테고리의 다른 글

c++ vitual,가상함수  (0) 2019.09.30
c++ 정적,동적바인딩  (0) 2019.09.30
c++ override,final,공변 반환값  (0) 2019.09.23
c++ 가상함수와 다형성  (0) 2019.09.23
c++ 다형성의 기본개념  (0) 2019.09.23

override,final,공변 반환값

공변 반환형
Covariant

다형성쓸때 유용하게 쓸 수 있다.

오버로딩(파라미터가 다름)을 하면 상속이 적용안된다.

메소드명 뒤 override 사용하기!

오버라이드 할려했는데 실수로 오버로딩할 수 있다.

그걸 체크하려면 메소드 명 뒤에 override를 붙여준다.

class A {
virtual void printOverride(int x)  const{ cout << "A" << endl; }
}

class B : public A{
void printOverride(int x)  const override { cout << "B" << endl; }
}



메소드명 뒤 final 사용하기!

하위 클래스가 override하지 않게 하고싶을 수 있다.

상위 클래스 메소드명 뒤에 final을 붙여주면 오버라이드 할 수 없다.

virtual void printFinal(int x) final { cout << "A" << endl; }




반환값이 다르면 오버라이딩 안되지만

반환값이 부모자식관계면 오버라이딩이 된다.

오버라이딩은 되지만 부모 인스턴스에 자식을 대입하면 부모클래스가 출력된다.

class A{
	virtual A *getThis() { return this; }
};
class B : public A{
	B *getThis() { return this; }
};

 

코드 내용

#include <iostream>

using namespace std;

class A
{
public:
	virtual void printOverride(int x)  const{ cout << "A" << endl; }
	
	//final을 붙이면 오버라이드 할 수 없다.
	virtual void printFinal(int x) final { cout << "A" << endl; }
	
	void print() { cout << "A" << endl; }
	virtual A *getThis() { return this; }
};

class B : public A
{
public:
	void printOverride(int x)  const override { cout << "B" << endl; }
	
	//에러난다.
	//virtual void printFinal(int x) { cout << "B " << endl; }
	
	void print() { cout << "B" << endl; }
	B *getThis() { return this; }
};
int main() {

	A a;
	B b;
	
	A &ref = b;
	b.getThis()->print();
	ref.getThis()->print();

	cout << typeid(b.getThis()).name() << endl;
	//부모클래스가 출력된다.
	cout << typeid(ref.getThis()).name() << endl;
	return 0;
}

'개발 소발 > 개발 C++(기초)' 카테고리의 다른 글

c++ 정적,동적바인딩  (0) 2019.09.30
c++ 가상소멸자  (0) 2019.09.23
c++ 가상함수와 다형성  (0) 2019.09.23
c++ 다형성의 기본개념  (0) 2019.09.23
c++ 상속받은 함수를 오버라이딩하기  (0) 2019.08.30

가상함수와 다형성

다형성은 상속구조와 virtual을 사용한다.

virtual을 붙인 함수는 가상함수라고 부른다.

A,B,C,D 4가지 클래스를 생성하고 상속을 해보았다.

A의 포인터,Reference를 사용하며 A클래스의 메소드에 virtual을 사용하게 되면

자식클래스들은 모두 영향을 받는다.

즉, 가장 상위클래스의 virtual이 되면 밑에 클래스 모든 메소드도 virtual로 인식되게 된다.

상위클래스에만 있어도 되지만 형식적으로 자식클래스에도 virtual을 사용해놓는다.

오버라이딩한걸 인식하기 위해서 이다.

virtual 키워드는 스택처럼 차곡차곡 쌓는게 아닌 테이블을 찾는 과정이다.

찾아가는 과정이 있기에 속도가 느리다.

 

#include <iostream>
#include <string>

using namespace std;
class A
{
public:
	virtual void print() {
		cout << "A" << endl;
	}
};

class B : public A
{
public:
	void print() {
		cout << "B" << endl;
	}
};

class C : public B
{
public:
	void print() {
		cout << "C" << endl;
	}
};
class D : public C
{
public:
	void print() {
		cout << "D" << endl;
	}
};

int main()
{
	A a;
	B b;
	C c;
	D d;

	//포인터도 사용가능
	//가장 상위클래스에 virtual이 선언되어 있으면 모두 영향 받는다.
	A &ref = c;
	ref.print();

	return 0; 
}

'개발 소발 > 개발 C++(기초)' 카테고리의 다른 글

c++ 가상소멸자  (0) 2019.09.23
c++ override,final,공변 반환값  (0) 2019.09.23
c++ 다형성의 기본개념  (0) 2019.09.23
c++ 상속받은 함수를 오버라이딩하기  (0) 2019.08.30
c++ 상속과 접근지정자  (0) 2019.08.30

다형성의 기본개념

자식클래스의 객체에 부모 클래스의 포인터를 사용한다면?

 

부모클래스 *포인터 = 자식클래스;


위처럼 하면 부모클래스의 메소드가 실행된다. 

하지만 virtual을 메소드에 붙여주면 자식 메소드가 실행되게 된다.

	virtual void speak() const
	{
		cout << m_name << " ??? " << endl; 
	}


자식클래스에 메소드가 없으면 부모클래스가 실행된다.

이걸 다형성이라고 부른다.

 

#include <iostream>
#include <string>

using namespace std;

class Animal
{
protected:
	string m_name;

public:
	Animal(string name)
		: m_name(name) {

	}

	string getName() { return m_name; }

	virtual void speak() const
	{
		cout << m_name << " ??? " << endl; 
	}
};

class Cat :public Animal 
{
public:
	Cat(string name)
		:Animal(name) {

	}

	void speak() const
	{
		cout << m_name << " Meow " << endl;
	}
};


class Dog :public Animal
{
public:
	Dog(string name)
		:Animal(name) {

	}

	void speak() const
	{
		cout << m_name << " Woof " << endl;
	}
};
int main() {

	Animal a("Animal");
	Dog d("Dog");
	Cat c("Cat");

	//자식클래스를 부모클래스의 포인터로 캐스팅해서 사용하면
	//자신이 부모클래스인줄 알고 작동한다.
	a.speak();
	d.speak();
	c.speak();

	Animal *a1 = &d;
	Animal *a2 = &c;


	//활용하는 경우
	Cat cats[] = { Cat("cat1"),Cat("cat2"), Cat("cat3"), Cat("cat4"), Cat("cat5") };
	Dog dogs[] = { Dog("dog1"), Dog("dog2") };
	//위에껄 다 확인해볼려면 for문을 사용해야한다.

	Animal *my_animals[] = { &cats[0],&cats[1], &cats[2], &cats[3], &cats[4], &dogs[0], &dogs[1] };

	//부모클래스의 메소드가 실행된다.
	//virtual 을 붙이면 자식클래스인것처럼 실행한다.
	//이런 성질을 다형성이라고 한다.
	for (int i = 0; i < 7; i++)
		my_animals[i]->speak();


	return 0;
}

 

탤런트 코드 – 서평

 

멘토링 프로젝트를 듣게 되어 거기서 독서 추천을 받은 탤런트 코드를 읽게 되었다.

 

큰 주제는 재능에 관한 이야기였다. 대부분의 사람들은 재능이 타고난다고 믿는다.

 

축구선수 중 호날두, 메시를 보면 그런 생각이 들 수도 있다.

 

나도 그렇게 생각하고 있었다.

 

“나와는 다른 세상 이야기겠지? 난 못할 거야”
-내 생각

 

이런 생각으로 스스로의 한계를 정하고 있었다.

 

하지만 축구선수는 호날두, 메시만 있는 게 아니다.

 

생각해보면 예를 들어 프리미어리그, MLB 선수들은 평균적인 선수들도 세계에서 제일 잘하는 선수들인 것이다. 

 

꾸준한 연습으로 뇌에서 자신과 관련된 분야에 미엘린

 

두껍게 하면 누구든 그 분야에 재능을 펼칠 수 있다.

 

 

“지구상의 모든 사람이 아인슈타인처럼 될 수 있는 잠재력이 있다는 말이 아니다.중요한 것은, 재능이 운명인 듯 보일지라도, 사실 어떤 스킬을 습득하고 향상시킬지 결정할 수 있는 권한은 상당 부분 우리에게 있다는 점이다. 우리 각자의 잠재력은 생각보다 크다."
탤런트 코드

 

호날두, 메시처럼 아인슈타인도 천재였는데 그의 뇌를 조사해보니

 

미엘린을 생산하고 유지하는 역할을 하는 아교 세포가 일반인의 두 배였다고 한다.

 

호날두, 메시 같은 사람들은 정말 엄청난 사람이지만

 

그들처럼 아교 세포를 늘리는 방법은 없겠지만

 

우리는 꾸준한 연습으로 우리 분야에 특별한 사람이 될 수 있다!

 

 

 

그런데 여기서 말한 꾸준한 연습이란 무엇일까? 아니 연습이란 무엇일까?

 

책에선 점화와 심층 연습이란 말이 나온다.

 

적절한 점화와 자신의 능력보다 약간 뛰어넘는 것을 심층 연습하고

 

실수를 인정하고 실수를 천천히 고쳐가며 발전하면

 

미엘인 층은 한 겹 한 겹 쌓여간다는 것이다.

 

나는 매번 인터넷 강의를 결제하고 완강한 적이 있었던가?

 

매번 결심하고 작심삼일인 경우가 많지 않았나?

 

생각해보면 적절한 점화와 체계적인 연습을 구성하지 않았었다.

 

적절한 점화, 심층 연습은 환경설정에 영향이 크다고 나온다.

 

왜 천재들은 한곳에 몰려서 태어날까? 다들 유전자가 뛰어나서라고

 

생각하지만 아니다. 아래 내용은 책 내용 일부분이다.

 

브라질 축구를 예로 들면 자신의 나라에선 호나우지뉴, 카카가 배출되었고

 

풋살 하는 문화가 발전하여 다른 나라 사람들보다 공을 만지고

 

연습할 수 있는 기회가 많아진다면 당연히 더 좋은 선수들이 나오지 않을까?

 

또, 박세리가 우승할 때 그걸 지켜본 아이들이 지금 LPGA를 휩쓸고 있다면?

 

이런 것도 점화이다. 우리나라 사람들이 모두 골프를 잘 치는 유전자를 가지고 있지 않는 걸 우린 알고 있지 않은가? 

 

“함께 세계를 창조하고 그것에 대한 글을 공동으로 완성해내는 창의적인 활동은 어린 작가들에게 상당한 즐거움을 주었다. 그것은 훌륭한 놀이였다. 이 놀이에 참여하는 모든 사람은 다른 사람이 쓴 것을 열심히 흡수했고 반응을 보였다.”
마이클 하우

 

 

위에 글은 브론테 자매(유명한 소설가)에 관한 마이클 하우 박사의 말이다.

 

또, 같은 꿈을 가진 사람들이 모이면 주변 사람들도

 

브론테 자매가 같이 연습하면서 성장했던 것처럼 건전한 자극을 받아 조금 더 발전할 수 있지 않을까?

 

 

 

위에서 말한 멘토링 프로젝트에 들어가서 워크숍을 다녀왔는데

 

나에게 개발에 관한 점화장치가 된 것 같다.

 

이젠 심층 연습할 방법을 생각해 매우 매우 발전해보아야겠다!

 

뒷부분엔 스승에 관한 이야기가 나오는데 천재들의 스승은

 

다 엄청난 스승일 거 같지만 조사해보면 엄청난, 보통, 별로 세 가지 중 보통이 많다고 한다.

 

여기서 반전은 교육적으론 보통일지 모르지만,

 

그 스승들은 대부분 제자들에게 관심을 가지고 제자들에게 맞춤으로 연습을 시켜주고

 

또 적절한 자극으로 점화를 시켜준다고 한다.

 

나중에 교육도 해보고 싶은데 위에 스승의 모습을 잊지 말고 있어야겠다.

 

마지막으로 책에서 자극받은 구절이다.

 

 

“다른 학교에서는 부드러운 방법이 효과가 있을지도 모릅니다. 하지만 우리에겐 말 그대로 낭비할 시간이 없습니다.우리 아이들은 뒤처진 채 시작했습니다. 우리는 아이들이 가속도를 얻어 앞서가도록 만들어줘야 합니다. 풋볼 경기로 치면 4쿼터 같은 거죠. 우리는 터치다운을 당했어요. 지금 당장 공격을 시작해서 점수를 내야 합니다.”
탤런트 코드

 

여태까지 너무 놀면서 살았기에 나에겐 너무 공감되는 구절이었다.

 

지금 당장 공격을 시작해야겠다. 그리고 공격을 시작하는 것뿐 아닌 점수를 내야겠다.

 

스스로에게 점화, 심층 연습을 시켜 미엘린 층을 두껍게 만들어야겠다.

 

 

 

 

  • 생산성 향상을 위해선 IDE를 잘 활용해야한다.

    ToolBox

    JetBrains 홈페이지 접속
    Tool Box App을 다운받아서 여러 IDE 설치를 권장한다.

    Intellij IDEA Ultimate 는 유료지만 자바스크립트,스프링,서블릿을 사용할 수 있다.

    프로젝트 생성하기

    GroupID : 프로젝트 그룹을 이야기한다.(스프링)
    ArtifactID : 프로젝트 그룹의 하위 모듈(스프링 시큐리티,MVC)

    메인메소드 생성하고 실행하기

    파일생성 : command + n ,Alt+insert
    메인메소드 : psvm
    System.out.println() : sout
    실행환경 실행 현재 : 맥 Ctrl + Shift + R 윈도우 Ctrl + Shift + f10
    실행환경 실행 이전 : 맥 Ctrl + R  윈도우 Shift + f10

    라인수정하기

    1.라인 복제하기 

맥 command +d 윈도우 Ctrl + d


2.라인 삭제하기 

맥 command +d 윈도우 Ctrl + y


3.문자열 라인 합치기 

맥,윈도우 Ctrl + Shift + j


4.라인 단위 옮기기 
구문 (메소드 안) 

맥 command + shift + 방향키 윈도우 ctrl + shift + 방향키
라인이동  

맥 Option + Shift + 방향키  윈도우 Shift + Alt + 방향키

 

5.Element 단위로 옮기기
구문 (메소드 안) 

맥 option + command + shift + 방향키 윈도우 alt + ctrl + shift + 방향키

코드 즉시보기

1.인자값 즉시 보기
맥 command + p 윈도우 ctrl + p


2.코드 구현부 즉시 보기(직접 안찾아 가도 됌)
맥 option + space 윈도우 Shift + Ctrl + i


3.Doc 즉시 보기
맥 F1 윈도우 ctrl +q

 

초콜릿 하트 드래곤 – 서평

초콜릿 하트 드래곤

소설은 진짜 오랜만에 본 것 같다.

신박사님이 말씀하셔서 바로 샀는데 책 겉포장에 청소년 무슨 소설 분야에서

상을 받았다고 쓰여있어서 내 나이에 봐도 되나 싶었지만…읽어보니 역시는 역시였다.

태풍이 와서 밖에 못 나가는 토요일에 읽었는데 정신없이 책 세계에 빠져 하루 종일 완독했다.

 

요새 독서를 많이 하려 하는데 책을 스스로 고르기엔 아직 능력이 부족하다.

나 같은 사람이 많을 거라 생각하는데 신뢰 가는 사람들에게 추천받는

책을 읽어 안 좋은 책을 읽어 낭비하는 시간은 조금 더 단축하는 걸 추천한다.

 

아래 내용 스포 아님!!

“내가 만만한 멋잇감인 줄로만 알았을 때는 나를 좋아하지 않았는데, 내가 본색을 보이자 비로소 내게 호감을 느끼는 것이었다.” -초콜릿 하트 드래곤

뜬금없지만 좋아하는 이성에게 무조건 잘해주기만 하기보단,

진짜 자신을 제대로 보여줄 때 잘 될 거라 생각하기에..

소설 앞부분의 한 소절인데 읽는 순간 너무 공감되었다.

 

또, 책에서 나오는데 주인공은 남들 눈을 신경 쓰지 않고 잘 사는

자존감이 넘치는 사람이었는데

어떤 계기로 자존감이 낮아지며 자신의 튀는 패션을

주변 사람들과 맞춰 다수에 숨으려 하는 장면이 나온다.

또, 자존감이 낮아지며 어딘 가로 숨는다.

자기 자신의 능력을 스스로 폄하하고 안 좋은 길로 밀어 넣는다.

 

물론, 마지막엔 주변 사람들로 영향으로 다시 자신의 정체성을 깨닫게 된다.

 

우리와 아니 나와 비슷하지 않나 싶다.

우리가 남들이 하는 것만 하려는 것

먼저 앞장서지 못하는 것 이런 것 들은

우리가 정체성을 제대로 못 찾았기 때문은 아닐까?

 

여기 서도 환경설정의 중요성은 나오는 것 같다.

주변 사람들이 올바르기에 자존감 함정에서 빠져나올 수 있었다.

 

정체성이 생긴다면 주위 시선을 신경 안 쓰고 묵묵히 자신의 길을 갈 수 있을 거 같다.

또, 스스로를 한계를 만들고 가두지 말자 우린 우리 생각보다

발전할 수 있는 사람들이다.

 

누구든지 꿈, 정체성을 가지는 순간 빛이 날 수 있다.

 

꿈, 정체성은 크고 거창하지 않아도 된다. 스스로 하고 싶은 것을 생각하자

맛있는 초콜릿을 만드는 것이 꿈일 수도

자기 스스로 가구를 만드는 것이 꿈일 수도 있다.

그런 걸 이루어가는 것이 멋있는 삶 아닐까?

 

또 자기 실수 또는 비난에 빠져 스스로 암흑으로 빠지기보단

사랑하는 사람들과 대화하고 반성과 성찰을 하며 발전할 수 있다.

우린 부모님 또는 사랑하는 사람들의 자랑스러운 사람이다.

스스로 생각하는 것보다 우린 대단하다 항상 발전하기 위해 노력하자!

 

내용 전체를 스포를 하면 안 되기에 큰 주제는 한 친구의 성장을 담은 소설인데

대입해 생각해보면 요새 스스로 고민하고 있는 내용과 비슷했다.

 

큰 주제는 정체성을 만들어가자 또한 올바른 스승을 만나자!

안녕! 어벤추린

 

 

아주 작은 습관의 힘 서평

 

아주 작은 습관의 힘



요 근래 스스로 발전하고 싶은 욕구가 많아졌는데
방법을 모른다는 핑계로 미루고 있었다.
사람이 참 핑계는 찾기가 쉽다고 느낀다....


"목표를 이우려 말고 정체성을 찾자"

위에 글이 책에서 설명하는 주제인데 너무 공감됐다.
외적인 요인으로 발전하려고 하기보단 자기자신의 정체성, 꿈을
가지고 자발적으로 조금씩 발전해가는 것이다.

그렇다면, 정체성을 어떻게 만들어가야할까?

정체성은 작은 습관이 모여서 만들어진다.
작은 습관을 쉽게 만드는 방법은
새로 만들기보단 늘 하던 습관에 긍정적인 습관을 추가해보자.

아침에 일어나는 루틴에 푸쉬업을 추가한다든지 이런 방법 말이다.

정체성, 꿈을 가지고 작은 습관들을 만들어가자.
무엇보다도 정체성, 꿈이 큰 동기유발을 해주기에 정체성, 꿈은 직업이 되면 안 된다.

개발을 잘하고 싶고 무언가를 만들어가고 싶은게 꿈이 여야지
카카오, 네이버에 들어가는 게 꿈이 되면 안 된다.
동기유발은 나쁜습관을 이기게 해 주는데 카카오, 네이버에 들어가는 게 꿈이라면
이루었다면 꿈은 없어진다.

또 정체성을 이루어가는 작은 습관은 바로바로 결과가 돌아오지 않는다.
공부를 한다고 바로 티가 나지 않는것 처럼 하지만 능력은 차곡차곡 쌓여가고 있다.

그렇기에 정체성을 이루어가는 습관도 약간의 보상이 있어야 이루어가는 재미가 생긴다.
일주일 동안 운동을 잘하면 먹고 싶은걸 먹는 이런 보상들 말이다 ㅎㅎ
그리고 완벽하려고하면 안 된다. 완벽은 사실상 불가능하기 때문이다.
완벽하기보단 올바르게 고쳐가는게 좋지 않을까 싶다.

또 정체성,꿈을 만들어가는 쉬운 방법은 그런 사람들과 어울리면 된다.
개발을 공부하는 모임,독서모임등에 들면 더 쉽게 접할 수 있지 않을까?

다만, 정체성이 하나이고 그게 전부가 되면 안 된다. 꼰대가 된다.
우리 주변의 올바른 꼰대들을 생각해보자 ㅎㅎ

"처음의 실수가 절대 나를 망치지는 않는다. 하지만 뒤이어 또 실수할 수 있다.
한 번 거르는 것은 사고다. 두번 거르는 것은 새로운 습관의 시작이다."

좋은 습관을 유지하려면  반복의 중요성을 기억해야 한다.
반복을 하려면 하기 쉬워야하고 또, 조금씩 성취를 늘려야 한다.

한 번은 실수지만 두 번은 실수가 아닌 새로운 습관의 시작이다.
캬 얼마나 맞는말인가 뼈를 맞는 기분이다.
그래서 내가 나쁜습관밖에없구나 지금은 ㅎㅎ

나쁜 습관을 없애기는 힘드니 멀리하자
멀리하는 방법은? 나쁜 습관을 접하지 않는 환경을 만드는 거다.
이건 많은 고민을 해봐야겠다..

또 항상 숙고와 복기를 하자.
우리 인생을 우리 삶을 우리 정체성을 우리 고민을

N개의 자연수가 입력되면 각 자연수를 뒤집은 후 그 뒤집은 수가 소수이면 그 수를 출력하는 프로그램을 작성해보자.

예를 들어 32를 뒤집으면 23이고, 23은 소수이다. 그러면 23을 출력 한다. 단 910를 뒤집으면 19로 숫자화 해야 한다. 뒤집는 함수인 int reverse(int x) 와 소수인지를 확인하는 함수 bool isPrime(int x)를 반드시 작성하여 프로그래밍 한다.

 

힌트 : 숫자 뒤집는 방법생각하기

소수란? 나눠지는 수가 없는 숫자를 말한다.

 

#include <stdio.h>

int reverse(int x){
	int res = 0;
	while(x>0){
		int tmp = x%10;
		res = res*10 +tmp;
		x= x/10;
	}
	return res;
}

bool isPrime(int x){
	int i;
	bool flag = true;
	
	if(x ==1){
		return false;	
	}
	
	for(i = 2; i < x; i++){
		if(x%i ==0){
			flag=false;
			break;
		}
	}
	
	return flag;
}

int main(int argc, char** argv) {
	//freopen("input.txt", "rt", stdin);
	int n, num, i, tmp;
	scanf("%d",&n);
	for(i = 1; i<=n;i++){
		scanf("%d",&num);
		tmp = reverse(num);
		if(isPrime(tmp)){
			printf("%d ", tmp);
		}
	}
	return 0;
}

N개의 자연수가 입력되면 각 자연수의 자릿수의 합을 구하고,

그 합이 최대인 자연수를 출력 하는 프로그램을 작성해보자.

각 자연수의 자릿수의 합을 구하는 함수를 int digit_sum(int x)로 작성하자.

 

입력 값 txt파일

맨처음숫자 3은 데이터의 수를 표현해준다.

3
125 15232 97

 

힌트 : 버퍼에는 줄바꿈 띄어쓰기 기준으로 들어간다.

자릿수의 합을 구하는 방법을 한번 생각해보자.

 

#include <stdio.h>

using namespace std;

int digit_sum(int x){
	int sum = 0, tmp;
	while(x>0){
		tmp = x%10;
		sum=sum+tmp;
		x=x/10;
	}
	return sum;
}

int main(int argc, char** argv) {
	freopen("input.txt", "rt", stdin);
	int n, num, i, sum, max = -2147000000, res;

	scanf("%d",&n);
	for(int i = 0; i <n; i++){
		scanf("%d",&num);	
		sum = digit_sum(num);
		if(sum > max){
			max = sum;
			res = num;	
		}
	
	}
	
	printf("%d\n",res);
	
	return 0;
}

 

 

 

+ Recent posts