[C#] 코딩테스트 오답노트: 배열, 리스트, 그리고 LINQ

정광훈(Unity_9기)·2026년 2월 12일

TIL (Today I Learned)

목록 보기
104/110

코딩 테스트 문제를 풀면서 자주 마주치는 C# 문법 실수와 효율적인 풀이 방법을 정리했다.
특히 배열(Array)과 리스트(List)의 차이, 2차원 배열 처리, 그리고 LINQ 활용법을 중점적으로 복기해 본다.

1. 2차원 배열의 행 개수 구하기

파이썬이나 다른 언어에 익숙하면 len(arr) 처럼 길이를 구하려고 하거나,
리스트의 Count 프로퍼티와 혼동하기 쉽다. C#의 2차원 배열(int[,])은 GetLength를 써야 한다.

❌ 실수한 코드

// queries가 2차원 배열일 때
for (int i = 0; i < queries.GetRange(0); i++) // Error: GetRange는 리스트 메서드
{
    // ...
}

✅ 올바른 코드

// 0은 행(Row), 1은 열(Col)의 길이를 뜻함
for (int i = 0; i < queries.GetLength(0); i++) 
{
    // ...
}

2. '빈 깡통' 배열 리턴 문제 (Clone의 중요성)

배열을 복사해서 정답(answer) 변수를 만들었지만,
정작 계산은 원본(arr)에 하고 리턴은 수정되지 않은 answer를 넘기는 실수를 범했다.

  • 문제점: answer는 복사 시점 그대로 0이거나 초기 상태임.
  • 해결책: arr를 수정하고 arr를 리턴하거나, answer를 수정하고 answer를 리턴해야 함.
  • 주의: Clone() 메서드는 object를 반환하므로 반드시 (int[])로 캐스팅이 필요하며, 메서드이므로 () 괄호를 꼭 붙여야 한다.
int[] answer = (int[])arr.Clone(); // 괄호와 캐스팅 필수!

3. 특정 숫자로만 이루어진 수 찾기 (LINQ 활용)

"숫자 5와 0으로만 이루어진 정수 찾기" 같은 문제는 수학적으로 접근하기보다
문자열로 변환하여 처리하는 것이 훨씬 직관적이다.
이때 System.LinqAll 메서드가 매우 강력하다.

Note: 코딩 테스트에서 using System.Linq; 선언을 잊지 말자.

✅ 핵심 로직

using System.Linq;

// i를 문자열로 바꾼 뒤, 모든 문자가 '5' 아니면 '0'인지 검사
if (i.ToString().All(c => c == '5' || c == '0'))
{
    answer.Add(i);
}

4. 스택(Stack) 구현 시 List 사용하기

문제에서 반환 타입으로 int[]를 요구한다고 해서,
내부 로직까지 고정된 배열(int[])을 고집할 필요는 없다.
데이터의 추가/삭제가 빈번한 스택/큐 로직은 List<int>로 구현하고 마지막에 변환하는 것이 정석이다.

💡 Tip: 리스트를 배열로 변환해서 제출

List<int> stk = new List<int>();
// ... (Add, RemoveAt 등 자유롭게 사용) ...

return stk.ToArray(); // 제출할 때만 배열로 변환

⚠️ 리스트 삭제 시 주의점 (Remove vs RemoveAt)

  • stk.Remove(값): 해당 을 찾아 지운다. (앞에 있는 중복 값이 지워질 수 있음)
  • stk.RemoveAt(인덱스): 해당 위치의 값을 지운다. (스택의 Pop 동작은 이걸 써야 함)
// 스택의 top(마지막 원소) 제거하기
stk.RemoveAt(stk.Count - 1); 

5. for문 문법 실수 (증감식과 조건식)

for문의 구조는 for (초기화; 조건식; 증감식) 이다.

  1. 조건식: "반복을 계속할 조건"이다. "멈추는 조건"이 아니다.
    • i == 1 (X) -> i가 1일 때만 돔.
    • i != 1 (O) -> i가 1이 될 때까지 돔.
  2. 증감식: 반드시 변수의 값이 변해야 한다.
    • i % 2 (X) -> 계산만 하고 버림. 에러 발생.
    • i = i % 2 (O) -> 계산 결과를 i에 대입함.
// 예: n이 1이 될 때까지 반복 (콜라츠 추측 등)
for (int i = n; i != 1; i = i % 2 == 0 ? i / 2 : i * 3 + 1)

📝 오늘의 결론

  • 코딩 테스트의 반환 타입(int[])에 얽매이지 말고, 풀기 편한 List를 적극 활용하자.
  • 문자열 처리가 필요한 숫자 문제는 ToString()과 LINQ(All, Any)를 기억하자.
  • 기본 문법(Length, RemoveAt, Clone)의 디테일을 챙기자.

0개의 댓글