전체 글 129

[백준 1654] 랜선 자르기

오랜만에 파라메트릭 서치 문제를 풀었습니다. 파라메트릭 서치 문제는 최적화 문제를 결정 문제로 바꾸어 푸는 문제입니다. 주어진 문제는 여러 개의 랜선의 길이가 주어졌을 때, 각 랜선들을 mid로 자르면 나눠지는 랜선의 개수가 N개 이상을 만들면 되는데, 이때 mid의 길이를 가능한 최대로 뽑고 싶다는 것이 이 문제의 핵심입니다. 예시에서는 200m로 잘랐을 때 11개를 만들 수 있으며 나올 수 있는 최대 길이라고 합니다. 어떻게 11개가 나왔을까요. 802 / 200 = 4 743 / 200 = 3 457 / 200 = 2 539 / 200 = 2 4 + 3 + 2 + 2 = 11개가 됩니다. 정리하면 어떻게 자르든 11개 이상만 나오면 조건을 만족하며, 그때 자른 길이 중 최대를 저장하면 됩니다. 만약..

Algorithm 2021.12.23

[백준 2231] 분해합

객체지향 프로그래밍을 해봤다면 지문 이해가 쉬웠을 것 같습니다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라고 합니다. 간단히 말하자면 M으로 인해 N이 생겨났으니, 주체인 M이 N의 생성자라고 생각하면 됩니다. 그랬을 때 문제에서 N이 입력으로 주어지면 우리는 M을 구해야 합니다. 그중에서도 가장 작은 M을 구하려면 M을 1부터 검사하면서 N을 만들 수 있는 생성자를 찾아가면 됩니다. 언제까지 찾으면 될까요? 확실한 건 M은 N보다 클 수 없습니다. 생성자니까요. 따라서 N보다 작을 때까지만 루프를 돌면 됩니다. calc함수는 어떤 자연수의 각 숫자의 합을 리턴하는 함수입니다. 문자열로 쪼개서 계산해도 되지만, 이러한 방식이 오히려 더 편할 수 있습니다. #include #include ..

Algorithm 2021.12.22

[C#] 무명 형식, 인터페이스와 프로퍼티, 추상 클래스의 프로퍼티

프로퍼티의 마지막 시간입니다. 무명 형식, 인터페이스와 프로퍼티, 추상 클래스의 프로퍼티 배울 것이 많아 보입니다. 빠르게 공부해봅시다! # 무명 형식 (Anonymous Type) 제목 그대로 이름이 없는 형식을 무명 형식이라고 합니다. 보통은 임시로 사용하는 경우 특별히 다시 사용하지 않기 때문에 람다처럼 이름을 붙이지 않습니다. 무명 형식은 형식의 선언과 동시에 인스턴스를 할당합니다. 인스턴스를 만들고 다시는 사용하지 않을 때 무명 형식이 요긴합니다. var tempInstance = new {Name = "나, 무명", Age = 20}; 무명 형식의 프로퍼티에 할당된 값은 변경 불가능합니다. 읽기만 가능하죠. 나중에 LINQ(링큐)에서 요긴하다고 합니다. using System; namespac..

CS/C# 2021.12.21

[C#] Record 와 Property

프로퍼티 두 번째 시간입니다. # 프로퍼티란? 레코드에 들어가기 전에 참조 형식과 값 형식에 대해서 잠깐 언급하고 가보겠습니다. 값 형식은 필드가 많으면 많을수록 복사 비용이 커지게 됩니다. 왜냐하면 깊은 복사로 새 객체가 기존에 가진 모든 필드를 1:1 복사하기 때문이죠. 그렇지만 참조 형식에서는 이런 오버헤드가 없습니다. 객체가 참조하는 메모리 주소만 복사하면 되기 때문입니다. 하지만 참조는 얕은 복사를 진행하며, 깊은 복사가 필요한 경우 따로 프로그래머가 구현해줘야 합니다. 더 들어가봅시다. 값 형식은 객체를 비교할 때에도 기본적으로 내용을 비교하는데 모든 필드를 1:1 비교합니다. 불변 객체에서 필요한 방법입니다. 참조 형식은 내용 비교를 할 수 있으려면 프로그래머가 직접 비교 코드를 작성해야 합..

CS/C# 2021.12.21

[C#] property, 프로퍼티

오늘은 프로퍼티에 대해서 배워보겠습니다. 기존에 C++을 공부를 했었고, 은닉성을 위해서는 public으로 필드 멤버를 선언하는 것이 아닌 private로 감추고 필요한 부분만 getter, setter를 구현해서 사용하라고 배웠습니다. 맞는 방법이지만 한 변수에 getter와 setter까지 하면 변수가 많아질수록 이 수 또한 엄청 많아지게 될 것입니다. C#에서는 이러한 것들을 한 뭉치로 묶을 수 있는 프로퍼티를 제공합니다! # 프로퍼티 class Program { private int age; public int Age { get { return age; } set { age = value; } } } age라는 것을 Age라는 프로퍼티로 제공하게 됩니다. Program p = new Program..

CS/C# 2021.12.21

[C#] 인터페이스와 추상 클래스

객체지향 프로그래밍의 '꽃'인 인터페이스와 추상 클래스에 대해서 공부했습니다. 배우기에 앞서서는 인터페이스와 추상 클래스가 많이 비슷하기도 하고 다른 점이 뭐가 있을까에 대해서 궁금했었는데 빠르게 알아봅시다! # 인터페이스 선언 C#의 인터페이스는 다음과 같이 생겼습니다. interface flyable { void fly(); } 인터페이스에서는 메서드, 이벤트, 인덱서, 프로퍼티만을 가질 수 있고, 클래스의 선언과 비슷하지만 언뜻 보면 구현부가 없고 함수의 정의 부분만 있습니다. 인터페이스에서는 접근 제한 한정자를 사용할 수 없으며, 모든 것들이 public으로 선언됩니다. 클래스와는 다르게 인스턴스화를 만들 수 도 없고요. 다만, 인터페이스를 상속한 클래스에서는 인스턴스를 만드는 것이 가능합니다. ..

CS/C# 2021.12.20

[백준 1991] 트리 순회

[문제풀이] 오랜만에 트리 문제를 풀어봤는데,,, 너무 쩔쩔매던 문제였습니다... (개념은 알고 있는데 구현을 못하니..) 주말에 다시 풀어봐야겠습니다. 여튼 문제에서는 트리를 구성하고 전위 순회, 중위 순회, 후위 순회를 그대로 출력하면 됩니다. 전위 순회는 parent, leftChild, rightChild 중위 순회는 leftChild, parent, rightChild 후위 순회는 leftChild, rightChild, parent Tree의 구성은 node 들도 구성되어 있습니다. node의 구성은 데이터를 저장할 char와 자식 노드를 가리킬 2개의 포인터를 구성하면 됩니다. struct Node { char data; Node* leftChild; Node* rightChild; }; 순..

Algorithm 2021.12.12

[C#] 정적 필드와 메서드(static)

C#에 오면서 헷갈리는 부분이 바로 정적 필드와 메서드 부분이었습니다. 아마도 이쪽 부분에 대해서 개념이 흔들려서 그런 것 같기도 했으나 오늘 공부로 한 층 더 업그레이드해보겠습니다. # static 메서드나 필드가 클래스의 인스턴스가 아닌 클래스 자체에 소속되도록 지정하는 한정자라고 합니다. 하나의 프로그램에는 인스턴스는 여러 개가 존재할 수 있으나, 붕어빵을 만드는 틀(클래스)은 단 하나만 존재합니다. 어떤 필드가 클래스에 소속된다는 것은 그 필드가 프로그램 전체에서 유일하게 존재한다는 것을 의미합니다. 유심히 살펴보면 Main 함수도 static으로 선언되어 있습니다. 말이 어렵죠. 일반적으로 만드는 인스턴스와 static을 비교해보겠습니다. # 정적 필드 using System; class Ins..

CS/C# 2021.12.12

[C#] 생성자와 소멸자

객체를 생성하고 만드는 과정에서 사용되는 생성자와, 언젠간 객체도 사용되지 않는다면 소멸하므로 소멸할 때 사용하는 소멸자에 대해서 알아보겠습니다. # 생성자 이름 그대로 생성할 때 호출되는 녀석입니다. 생성자의 임무는 클래스의 객체를 생성하는 것이며, 동시에 스페셜하게 readonly도 초기화가 가능합니다. class Name { public int a; public int b; public Name() { // 디폴트 생성자 } public Name(int a, int b) { // 매개변수를 입력받아 원하는 값으로 초기화 this.a = a; this.b = b; } } 클래스를 선언할 때 명시적으로 생성자를 구현하지 않아도 객체가 생성이 됩니다. 그 이유는 컴파일러에게 디폴트 생성자를 만들어주기 때..

CS/C# 2021.12.11

[C#] 클래스

프로그래머는 추상주의 예술가라고 합니다. 세상에 존재하거나 존재하지 않는 것을 코드로 나타내야 하며 컴퓨터 세계에서 실체화합니다. 객체로 표현하는 방법이 객체지향 프로그래밍입니다. # 객체 객체란 것은 세상의 모든 것을 지칭하는 단어입니다. 자동차, 연필, 붕어빵 등등 객체의 주요 특징은 속성과 기능이 있습니다. 속성(property) : 데이터 기능(function) : 행동 예를 들어 사람이라는 객체는 속성은 나이, 주민번호, 몸무게, 키가 될 수 있고, 기능은 걷기, 뛰기, 달리기, 먹기와 같이 나열할 수 있습니다. 이러한 객체를 어떻게 만들 수 있을까요? 바로 클래스를 이용해서 만들 수 있습니다. # 클래스 클래스는 객체를 만들기 위한 청사진(틀)입니다. 붕어빵이라는 객체를 만들기 위해서는 붕어빵..

CS/C# 2021.12.11