
오늘은 개인과제가 끝나고 이제
팀 프로젝트에 들어가는 날이었다.
내가 메인으로 맡은 부분은 데이터, 저장 관련 부분인데 처음 배우는 부분이라 일단 공부부터 쭉 하고 나서 시작할려고 한다.
그런 의미에서 오늘의 TIL은 스크럼에서 진행한 코테 문제 백준 1406번 되시겠다.


알고리즘 분류가 자료구조, 스택, 연결 리스트이었지만 나는 리스트로만 풀었다. 사실 시간이 빡빡한 문제여서 이렇게 풀어도 되나 싶었는데 어쩃든 시간초과 안뜨고 잘 넘어가서 뿌듯? 했다고한다..
using System;
using System.Collections.Generic;
using System.Text;
class Program
{
static void Main()
{
List<char> text = new List<char>(Console.ReadLine()); // 맨날 for 구문으로 넣다가 좀 더 편한 방법이 있길래 써봤습니다.
int cursor = text.Count; // 커서는 맨 뒤에서 시작
StringBuilder sb = new StringBuilder();
int n = int.Parse(Console.ReadLine());
for (int i = 0; i < n; i++)
{
string[] command = Console.ReadLine().Split();
switch (command[0])
{
case "L":
if (cursor > 0) cursor--;
break;
case "D":
if (cursor < text.Count) cursor++;
break;
case "B":
if (cursor > 0)
{
text.RemoveAt(cursor - 1);
cursor--;
}
break;
case "P":
//text.Insert(cursor, command[1]); -> Insert가 2번째 인자로 char를 받음
char ch = command[1][0];
text.Insert(cursor, ch);
cursor++;
break;
}
}
foreach (char ch in text)
sb.Append(ch);
Console.WriteLine(sb);
}
}
간단하게 정리를 하면 입력을 받아서 Switch 구문을 통해 각 명령어를 처리하는 형식이다.
나는 위에 말했듯이 리스트와 리스트의 위치를 가르쳐줄 커서를 통해 처리하였는데
L이면 커서를 왼쪽으로 땡기고, D면 커서를 오른쪽
B면 커서-1의 위치에 있는 요소를 삭제, 커서를 왼쪽으로 이동시켜준다.
마지막으로 P면 커서의 위치에 요소를 넣어주고 커서를 한 칸 오른쪽으로 이동시켜준다.
그렇게 문제를 해결하고 각 자 자신의 코드를 리뷰하는 시간에 조원분들 중 한 분이 연결리스트를 사용하여 풀으셨었다.
근데 내가 배웠기로는 C에서는 연결리스트는 중간 요소를 삭제하게 되면 참조 주소를 다시 연결 시켜줘야되는 걸로 알고 있었는데
그냥 Remove()로만 구현되어있길래 궁금해서 조금 찾아보았다.
C#에서의 링크드리스트의 중간요소 삭제에 관하여
- 중간 요소를 삭제할 때 참조 주소가 바뀌지 않는 것에 대한 고찰
- C#의 LinkedList<T>는 이중 연결 리스트(doubly linked list)로 구현되어 있고, 중간 노드를 삭제해도 나머지 노드들의 참조 주소는 바뀌지 않습니다.
- LinkedList<T>는 내부적으로 LinkedListNode<T> 객체를 통해 각 노드를 연결합니다.
- 예를 들어 다음과 같은 연결이 있다고 해봅시다:
여기서 node3이 중간 노드일 때, list.Remove(node3) 를 호출하면:node1 <-> node2 <-> node3 <-> node4- node2.Next가 node4를 가리키도록 업데이트
- node4.Previous가 node2를 가리키도록 업데이트
- node3은 리스트에서 분리됨
- node1, node2, node4의 참조 주소는 바뀌지 않음
- 단지 Next와 Previous 포인터(참조)가 변경될 뿐
- 삭제된 node3은 여전히 메모리에 존재할 수 있지만, 더 이상 리스트에 포함되지 않음
- 노드들이 체인처럼 연결되어 있고, 중간 고리를 하나 잘라내면 나머지 고리들은 그대로인 상태에서 연결만 다시 조정하는 셈이에요.
🔹 정리
항목 C C# (.NET)
| 참조 주소 변경 | 수동 (prev->next = slow->next) | 자동 (LinkedList<T>.Remove(node)) |
| 메모리 해제 | 수동 (free(node)) | 자동 (가비지 컬렉터가 알아서 해제) |
| 연결 구조 유지 책임 | 프로그래머 | .NET 런타임 시스템 |
요약하자면,
C에서는 참조(포인터) 주소를 명시적으로 우리가 바꿔줘야 하고, 그게 안 되면 리스트 구조가 깨집니다.
위와 같이 C#에서 Remove를 진행하면 자동으로 참조를 해준다고 합니다.
C는 수동으로 다시 참조 주소를 잡아줘야 한다고 합니다.
'내일배움캠프 - TIL > 내일배움캠프 - TIL' 카테고리의 다른 글
| 내일배움캠프 21일차 - Unity Rider (0) | 2025.05.16 |
|---|---|
| 내일배움캠프 20일차 - 유니티 입문 팀 프로젝트 회고 (5) | 2025.05.15 |
| 내일배움캠프 18일차 - 개인 과제(스파르타 메타버스 트러블 슈팅) (0) | 2025.05.07 |
| 내일배움캠프 17일차 - 백준 9012, 유니티 씬 별로 해상도 다른 이슈 (0) | 2025.05.02 |
| 내일배움캠프 16일차 - 백준 9093 (0) | 2025.05.01 |