포스트

TIL 2026-03-10

TIL 2026-03-10

3/10

생성일: 2026년 3월 10일 오전 10:30

챕터 3-4 시뮬레이션

학습 목표

  • 시뮬레이션 핵심 개념을 코드에 적용하고, 2차원 좌표/행렬 문제를 해결하는 흐름을 익혔다.
  • 좌표 이동(dy, dx), 대칭/회전, 대각선 순회, 행렬 연산의 규칙을 문제에 연결했다.

핵심 개념 요약

  • 좌표 표현: 2차원 배열에서 y는 행, x는 열 인덱스.
  • 이동 오프셋: dy, dx 배열로 4방향/8방향 탐색을 하드코딩 없이 처리.
  • 좌우 대칭: (y, x) -> (y, (N-1)-x)
  • 상하 대칭: (y, x) -> ((N-1)-y, x)
  • 90도 회전: (y, x) -> ((N-1)-x, y)
  • 정방향 대각선: (y+1, x+1), 역방향 대각선: (y+1, x-1)
  • 행렬 덧셈: 같은 위치 원소끼리 연산 / 행렬 곱셈: A의 행과 B의 열 내적

문제별 구현 포인트

  • 문제 64 달팽이 수열: start/end 경계를 좁혀가며 외곽부터 채우는 경계 수축 방식.
1
2
3
while (start_row <= end_row && start_col <= end_col) {
  // 상->우->하->좌 순서로 채우고 경계 갱신
}
  • 문제 65 이진 변환: 0 제거 횟수 누적 + 1의 개수를 이진 문자열로 재생성 반복.
1
2
removedZeros += count(s.begin(), s.end(), '0');
int onesCount = count(s.begin(), s.end(), '1');
  • 문제 69 캐릭터 좌표: 보드 경계값(±board/2) 체크 후 이동 적용.
1
2
if (s=="up" && v[1] < board[1]/2) v[1]++;
else if (s=="left" && v[0] > -board[0]/2) v[0]--;

시간복잡도 감각 정리

주제대표 복잡도메모
dy/dx 인접 순회O(방향 수)4방향/8방향은 상수
달팽이 수열 n*n 채우기O(n^2)모든 칸 1회 방문
이진 변환 반복문자열 길이 의존count + 문자열 재구성 반복
캐릭터 좌표O(keyinput 길이)입력 1개당 상수 연산

자습 복기 (오늘 어조)

  • 오늘 자습하면서 시뮬레이션은 공식을 외우는 것보다 좌표 변환 규칙을 코드로 옮기는 감각이 더 중요하다고 느꼈다.
  • 특히 dy/dx와 경계 체크를 템플릿처럼 고정해두면 구현 속도와 정확도가 같이 올라간다.

다음 액션

  • dy/dx 4방향/8방향 템플릿을 별도 스니펫으로 정리
  • 좌우/상하/회전 좌표 변환 공식을 손으로 1회 재유도
  • 달팽이/좌표 이동 문제 각 1개씩 추가 풀이

챕터 3-5 스택

학습 목표

  • 스택의 개념과 LIFO(Last In First Out) 원리를 이해했다.
  • Push/Pop/Top 같은 주요 연산의 의미와 사용 시점을 정리했다.
  • STL stack 컨테이너를 활용한 구현 감각을 익혔다.

핵심 키워드

  • LIFO: 가장 나중에 넣은 데이터가 가장 먼저 나온다.
  • Push: 데이터 삽입 / Pop: 최상단 제거 / Top: 최상단 조회
  • ADT 관점: 스택은 인터페이스(연산) 중심으로 추상화된 자료구조다.
  • 실사용 예시: 브라우저 뒤로가기, 함수 호출 스택

코드 스니펫 요약

1
2
3
4
5
6
7
8
9
#include <stack>
stack<string> history;
history.push("A");
history.push("B");
history.push("C");

cout << history.top() << endl; // C
history.pop();
cout << history.top() << endl; // B
  • 뒤로가기 기능은 “최근 방문 페이지를 제거하고 이전 페이지로 이동”이라 스택 모델과 일치한다.
1
2
3
void B(){ cout << "B 호출" << endl; cout << "B 종료" << endl; }
void A(){ cout << "A 호출" << endl; B(); cout << "A 종료" << endl; }
int main(){ cout << "main 호출" << endl; A(); cout << "main 종료" << endl; }
  • 함수 호출/복귀 흐름도 LIFO라서 호출 스택 개념을 직관적으로 보여준다.

시간복잡도 요약

연산시간복잡도비고
pushO(1)최상단 삽입
popO(1)최상단 제거
topO(1)최상단 조회(제거 아님)

오늘 자습 관점 복기

  • 스택 문제는 “가장 최근 것 처리” 시그널을 먼저 찾는 습관이 중요하다고 느꼈다.
  • STL 메서드(push/pop/top/empty) 호출 순서를 정확히 익히면 구현 실수가 크게 줄어든다.

내일 액션 아이템

  • stack로 괄호 유효성 검사 문제 1개 구현
  • top() 호출 전에 empty() 체크 습관화
  • DFS(재귀)와 호출 스택 관계를 예제로 한 번 더 정리

챕터 3-6 큐

학습 목표

  • 큐의 개념과 FIFO(First-In First-Out) 원리를 이해했다.
  • 큐의 주요 연산(push, pop, front, empty)을 STL 기준으로 정리했다.
  • 실사용 예시(공용 프린터, 매표소 대기)를 통해 적용 상황을 연결했다.

핵심 키워드

  • FIFO: 먼저 들어간 데이터가 먼저 나오는 구조
  • push(): 뒤(rear)에 삽입 / pop(): 앞(front) 제거
  • front(): 가장 먼저 들어온 데이터 조회
  • empty(): 큐가 비었는지 검사

코드 스니펫 요약

1
2
3
4
5
6
7
8
9
#include <queue>
queue<string> q;
q.push("PC-B");
q.push("PC-C");
q.push("PC-A");
while(!q.empty()){
  cout << q.front() << endl;
  q.pop();
}
  • 공용 프린터 예시는 요청 순서대로 처리되어 FIFO 특성을 직관적으로 보여준다.
1
2
3
4
5
6
7
8
queue<string> ticketLine;
ticketLine.push("Alice");
ticketLine.push("Bob");
ticketLine.push("Charlie");
while(!ticketLine.empty()){
  cout << ticketLine.front() << " got the ticket." << endl;
  ticketLine.pop();
}
  • 매표소 대기열 시뮬레이션도 동일한 FIFO 규칙으로 동작한다.

시간복잡도 요약

연산시간복잡도비고
pushO(1)뒤에 삽입
popO(1)앞에서 제거
frontO(1)앞 원소 조회

자습 메모

  • 스택(LIFO)와 큐(FIFO)의 차이를 문제 상황에 먼저 매핑하면 자료구조 선택이 빨라진다.
  • queue 기본 템플릿으로 BFS 기본 문제 1개 풀기
  • front 호출 전 empty 체크 습관 유지하기

이전 프로젝트 복기

  • 마이그래이션 후 레퍼런스 끊김(깨진 참조)이 없는지 레벨/블루프린트 단위로 열어서 확인했다.
  • 폴더 구조와 네이밍 규칙이 뒤섞이지 않았는지(임시 폴더, 중복 에셋, 한글/공백 이름) 정리 기준을 적용했다.
  • 리다이렉터(Redirector)를 정리하고, 이동/이름변경한 에셋이 실제 경로로 정상 참조되는지 점검했다.
  • 블루프린트 컴파일 경고/오류를 한 번에 넘기지 않고, 오늘 만든 수정사항부터 우선 해결했다.
  • 프로젝트 버전/플러그인 의존성 차이로 생길 수 있는 충돌 가능성을 확인했다.

오늘 작업 복기

  • 오늘 자습하면서 “기능 추가”보다 “기초 안정화”를 우선했다.
  • 특히 마이그래이션 이후에는 동작만 되면 끝이 아니라, 참조 구조를 확인했다.
  • 다음 작업부터는 파일 이동/리네임 후 바로 리다이렉터 정리를 루틴으로 고정할 생각이다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.