전체 글 (114)

10
15

#문제 이해

 

Design of traffic lights for a complicated junction

올바른 교차로 설계에는 두가지 조건이 필요합니다.

1. 충돌이 일어날 수 없습니다
2. 교차로의 교통을 관리하려면 최소한의 단계가 필요합니다.

 

입력: 교차점에서 가능한 모든 회전 집합
출력: 그룹의 모든 회전이 서로 충돌 없고 동시에 회전해도 되는 회전 그룹

 

 

 

사진처럼 C가 화살표 그려지면 그 방향으로 일방통행만 가능합니다.

즉 회전 가능한 경우의 수는 아래와 같습니다.
{AB, BA, CA, CB}
회전 불가능한 경우의 수는 아래와 같습니다. (일방 통행이라서)
{AC, BC}

 

 

회전이 서로 가능한 것과 안되는 것들의 집합 표

AB와 CB는 안되는 이유가 위에 차선이 서로 충돌 나기 때문이고

BA와 CA 또한 같은 이유입니다.

BA와 CB는 B에서 차가 출발하면 C에서 B로 회전하는 차랑 충돌나기 때문입니다.


#그래프 

 

이를 토대로 이제 그래프를 그려보겠습니다.

그래프는 Vertex 이라고 하는 점 집합과 Edge 라고 하는 점을 연결하는 선으로 구성됩니다.

Vertex = Node = 꼭짓점 = 정점

Edge = Arc = 간선

 

정점은 차들의 회전을 나타냅니다.
간선은 차들의 회전이 동시에 수행될 수 없는 꼭짓점 쌍을 연결합니다.

 

위에 표를 바탕으로 회전이 동시에 안되는 쌍을 연결한 그래프는 아래와 같습니다.

그렇다면 그래프 수준에서 신호등 문제를 해결할 수 있도록 기존 그래프 관련 알고리즘이 있을까요?

 


#그래프 컬러링

그래프를 색칠한다는 것은 그래프의 각 정점(꼭짓점)에 색을 할당하여 

간선으로 연결된 두 꼭짓점이 같은 색이 되지 않도록 하는 것입니다.


가능한 한 적은 색상을 사용하여 호환되지 않는 회전 그래프를 색칠하면 신호등 문제가 해결됩니다.

 

아까 위에 그래프를 다시 한번 봅시다.

 

보다시피 서로 회전할 시 충돌 나는 것들은 x 표시 되어있습니다.

이 친구들은 서로 다른 색깔로 색칠하면 되겠네요.

 

그리고 이걸 도로 그림에 그려본다면 아래와 같습니다.

서로 다른 색깔은 다른 신호등 색이라고 생각하면 문제가 해결된 모습을 볼 수 있습니다.

또한 그래프 관련 솔루션을 통해 원래 문제, 특히 복잡성과 관련된 문제를 더 잘 이해할 수 있습니다.


그래프 채색은 매우 어려운 문제로 알려져 있습니다. 

이는 당면한 문제에 대한 최적의(최상의) 솔루션을 찾는 데 계산 비용이 매우 많이 들 수 있음을 의미합니다.
그래서 우리는 신호등 문제도 어려운 문제라는 것을 알고 있습니다.


다른 문제들도 풀어서 한번 연습해보시는걸 추천드립니다.


해밀턴 경로 문제: 각 꼭지점을 정확히 한 번만 방문하는 무방향 또는 방향 그래프에 경로가 있습니까?


배낭 문제: 각각의 질량과 가치가 있는 일련의 항목이 주어지면 총 무게가 주어진 제한보다 작거나 같고 총 값이 가능한 한 커지도록 컬렉션에 포함할 각 항목의 수를 결정합니다.


여행하는 외판원 문제: 도시 목록과 각 도시 쌍 사이의 거리가 주어지면 각 도시를 정확히 한 번 방문하고 출발 도시로 돌아오는 최단 경로는 무엇입니까?

문제 목록:
http://en.wikipedia.org/wiki/List_of_NP-complete_problems

'그냥 개발글 > 알고리즘' 카테고리의 다른 글

퀵 정렬 Quick Sort  (1) 2024.10.19
우선순위 큐 Priority Queues  (0) 2024.10.19
힙, 힙 정렬이란 Heap, Heap Sort  (0) 2024.10.19
숫자 정렬 알고리즘 Sorting of Numbers  (0) 2024.10.19
COMMENT
 
10
15

 

프로젝트 5분만에 분석하는 법

 

Cursor를 이용해 5분 만에 프로젝트 구조를 파악하는 방법을 알려드리겠습니다.

1. Ctrl + L 을 눌러 Cursor 채팅 패널을 엽니다.
2. "Normal chat"에서 "Long Context Chat"으로 변경합니다.
3. 프롬프트에 "@codebase를 파악해서 내 코드의 관계와 역할을 머메이드로 시각화해줘" 라고 입력합니다.
4. 노션에서 생성된 코드를 복사하여 붙여넣습니다.
5. 이 시각화는 깃허브 README.MD에서도 볼 수 있으며, 코드 구조를 빠르게 파악하는 데 유용합니다.
6. http://www.mermaidchart.com 여기로 접속해 머메이드 ai에게 더 꾸며달라고 요청합니다.

 

프롬프트에서 머메이드 코드 얻기

 

노션에서 머메이드 생성 후 붙여넣기

 

http://www.mermaidchart.com 가서 예쁘게 해달라고 말하기
결과물

COMMENT
 
10
15

 

 

이번에 작성한 글은 Cursor를 빨리 익히기 위해 정보들을 모아봤습니다.

알아두면 진짜 좋은 기능들도 있으니 한번 공부해보시는걸 추천합니다.


#1 VSCode 연동

Cursor는 VSCode를 포크 떠서 만든 IDE기 떄문에 기존에 VSCode에서 사용하던 확장들을 가져올 수 있습니다.

Cursor Settings > General > Account

로 가셔서 설정할 수 있습니다.

Cursor Settings를 못찾겠다면 Ctrl + Shift + J를 누르셔서 여시면 됩니다.

 


#2 주요 커맨드 ( 단축키 )

Cursor에서는 아래 3가지 기능을 단축키로 외워두시면 80퍼센트 알게된거라 보시면 됩니다.

 

1. Tab

에디터에서 약 1초간 가만히 있으면 Cursor Copilot++이 AI로 코드를 자동완성 해줍니다.

 

코드 자동 예측해서 완성

 

다른 줄의 패턴에 따라 자동 완성

 

2. Ctrl + K

Ctrl + K를 사용하면 AI로 바로바로 코드를 편집하고 작성할 수 있습니다. 

이걸 쓰는 이유는 특정 범위 또는 줄만 바로 프롬포트로 수정하거나 질문 가능하기때문입니다.

완전히 새로운 코드를 생성하려면 아무 것도 선택하지 않고 Ctrl K만 입력하면 됩니다.

@Codebase, @Docs, @Web 등 여러 가지 심볼 설정을 똑같이 사용가능합니다.

심볼에 관해선 아래 #3 에 설명

코드에 Ctrl + K를 사용하면 미니 팝업이 뜹니다.

 

코드를 생성하거나 수정요청할 수 있으며 바뀌는걸 Ctrl + shift + Y로 수락, Ctrl + N로 거부
미니팝업에 질문을 쓰고 Alt + Enter를 입력하면 바로 해당 코드에 질문 가능합니다
또한 VSCode 내부 CMD 커맨드 터미널에도 사용 가능합니다

3. Ctrl + L

Ctrl + L를 사용하면 에디터 화면 오른쪽에 LLM과 Chat을 할 수 있는 탭이 열립니다.

Chat을 통해 현재 열린 코드 파일을 보는 AI와 대화할 수 있습니다. 

채팅에서는 항상 현재 파일과 커서를 볼 수 있으므로 "지금 코드에 버그가 있나요?"와 같은 질문을 할 수 있습니다. 

@Codebase, @Docs, @Web 등 여러 가지 심볼 설정을 똑같이 사용가능합니다.

심볼에 관해선 아래 #3 에 설명

Ctrl+Shift+L 또는 "@"을 사용하여 특정 코드 블록을 컨텍스트에 추가할 수 있습니다.
Ctrl+Enter를 눌러 전체 코드베이스와 채팅할 수 있습니다. 스캔에 조금 시간 걸립니다.

 


#3 심볼 @

Cursor에는 Chat이나 미니 프롬프트에 챗을 사용할 때 심볼로 검색 기능을 바꿀 수 있습니다.

 

"@" 기호를 입력시 여러 검색 기능을 볼 수 있으며 원하는 검색 방식을 선택할 수 있습니다.

 

@Codebase

@Codebase 를 입력시 전체 코드베이스를 스캔하여 답변을 합니다.

프로젝트 전체적으로 훑어보고 싶으시거나 파일 전체를 대상으로 질문하고 싶을 때 사용을 추천합니다. 

 

 

 

 

@Docs

@Docs 탭

 

Docs 탭을 선택 후 뜨는 입력창, 원하시는 문서 링크를 넣으시고 Confirm 눌러주세요

 

문서를 제대로 받아온 모습

 

 @Docs 를 입력시 인기 있는 라이브러리를 참조하거나 @Docs → Add new doc 를 사용하여

 원하시는 문서의 웹사이트 링크를 입력하여 참조가능합니다. 참조한 문서는 계속 사용 가능합니다.

 참조한 문서를 토대로 AI가 답변을 해줍니다.

 

 

 

@Web

@Web 를 입력시 AI가 인터넷에서 최신 정보를 검색하여 요약한 내용을 바탕으로 답변을 해줍니다.

 

 

이렇게 심볼을 상황에 맞게 잘 선택하여 써주시면 됩니다.

근데 @Web은 써보니까 그냥 제가 검색하는게 나을것 같은 성능이네요.

 


#4 AI 모델 추천, 어떤 모델을 써야할까?

2024.10.15 날짜 기준으로 Hobby(기본) 요금제를 사용하고 있는 제 화면에는 이렇게 모델들이 있습니다.

상황에 따라 다른 모델을 쓰는것을 추천합니다.

 

일반적인 상황

claude-3.5-sonnet이 추론 능력이라던지 일반적인 상황에선 쓰기 가장 좋았습니다.

 

복잡한 코드나 에러 분석해야할 때

o1-mini가 가장 전문적인 것 같아 쓰기 좋았습니다.

 

참고 : 모델 교체할 때는 ctrl + / 키를 누르시면 단축키로 바로 모델 교체 가능합니다.

모델 교체 메뉴를 바로 여는 단축키는 ctrl + alt + / 키입니다.

 

이외에도 따로 쓰고 싶으신 모델은 Cursor Settings 설정에 가셔서 토글하실 수 있고 원하는 모델을 추가할 수 있습니다.

 


#5 AI 규칙 설정 

Cursor Settings -> General -> Rules for AI

Cursor Settings(Ctrl + Shift + J)를 들어가보시면 AI 규칙을 설정할 수 있습니다.

 

그냥 써도 기본으로 최대한 한국어로 답변하라는 규칙이 설정되어있을겁니다.

이걸 조금 더 가공해서 더 퀄리티 높은 답변을 할 수 있도록하는 규칙을 공유해드리겠습니다. 

 

더보기

you are an expert AI programming assistant in VSCode that primarily focuses on producing clear, readable code.  
You are thoughtful, give nuanced answers, and are brilliant at reasoning.  
You carefully provide accurate, factual, and thoughtful answers, and you are a genius at reasoning.

1. Follow the user's requirements carefully and precisely.
2. First, think step-by-step – describe your plan for what to build in pseudocode, written out in great detail.
3. Confirm, then write the code!
4. Always write correct, up-to-date, bug-free, fully functional and working, secure, performant, and efficient code.
5. Focus on **readability** over performance.
6. Fully implement all requested functionality.
7. Leave **NO** to-dos, placeholders, or missing pieces.
8. Ensure the code is complete! Thoroughly verify the final version.
9. Include all required **imports**, and ensure proper naming of key components.
10. Be concise. Minimize any unnecessary explanations.
11. If you think there might not be a correct answer, say so. If you do not know the answer, admit it instead of guessing.
12. Always provide concise answers.
13. Please answer in Korean

혹시나 현재 사용하고 계신 언어에 맞게 또는 원하는 플랫폼에 맞는 AI 답변을 원할 경우

아래 링크에서 다른 규칙도 찾아보시는걸 추천 드립니다.

https://cursor.directory/

 

Cursor Directory

Find the best cursor rules for your framework and language

cursor.directory

 

 


#6 노트패드 기능 (베타)

Cursor에서도 노트패드를 관리할 수 있습니다.

Ctrl + i 키 또는 맥에선 Cmd + i 키를 누르셔서 Composer 탭을 열어주신 뒤(아마 작을겁니다)

오른쪽 상단에 Open Control Panel 버튼을 눌러주시면 노트패드가 열립니다.

노트패드창에서 왼쪽탭 상단에 더하기 버튼이 있을텐데 이 버튼을 눌러서 노트 하나 생성합시다.

 

노트 내용에 아무거나 쓰신 뒤 Ctrl + L 키를 눌러 프롬프트에 들고 갑시다.

이런식으로 방금 만든 노트패드가 @로 추적이 가능합니다.

노트패드를 프롬프트에 포함시켜 이런식으로 결과물을 받아올 수도 있긴하지만

노트패드 작성시에 AI 기능이 있었다면 더 좋지 않을까 싶네요 아직 베타니까 기다려봅시다.

 


#7 프로젝트 5분만에 분석하는 법

Cursor를 이용해 5분 만에 프로젝트 구조를 파악하는 방법을 알려드리겠습니다.

1. Ctrl + L 을 눌러 Cursor 채팅 패널을 엽니다.
2. "Normal chat"에서 "Long Context Chat"으로 변경합니다.
3. 프롬프트에 "@codebase를 파악해서 내 코드의 관계와 역할을 머메이드로 시각화해줘" 라고 입력합니다.
4. 노션에서 생성된 코드를 복사하여 붙여넣습니다.
5. 이 시각화는 깃허브 README.MD에서도 볼 수 있으며, 코드 구조를 빠르게 파악하는 데 유용합니다.
http://www.mermaidchart.com 여기로 접속해 머메이드 ai에게 더 꾸며달라고 요청합니다.

https://kimyir.tistory.com/97

 

Cursor로 5분만에 프로젝트 분석하기

프로젝트 5분만에 분석하는 법 Cursor를 이용해 5분 만에 프로젝트 구조를 파악하는 방법을 알려드리겠습니다. 1. Ctrl + L 을 눌러 Cursor 채팅 패널을 엽니다. 2. "Normal chat"에서 "Long Co

kimyir.tistory.com

 

 


 

이상 Cursor의 기본 사용 방법과 꿀팁을 정리해보았습니다.

VSCode를 바탕으로 만들어서 그런지 접근하기 쉬웠고 쓰기도 편한 것 같습니다.

물론 기능이 많은 만큼 IDE 속도가 느려진 것 같지만 능률을 위해서라면 그래도 쓸 것 같네요.

내 코드가 혹시나 AI가 학습하지 않을까 걱정되신다면

Cursor Settings -> General -> Privacy mode 탭에 가셔서 enabled로 설정해주시면 됩니다.

코드가 외부에 유출안되지만 AI 답변 품질이 떨어질 순 있습니다.


 

번외) 다른 유용한 AI 추천

 

터미널 AI 도우미
https://github.com/Aider-AI/aider

 

GitHub - Aider-AI/aider: aider is AI pair programming in your terminal

aider is AI pair programming in your terminal. Contribute to Aider-AI/aider development by creating an account on GitHub.

github.com

 

 

COMMENT
 
10
13

Func는 반환값이 있는 Action라고 생각하시면 됩니다.

만약에 그냥 List<UniTask>로 선언하고 외부에서 해당 리스트에 Add해보시면 즉시 실행될겁니다.

 

하지만 아래처럼 List<Func<UniTask> 로 선언하면 델리게이트처럼 함수들을 외부에서 Add해도

즉시 실행 되지 않고 잘 저장 됩니다.

 

 

TestUniTask.cs

public class TestUniTask : MonoBehaviour
{
	public List<Func<UniTask>> OnEndEvnt = new List<Func<UniTask>>();  // 비동기 메서드 참조
	private async void DetectGameEnd()
    {
        // OnEndEvnt의 모든 함수가 실행 완료될 때까지 대기
        if (OnEndEvnt.Count > 0)
        {
            foreach (var func in OnEndEvnt)
            {
                await func(); 
            }
        }
    }
}

위코드는 OnEndEvnt처럼 리스트에 등록된 비동기 Task들이 모두 await이 끝날 때까지 순차적으로 실행하고 기다리는것입니다.

만약 다 실행하고 각자 다 await하고 싶다면?

-> UniTask.Void(async () => { await func(); })를 해서 하나씩 따로 기다리시면 됩니다. 

 

외부 클래스

ClearStage.cs

public class ClearStage : MonoBehaviour
{

    private void Start()
    {
        TestUniTask.OnEndEvnt.Add(ClearStageTask);
    }
    public async UniTask ClearStageTask()
    {
        await UniTask.WaitForSeconds(5);
    }
}

 

 

꽤나 삽질했으니 알맞는 상황에 사용해보시기 바랍니다.

 
 

 

 

COMMENT