[KUT] Sec 03 탐색 & 시뮬레이션

Tarte·2025년 9월 5일

코딩테스트

목록 보기
20/28

소스코드와 문제는 다 제공하므로, 유형별로 개념 및 팁 정리

1. 문자열 처리

회문 검사 / 문자열 파싱

  • 개념
    - 파이썬에서 문자열은 불변(immutable) 자료형
    • 인덱싱/슬라이싱으로 부분 문자열 접근 가능
  • 회문 검사
    - 1. 문자열 뒤집기: s == s[::-1]
      1. 투 포인터: left=0, right=len-1 양끝 비교
  • 문자열 파싱
    - 구분자 기준 나누기: split()
    - 불필요 문자 제거: strip(), replace(), re.sub()
  • 주의할 점
    - 대소문자 통일 (lower()/upper())
    - 공백/특수문자 제거 여부 문제 조건 확인

2. 배열 조작

구간 뒤집기 / 정렬된 배열 병합

  • 구간 뒤집기
    - 슬라이싱 활용: arr[l-1:r] = arr[l-1:r][::-1]
    - deque 사용 시 O(1) pop/append 가능
  • 정렬된 배열 병합
    - 투 포인터 방식: 두 배열에서 작은 값을 먼저 결과에 추가
    - 파이썬 내장: heapq.merge(A, B) 또는 sorted(A+B) (하지만 시간/메모리 고려 필요)
  • 주의할 점
    - 인덱스 시작 기준(0 vs 1) 문제 조건 확인.

3. 부분 배열/구간

구간 합 / 투 포인터

  • 구간 합 (Prefix Sum)
    - prefix[i] = arr[0] + ... + arr[i-1]
    • 구간 [l, r] 합 = prefix[r] - prefix[l-1]
  • 투 포인터
    - 원리: 정렬된 배열에서 두 개의 인덱스를 이동하며 조건 만족 여부 확인
    - 활용:
    - 특정 합 찾기 (Two Sum)
    - 부분 합 조건 만족 구간 찾기
  • 주의할 점
    - 음수 포함 여부: 음수가 있으면 투 포인터 방식에서 단순 증감 불가 → 슬라이딩 윈도우 대신 누적합 활용

4. 2차원 배열

격자 패턴 / 회전 연산

  • 격자 탐색 => 방향 리스트
    - 보통 dx, dy 방향 배열을 선언 후 반복문으로 탐색
dx = [0, 0, -1, 1]  # 상하좌우
dy = [1, -1, 0, 0]
for i in range(4):
    nx, ny = x+dx[i], y+dy[i]
  • 회전 연산
    - 90° 회전: rotated[j][N-1-i] = arr[i][j]
    - 시뮬레이션 문제에서 자주 등장
  • 주의할 점
    - 인덱스 범위 체크 (0 <= nx < N and 0 <= ny < M)
    - 깊은 복사 필요 시 copy.deepcopy()

5. 검증/유효성 검사

  • 완전 탐색
    - 가능한 모든 경우를 다 확인 → 브루트포스
    - 시간 제한 체크: N이 크면 비효율 → 최적화 필요
  • 스도쿠 검증
    - 행, 열, 3x3 박스에 1~9가 모두 존재하는지 확인.
    - 집합(set)으로 중복 체크: len(set(arr)) == 9
  • 회문수 탐색
    - 정수 ↔ 문자열 변환 후 회문 검사
    - 또는 직접 나눠서 앞뒤 비교
profile
기술 블로그

0개의 댓글