학습 목표: 복잡한 규칙을 작은 상태 전이로 나누고 예시를 단계별로 추적합니다. 모든 예시는 주어진 매개변수를 처리해 정답을 반환하는 solution 함수로 완성합니다.
문제를 푸는 기준
상태 목록과 명령 하나의 처리 순서를 먼저 적습니다. 후보 상태를 만든 뒤 유효할 때만 현재 상태로 확정합니다.
핵심 개념
| 개념 | 코딩테스트에서의 역할 |
|---|---|
| 상태 | 위치, 방향, 점수처럼 다음 단계에 필요한 값입니다. |
| 전이 | 명령 하나가 상태를 어떻게 바꾸는지 정의합니다. |
| 경계 검사 | 범위와 금지 조건을 상태 변경 전에 확인합니다. |
대표 문제
장애물 격자 로봇
문자 격자 board, 시작 좌표 start, UDLR 명령 commands가 주어집니다. 범위 밖이나 # 칸 이동을 무시한 최종 좌표를 반환하세요.
함수 시그니처: solution(board, start, commands)
제한사항
- 행과 열은 각각 1 이상 500 이하입니다.
- start는 이동 가능한 칸입니다.
입출력 예
| 매개변수 | 반환값 |
|---|---|
[...., .##., ....], [0,0], RRDD | [0,1] |
풀이 설계
- 명령별 행·열 변화량을 찾습니다.
- 후보 좌표를 계산합니다.
- 범위 안이고 장애물이 아닐 때만 좌표를 갱신합니다.
JavaScript 풀이
function solution(board, start, commands) {
const move = { U: [-1, 0], D: [1, 0], L: [0, -1], R: [0, 1] };
let [row, col] = start;
for (const command of commands) {
const [dr, dc] = move[command];
const nr = row + dr;
const nc = col + dc;
const inRange = nr >= 0 && nr < board.length && nc >= 0 && nc < board[0].length;
if (!inRange || board[nr][nc] === '#') continue;
row = nr;
col = nc;
}
return [row, col];
}복잡도
- 시간복잡도:
O(m) - 공간복잡도:
O(1) - 핵심 패턴: 후보 상태를 만든 뒤 유효할 때만 확정
- 경계 사례: 무효 이동은 좌표를 바꾸지 않고 다음 명령 처리
연습 문제
1. 행렬 회전
정사각 행렬을 시계 방향으로 회전해 반환하세요.
힌트
원래 행·열의 새 위치
2. 달력 계산
특정 날짜의 요일을 반환하세요.
힌트
이전 달 일수 누적
3. 블록 제거
열에서 블록을 꺼내 같은 값이 만나면 제거하세요.
힌트
열 상태와 스택
자주 하는 실수
- 상태를 먼저 바꾸고 검증하는 실수
- 행과 열 변화량을 뒤집는 실수
- 규칙 우선순위를 바꾸는 실수
- 직사각형을 정사각형으로 가정하는 실수
핵심 정리
- 함수 시그니처와 반환 자료형을 먼저 확정합니다.
- 제한사항으로 가능한 시간복잡도를 판단합니다.
- 예시와 경계 사례를 손으로 추적한 뒤 구현합니다.
- 완성한
solution함수가 입력을 불필요하게 바꾸지 않는지도 확인합니다.
확인 문제
문제 14지선다
경계 밖 이동을 처리하는 안전한 순서는?
문제 24지선다
대표 문제의 시간복잡도로 알맞은 것은?
문제 34지선다
장애물 격자 로봇에서 사용한 핵심 패턴은?
문제 44지선다
대표 문제에서 반드시 확인할 경계 사례는?
문제 54지선다
이 과정의 정답 코드가 지켜야 할 계약은?
참고 자료
Last updated on