전체 글 151

[백준] C++ 최소 스패닝 트리(1197)

이 문제는 MST를 구하는 문제이다.문제를 해결할 수 있는 방법은 2가지가 있다.프림의 알고리즘을 사용하던지 크루스칼의 알고리즘을 사용하면 된다.일반적으로 프림의 알고리즘이 크루스칼의 알고리즘보다 구현하기 쉬워서 프림의 알고리즘을 많이 사용한다. *프림의 알고리즘*은 한 노드를 딱 정해서 그 노드에서부터 이웃한 노드를 우선순위 큐에 넣고 가장 가까운 노드로 나아가는 방법이다.(나아간 후에는 그 나아간 노드에 있는 이웃한 노드 또한 우선순위 큐에 넣어주는 작업을 수행해야 함. visited배열을 사용해서 이미 방문된 노드는 다시 방문하지 않음.) *크루스칼의 알고리즘*은 간선을 우선순위 큐에 모두 넣어놓고 짧은 간선부터 하나씩 빼서 MST를 구성하는데 만약 사이클이 발생하면 그 간선은 사용하지 않고 넘어간..

[백준] C++ 집합의 표현(1717)

대표적인 Union&&Find 문제이다. 0이 들어오면 a의 집합과 b의 집합을 Union 해준다.1이 들어오면 a와 b가 같은 집합에 속해있는지 확인한다.if (num == 0){ Union(a, b);}else if (num == 1){ if (Find(a) == Find(b)) { cout  Union은 어떻게 하느냐?일단 Find(a), Find(b)를 해서 a와 b의 대표노드들을 찾는다.그리고 대표노드 하나를 선택해서 다른 대표노드의 자식으로 넣는다.a가 b의 자식이 되거나 b가 a의 자식이 되거나.나는 index가 큰 놈을 자식으로 만들고 index가 작은놈을 부모로 만들었다. Find는 어떻게 하느냐?우선 자신의 부모노드를 저장하기 위해 1차원 배열을 선언한다.이 배열을 부모노드의 값을 저..

Union && Find

Union은 노드를 연결해서 하나의 집합으로 묶는 작업이다.(Index가 작은게 대표 노드가 된다.)Find는 자신이 속한 집합의 대표 노드를 찾는 연산이다. Find(2), Find(3)을 하면 대표노드 1이 return된다.Find(5), Find(6)을 하면 대표노드 4가 return된다. 만약 Union(3,6)을 하게 되면 3의 대표 노드 *1*과 6의 대표노드 *4*가 이어지게 된다. 4,5,6의 대표 노드는 이제 *1*이다. *경로압축*재귀함수를 이용해서 대표노드에 도달하면 함수를 빠져나오면서 거치는 모든 노드의 값을 대표 노드 값으로 변경한다.경로압축을 통해 Find()연산의 속도를 O(1)로 만들 수 있다. 유니온 파인드는 언제 사용될까??-MST(크루스칼 알고리즘)-무방향 그래프의 사이..

namespace

프로그래머가 2명 이상 동시에 개발을 진행하면 Class명이 겹칠 수 있다.   A프로그래머도 Player 클래스를 선언하고B프로그래머도 Player 클래스를 선언하면 클래스 이름이 중복된다. 이렇게 함께 개발을 하게 되면 중복되는 문제가 발생하는데 이 중복되는 문제를 방지하기 위해 namespace를 사용한다.A.Player과 B.Player은 다른 기능을 한다.A프로그래머의 Player 클래스를 사용하려면 A.을 붙여서 A.Player로 객체를 만들고B프로그래머의 Player 클래스를 사용하려면 B.을 붙여서 B.Player로 객체를 만든다.namespace _02NameSpace{ internal class Program { static void Main(string[] ar..

C# 2025.02.16

객체지향 && Class

객체지향프로그래밍이란 내가 표현하고 싶은걸 Class로 만들고 이 Class를 기반으로 객체를 만드는 프로그래밍이다.객체를 기반으로 거의 모든 걸 해결한다. Class선언을 두려워하지 말자그냥 일단 선언하고 내부의 내용은 채워나가자. Class Skill{} Class Player{} 클래스를 붕어빵 틀이라고 생각하고 객체를 붕어빵 틀으로부터 나오는 붕어빵이라고 생각하자. 지금하고 있는 LOL모작도 Class 선언에 대해 고민이 좀 있다. 좀 더 공부해서 원활한 프로그래밍을 하고 싶다.

C# 2025.02.16

다중 프로젝트 && using

하나의 솔루션 안에 여러 개의 프로젝트 생성 가능.    솔루션: 여러 개의 프로젝트를 포함하는 최상위 컨테이너 역할을 함.프로젝트: 실제 코드, 리소스, 설정 파일 등을 포함하는 개별적인 애플리케이션 or 라이브러리. 이렇게 시작 프로젝트로 설정을 하고 실행을 하면실행파일이 뽑힌다. 여기서 현재 선택 영역으로 바꾸면 번거롭게 일일이 설정하지 않아도 클릭한 곳이  시작 프로젝트가 된다. using 이 의미한 것이 무엇인가??using 을 하게 되면 System이라는 이름의 namespace를 가져오는 역할을 한다. 그러면 namespace란 무엇인가??클래스, 구조체, 인터페이스 등 논리적인 그룹을 정의하는 논리적 컨테이너이다.namespace MyNamespace // 네임스페이스 선언{ clas..

C# 2025.02.15

[백준] C++ 연료채우기(1826)

이 문제의 목적은 목적지까지 주유소를 최대한 적게 방문하는 것이다. 어떻게 하면 최대한 적게 방문하고 목적지까지 갈 수 있을까??사고를 좀 거꾸로 할 필요가 있다. 우선 트럭을 타고 길을 지나간다.가는 길에 주유소가 있었다면 주유소에 대한 정보를 저장한다.길을 가다 보면 연료가 바닥난다. 연료가 바닥이 났을 때 이전에 저장했던 주유소 중 가장 연료가 많이 저장된 곳에서 주유를 한다.(주유를 하고 난 후 pop)이러한 방법으로 목적지까지 도달하는 것이 가능하다면 주유소에서 멈추는 횟수를 출력하고그렇지 않다면 -1을 출력한다. 즉 방문하면서 주유하는 것이 아닌 연료가 바닥으로 떨어졌을 때 이전 주유소에 대한 정보를 가지고 주유하는 것이 핵심이다. #include #include #include using n..

백준/그리디 2025.02.11

[백준] C++ 선 긋기(2170)

도화지에 선을 긋고 그은 선의 총길이를 출력하는 문제이다. 여러 번 그은 곳과 한번 그은 곳은 구분이 불가능하다. 선을 그을 때마다 배열에 저장하면서 문제를 해결할 수 있을까??답은 불가능하다.우선 선을 그을 때마다 배열에 일일이 저장하면(배열의 값을 1로 바꿔) 중복해서 그려지는 부분이 생긴다. 시간초과가 발생할 것. 그러면 시작점과 끝점에서 안 그려진 부분(0인지 1인지 확인)부터 그려진 부분까지 그리면 되는 거 아닌가?? 중간에 이미 그려졌으면 break; 시간초과가 안 발생할 것 같은데?이것도 불가능하다. 배열에 20억개 이상 저장할 수 없다. 그러면 어떻게 해결해야 하는가?앞에서부터 선을 긋는다. 그러려면 입력값을 일단 정렬해야 한다.앞에서부터 선을 긋고 마지막에 그은 점을 저장해 놓는다.다음에..

백준/그리디 2025.02.11

Thread

스레드란 프로세스 내에 독립된 실행 흐름을 의미한다. 독립적으로 움직이기 때문에 독자적인 PC와 레지스터를 가지고 있다. 스레드는 프로세스 주소 공간을 공유한다. 같은 데이터를 공유하고 사용함으로써 Concurrency 문제가 발생할 수 있다.스레드에 대해 예를 들어 설명해 보겠다.상하차로 비유해 보겠다.화물차를 프로세스로 보고 사람을 스레드로 보자.화물차(프로세스) 안에는 여러 가지 물건(DATA)이 있다(주소 공간 공유). 화물차 안에서 사람(스레드)이 움직인다. 확실히 사람이 많으면 일이 빨리 끝날 거 같다.근데 사람이 너무 많으면 같은 물건을 집게 되는 문제가 발생할 수 있다(공간을 공유하기 때문에 발생!).우리는 사람이니까 같은 물건을 안 집으려고 생각하고 물건을 선택하지만 프로그램은 그렇지 않..

CS/OS 2025.01.24

[백준] C++ 나머지 합(10986)

연속된 부분 구간의 합이 M으로 나누어 떨어지는 구간의 개수를 구하는 문제이다.연속된 부분 구간의 합이 M으로 나누어 떨어진다??문제를 어떻게 해결하여야 하는 거지?? 이 문제를 해결하기 위해서는 아이디어가 필요하다. 누적합을 하면서 나머지를 구하는 것이다.나머지가 1나머지가 0나머지가 0나머지가 1나머지가 0 나머지가 1인 경우를 유심히 관찰해 보자.1만 있을 때와 1 2 3 1일 때 나머지가 1이다.이 둘을 빼게 된다면?? 2 3 1이 남는다 2 3 1은 3으로 나누어 떨어진다.이 아이디어를 이용해서 문제를 해결한다. 1. 나머지를 저장하는 배열을 만든다.2. 배열에는 경우의 수가 저장된다.3. 배열에 저장된 값을 가지고 2개씩 조합한다. 예를 들어 result[1]에 2가 들어 있다. 그러면 나머지..