코딩 테스트 문제를 풀면서 자주 마주치는 C# 문법 실수와 효율적인 풀이 방법을 정리했다.
특히 배열(Array)과 리스트(List)의 차이, 2차원 배열 처리, 그리고 LINQ 활용법을 중점적으로 복기해 본다.
파이썬이나 다른 언어에 익숙하면 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++)
{
// ...
}
배열을 복사해서 정답(answer) 변수를 만들었지만,
정작 계산은 원본(arr)에 하고 리턴은 수정되지 않은 answer를 넘기는 실수를 범했다.
answer는 복사 시점 그대로 0이거나 초기 상태임.arr를 수정하고 arr를 리턴하거나, answer를 수정하고 answer를 리턴해야 함.Clone() 메서드는 object를 반환하므로 반드시 (int[])로 캐스팅이 필요하며, 메서드이므로 () 괄호를 꼭 붙여야 한다.int[] answer = (int[])arr.Clone(); // 괄호와 캐스팅 필수!
"숫자 5와 0으로만 이루어진 정수 찾기" 같은 문제는 수학적으로 접근하기보다
문자열로 변환하여 처리하는 것이 훨씬 직관적이다.
이때 System.Linq의 All 메서드가 매우 강력하다.
Note: 코딩 테스트에서
using System.Linq;선언을 잊지 말자.
using System.Linq;
// i를 문자열로 바꾼 뒤, 모든 문자가 '5' 아니면 '0'인지 검사
if (i.ToString().All(c => c == '5' || c == '0'))
{
answer.Add(i);
}
문제에서 반환 타입으로 int[]를 요구한다고 해서,
내부 로직까지 고정된 배열(int[])을 고집할 필요는 없다.
데이터의 추가/삭제가 빈번한 스택/큐 로직은 List<int>로 구현하고 마지막에 변환하는 것이 정석이다.
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);
for문의 구조는 for (초기화; 조건식; 증감식) 이다.
i == 1 (X) -> i가 1일 때만 돔.i != 1 (O) -> i가 1이 될 때까지 돔.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)의 디테일을 챙기자.