분류 전체보기
[C++]백준 11659. 구간 합 구하기 4
문제 수 N개가 주어졌을 때, i번째 수부터 j번째 수까지 합을 구하는 프로그램을 작성하시오. 입력 첫째 줄에 수의 개수 N과 합을 구해야 하는 횟수 M이 주어진다. 둘째 줄에는 N개의 수가 주어진다. 수는 1,000보다 작거나 같은 자연수이다. 셋째 줄부터 M개의 줄에는 합을 구해야 하는 구간 i와 j가 주어진다. 출력 총 M개의 줄에 입력으로 주어진 i번째 수부터 j번째 수까지 합을 출력한다. 구상 매번 각 구간의 합을 계산하면 1억 회 이상의 연산을 수행할 가능성이 있다. 구간 합을 저장하는 배열을 만들어 놓고 필요할 때마다 꺼내 쓰면 된다. 구간 합의 개념을 간단하게 살펴보자. 입력받은 수 5 4 3 2 1 구간 합 5 9 12 14 15 표만 봐도 감이 올 것이다. 주어진 수열을 차례대로 더해서..
[C++] 생성자와 소멸자
객체에는 특별한 멤버 함수인 생성자와 소멸자가 있다. 생성자가 호출되면 객체가 생성되고, 소멸자가 호출되면 객체가 정리된다. 생성자 생성자는 객체를 생성하는 멤버 함수이다. 생성자 내부에서 객체의 데이터 멤버를 초기화한다. 클래스를 정의할 때 멤버를 선언한다고 초기화가 이루어지는 것은 아니다. 선언 과정에서는 멤버의 이름과 자료형만 지정한다. 생성자는 1. 객체를 생성하고 데이터 멤버를 초기화하는 역할을 수행하므로 리턴값을 가질 수 없다. 2. 이름이 클래스의 이름과 같다. 3. 멤버를 초기화하려면 값을 변경해야 하므로 const 한정자를 붙일 수 없다. 4. 멤버 함수이므로 클래스 정의에서 선언해야 한다. class Circle { public: /*생성자*/ Circle(double radius);/..
[C++] 클래스의 구조
C++에서는 새로운 자료형(타입)을 만들 때 클래스(class)를 사용한다. 타입으로 클래스를 만들고, 이를 기반으로 인스턴스인 객체를 만든다. 클래스를 기반으로 인스턴스를 만드는 행위를 인스턴스화(instantiation)이라고 부른다. 객체 지향 프로그래밍에서는 속성과 행위를 선언하는 클래스 정의, 행위를 정의하는 멤버 함수 정의, 객체를 인스턴스화하고 사용하는 애플리케이션 구현이 필요하다. 클래스 작성하기 클래스 정의 #include using namespace std; //클래스 정의 class Circle { private: double radius; public: double getArea() const; void setRadius(double value); }; //멤버 함수 정의 doubl..
while 반복문을 종료하는 방법: 센티넬, EOF, 플래그
카운터 제어 while 반복문 #include using namespace std; int main() { int counter = 0; while (counter > num; } cout > 연산자를 입력하면 된다. 이 연산자는 스트림에서 항목을 읽다가 EOF를 만나면 false를 리턴한다. //키보드 while(cin >> num) { ... } //파일 while(infile >> num) { ... } //키보드 입력 EOF로 반복 종료하기 #include using namespace std; int main() { int num; int sum{0}; while (cin >> num) { sum +..
[C++] 조정자를 사용해 입출력 형식을 지정하는 방법
조정자(manipulator)는 입출력 형식을 바꿀 수 있는 객체이다. 별 다른 지시를 하지 않으면 프로그램은 값을 표준 형식(standard format)으로 입력하고 출력한다. 때에 따라서는 정수를 10진수가 아닌 16진수로 표시하고 싶을 수도 있고, 소수의 자릿수를 지정하고 싶을 수도 있다. 조정자는 이런 상황을 위해 제공하는 객체이다. 여러가지 조정자 입력할 때도 방법은 동일하므로, 출력하는 경우만 예시로 들었다. endl 개행을 위해서 사용했던 endl도 사실은 조정자에 속한다. '\n' 조정자를 추가해 줄바꿈을 하도록 설계되어 있다. 매개변수를 필요로 하지 않는 조정자이고, 스트림의 상태를 변경하지 않는다. noboolalpha, boolalpha bool 값을 정수로 표시할지, 문자 리터럴로..
[C++] 백준 11651. 좌표 정렬하기2
문제 2차원 평면 위의 점 N개가 주어진다. 좌표를 y좌표가 증가하는 순으로, y좌표가 같으면 x좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오. 입력 첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다. 출력 첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다. 구상 11650번 문제인 '좌표 정렬하기'를 해결할 때 mutiset과 pair를 활용했다. #include #include using namespace std; int main() { ios::sync_with_stdio(false); c..
[C++] 백준 11866. 요세푸스 문제 0
문제요세푸스 문제는 다음과 같다.1번부터 N번까지 N명의 사람이 원을 이루면서 앉아있고, 양의 정수 K(≤ N)가 주어진다. 이제 순서대로 K번째 사람을 제거한다. 한 사람이 제거되면 남은 사람들로 이루어진 원을 따라 이 과정을 계속해 나간다. 이 과정은 N명의 사람이 모두 제거될 때까지 계속된다. 원에서 사람들이 제거되는 순서를 (N, K)-요세푸스 순열이라고 한다. 예를 들어 (7, 3)-요세푸스 순열은 이다.N과 K가 주어지면 (N, K)-요세푸스 순열을 구하는 프로그램을 작성하시오. 입력첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 1,000) 출력예제와 같이 요세푸스 순열을 출력한다. 구상 1가장 처음 문제를 해결했던 방식이다. 입력하는 개수만큼만 저장할..
[C++] 백준 11650. 좌표 정렬하기
문제 2차원 평면 위의 점 N개가 주어진다. 좌표를 x좌표가 증가하는 순으로, x좌표가 같으면 y좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오. 입력 첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 x와 y가 주어진다. (-100,000 ≤ x, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다. 출력 첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다. 구상 Key와 Value로 한 쌍을 묶어서 저장할 수 있는 map STL이 있다. 심지어 알아서 정렬도 해준다. 하지만 map은 중복된 키를 사용할 수 없다. multimap을 이용하면 중복된 키는 사용할 수 있지만 기본 옵션으로는 키나 값 둘 ..