본문 바로가기
백준 1926 : 그림 (BFS) 문제어떤 큰 도화지에 그림이 그려져 있을 때, 그 그림의 개수와, 그 그림 중 넓이가 가장 넓은 것의 넓이를 출력하여라. 단, 그림이라는 것은 1로 연결된 것을 한 그림이라고 정의하자. 가로나 세로로 연결된 것은 연결이 된 것이고 대각선으로 연결이 된 것은 떨어진 그림이다. 그림의 넓이란 그림에 포함된 1의 개수이다.입력첫째 줄에 도화지의 세로 크기 n(1 ≤ n ≤ 500)과 가로 크기 m(1 ≤ m ≤ 500)이 차례로 주어진다. 두 번째 줄부터 n+1 줄 까지 그림의 정보가 주어진다. (단 그림의 정보는 0과 1이 공백을 두고 주어지며, 0은 색칠이 안된 부분, 1은 색칠이 된 부분을 의미한다)출력첫째 줄에는 그림의 개수, 둘째 줄에는 그 중 가장 넓은 그림의 넓이를 출력하여라. 단, 그림이 하나도.. 2024. 8. 4.
백준 5430 : AC (덱) 문제선영이는 주말에 할 일이 없어서 새로운 언어 AC를 만들었다. AC는 정수 배열에 연산을 하기 위해 만든 언어이다. 이 언어에는 두 가지 함수 R(뒤집기)과 D(버리기)가 있다.함수 R은 배열에 있는 수의 순서를 뒤집는 함수이고, D는 첫 번째 수를 버리는 함수이다. 배열이 비어있는데 D를 사용한 경우에는 에러가 발생한다.함수는 조합해서 한 번에 사용할 수 있다. 예를 들어, "AB"는 A를 수행한 다음에 바로 이어서 B를 수행하는 함수이다. 예를 들어, "RDD"는 배열을 뒤집은 다음 처음 두 수를 버리는 함수이다.배열의 초기값과 수행할 함수가 주어졌을 때, 최종 결과를 구하는 프로그램을 작성하시오.입력첫째 줄에 테스트 케이스의 개수 T가 주어진다. T는 최대 100이다.각 테스트 케이스의 첫째 줄.. 2024. 8. 4.
백준 1021 : 회전하는 큐(덱) 문제지민이는 N개의 원소를 포함하고 있는 양방향 순환 큐를 가지고 있다. 지민이는 이 큐에서 몇 개의 원소를 뽑아내려고 한다.지민이는 이 큐에서 다음과 같은 3가지 연산을 수행할 수 있다.첫 번째 원소를 뽑아낸다. 이 연산을 수행하면, 원래 큐의 원소가 a1, ..., ak이었던 것이 a2, ..., ak와 같이 된다.왼쪽으로 한 칸 이동시킨다. 이 연산을 수행하면, a1, ..., ak가 a2, ..., ak, a1이 된다.오른쪽으로 한 칸 이동시킨다. 이 연산을 수행하면, a1, ..., ak가 ak, a1, ..., ak-1이 된다.큐에 처음에 포함되어 있던 수 N이 주어진다. 그리고 지민이가 뽑아내려고 하는 원소의 위치가 주어진다. (이 위치는 가장 처음 큐에서의 위치이다.) 이때, 그 원소를 주.. 2024. 8. 3.
modern c++ • constexpr C++에서는 매크로보다 constexpr 상수로 사용하는 걸 권장한다#define SIZE 10 // C-styleconstexpr int size = 10; // modern C++ • 초기화중괄호 안에 다 박을 수 있다#include #include using namespace std;struct S { string name; float num; S(string s, float f) : name(s), num(f) {}};int main() { S s1("Norah", 2.7); S s2("Frank", 3.5); S s3("Jeri", 85.9); // Basic initialization vector v; v.push_back(s1); v.push_back(s2); v.p.. 2024. 7. 31.
c++ 코딩테스트 풀면서 알게 된 것들 기록 덱에서 특정 원소 인덱스 구하기int idx = find(DQ.begin(), DQ.end(), t) - DQ.begin(); find 함수만으로 하지 않고 -DQ.begin()으로 이터레이서 반복자를 빼 줘야 정확한 특정 원소 인덱스가 나온다 덱이 아닌 벡터, 리스트 등에서도 사용 가능하니 사용방법을 잘 익혀두자  12345를 입력받을때 1 2 3 4 5로 각각 숫자로 받으려면..char로 받고 - '0' 해주면 된다! 2024. 7. 31.
스마트 포인터 • unique_ptr 특정 객체를 가리키는 하나의 스마트 포인터복사 새성자와 복사 대입 연산자 불가능 - 사용법unique_ptr 스마트 포인터명(new 클래스)unique_ptr 스마트 포인터명 = make_unique(인수); 가능하면 new로 하지 말고 make~로 할것 클래스를 스마트 포인터로 호출해보면 따로 delete 하지 않아도 소멸자가 자동으로 호출된다class T {public: T() { cout ptr = make_unique(); cout   - 상속관계class T {public: T() { cout ptr2 = make_unique(); cout  위와 같은 상속 관계에서 잘 동작한다 -재귀 호출#include #include using namespace std;void f.. 2024. 7. 31.
예외 처리 #include using namespace std;void f1(); void f2(); void f3();class Test { int id;public: Test(int n) { id = n; cout  위 코드를 실행하면 동적할당한 경우 메모리 해제가 잘 되지 않아 소멸자가 호출퇴지 않는다 2024. 7. 31.
c++ 입출력 시스템 텍스트 파일 생성해서 저장하는 코드int main() { ofstream fout; fout.open("song.txt"); if (!fout) { cout  클래스에서 계산값을 '#include #include #include using namespace std;class Circle { int radius;public: void setRadius(int radius); double getArea(); friend ofstream& operator 2024. 7. 30.
람다식 • 람다식f(x + y)를 (x + y) -> x + y 형태로 표현한다 - x+y를 출력하는 람다 메서드에 2+3한 값을 넣어서 출력[](int x, int y) {cout  -람다 메서드를 auto 타입으로 변수로 만들어두고 재활용해서 사용하는 코드, 이 패턴을 잘 알아두자 auto sum = [](int x, int y) {cout  -람다 메서드에 외부 변수 값을 넣어서 계산하는 코드 double pi = 3.14; auto calc = [pi](int r) -> double { return pi * r * r; }; - 참조 형으로 넘겨준 인자에 값을 람다식 안에서 갱신하는 코드 double pi = 3.14, res = 0; auto calc = [&pi, &res](int r) -> doub.. 2024. 7. 30.
템플릿 & STL • 함수 중복의 약점함수 중복은 매개변수 이외의 코드가 중복되어 비효율적이다 • 템플릿 선언을 이용한 swap 함수template나 template 형태로 제네릭 타입을 선언하고 사용한다#include using namespace std;templatevoid myswap(T& a, T& b) { T tmp; tmp = a; a = b; b = tmp;}int main() { int a = 4, b = 5; cout  템플릿을 이용하면 재사용성이 증가하지만 포팅에 취약하고 디버깅이 어려워진다 • 템플릿 스택 코드#pragma once#include using namespace std;template class MyStack{ int size; T* arr; int top = -1;public: MySta.. 2024. 7. 29.
상속, 오버라이딩, 추상화 • 상속 기본 클래스  #include "Point.h"void Point::showPoint() { std::cout x = x; this->y = y;} point를 상속받는 클래스 ColorPoint헤더#pragma once#include "Point.h"#include #include class ColorPoint : public Point { std::string color;public: void setColor(std::string color); void showColorPoint();};구현#include "ColorPoint.h"void ColorPoint::showColorPoint() { std::cout color = color;} 메인#include .. 2024. 7. 29.
파일 시스템 • 파일보조장치에 의미 있고 관련 있는 정보를 모아둔 논리적 단위파일은 이름, 파일 실행 정보, 메타데이터(속성)로 이루어진다 • 파일 속성파일 시스템은 파일별로 아래와 같은 속성을 유지하고 관리한다-유형 (확장자로 구분되는 파일 유형)-크기-보호-생성 날짜-마지막 접근 날짜-마지막 수정 날짜-생성자-소유자-위치 파일 연산은 운영체제에 의해 시스템 호출이 되서 아루어진다 • 디렉터리 디렉터리 = 폴더 파일을 관리하기 위해서 사용옛날옛적에는 OS에 하나의 디렉터리만 존재하는 1단계 디렉터리 구조였고1단계 디렉터리로는 파일을 관리하기 어려워서 트리 구조 디렉터리가 되었다 • 절대 경로같은 디렉터리에는 동일한 이름의 파일이 존재할 수 없지만, 서로 다른 디렉터리에서는 있을 수 있다루트 디렉터리부터 자기까지 오.. 2024. 7. 28.
메서드 오버로딩 & 디폴트 매개변수 & static & 프렌드 & 연산자 오버로딩 • 메서드 오버로딩이름이 같고 인자가 다른 메서드를 이용해서 다형성을 구현인자가 모호하면 오버로딩이 불가능하다#include #include #include #include using namespace std;int getMin(int a, int b) { return (a > b) ? b : a;}double getMin(double a, double b) { return (a >=b) ? b : a;}string getMin(string a, string b) { return (a.compare(b) > 0) ? b : a;}int getMin(int arr[], int size) { int min = INT16_MAX; for (int i = 0; i  • 디폴트 매개변수 디폴트 매개변수는 함수의 .. 2024. 7. 26.
C++ 객체지향 프로그래밍 • 클래스와 객체#include using namespace std;class Rectangle {public : int width; int height; Rectangle(int width, int height); Rectangle(); int getArea() { return width * height; }};Rectangle::Rectangle() { width = 5; height = 10; cout width =width; this->height = hegiht; cout  • 생성자 중복 테스트 #include using namespace std;class Rectangle {public : int width = 1; int height = 1; Rectangle(int width, int .. 2024. 7. 25.
컴파일러 최적화 • 변수별 특성 • 재귀함수 최적화#include #if TCASE==1 //재귀int fact(int n) { if((n==1) || (n==0)) return 1; else return n * fact(n-1);}#elif TCASE==2 //goto로 하는 루프int fact(int n) { int i=1, rst=1; if(n==0) return 1;loop: if(i 재귀,goto,반복문으로 팩토리얼 연산을 하는 소스코드를 컴파일한 후 디스어셈블해서 비교 - 컴파일, 디스어셈블리 명령어gcc recursiveFunc.c -g -DTCASE=3objdump -d -S a.out > r3 재귀  함수는  반복적인  처리를  짧은  코드와  효과적인  처리로  편의를  제공하지만, 함수의  반복적인 .. 2024. 7. 23.
보이드 포인터를 이용한 제네릭 프로그래밍 보이드 포인터를 이용한 제네릭 기법은  코드의  재사용성을  높이고, 유연성을  제공하여  다양한  데이터  타입에  대해  반복적인  코드  작성을  줄일  수  있다. Generic Programming은 일반적으로  컴파일  시점에 타입 안전성을  보장하며,코드의 성능 최적화에도 도움을 줄 수 있다. 복잡성을  줄이고  유지보수성을  향상시키는데  기여할  수  있다. • 타입에 상관없이 정렬되는 프로그램 1. 함수 포인터로 인자를 받는다2. 받은 인자의 타입에 따라 다른 정렬 메서드를 작성한다간단해 보이지만 굉장히 복잡했다C에서의 제네릭 - (void*)  형태 #include #include #include #include "swap.h"#define NAME_SIZE 20//void*로 주소를.. 2024. 7. 23.
부트로더 전원이 들어오면 OS보다 먼저 실행되는 프로그램 HW/SW를 초기화한다 메모리 관련 커맨드, 시스템 모니터링 커멘드를 지원한다OS 다운로드&로딩 커맨드를 지원한다 2024. 7. 23.
함수 포인터, 구조체 포인터 예제 - 함수 포인터추가하자 -구조체 포인터typedef struct _CMD_TBL { char *cmd; // command name void (*run)(int); // function point. char *usage; // command usage} CMD_TBL;#define CMD_TBL_T1 {"on", ledon, " ledon function"}#define CMD_TBL_T2 {"off", ledoff, " ledoff function"}#define CMD_TBL_T3 {"state", getstate, " button state function"}#define CMD_TBL_END {0, 0, 0}// 구조체 포인터 순회하는 코드CMD_TBL *cptr; for (cptr .. 2024. 7. 23.
임베디드 C • 컴파일 과정- gcc 명령어 옵션• 컴파일 후 실행터미널에서 gcc -S ptrNarray1 ptrNarray1.c gcc -S  v1.s volatileBasic1.c gcc -o ptrNarray1 ptrNarray1.c  ./ptrNarray1  -memcpy를 이용한 데이터 복사int swap(void *dest, void *src, int size){ void* tmp = malloc(size); if (tmp == NULL) return -1; memcpy(tmp,dest,size); memcpy(dest,src,size); memcpy(src,tmp,size); free(tmp);} - 비트 연산자 계산기bitSet 해당 위치 비트를 1로 만들기bitReset 해당 위치 비트를 0으로 만.. 2024. 7. 22.
리눅스 C 환경설정 • 윈도우 리눅스 환경 설정wsl --install -d ubuntusudo apt-get updatesudo apt install wsl - OpenSSH 서버 설치 후 환경 확인Telnet을 통해서도 원격으로 리눅스에 접근할 수 있지만 보안 문제때문에 ssh로 접근하는 방법을 사용한다 sudo apt install openssh-serversudo systemctl status sshd  vscode 설치 후remote development 확장 설치 wsl 터미널에서 ip addr 명령어 입력 후 inet 다음에 있는 ipv4 주소 복사vscode 좌하단 remote development 클릭하고 connect to host 입력 후 리눅스계정@ipv4주소 입력hoshi03@172.27.10.53-.. 2024. 7. 22.