컨텐츠 검색
[프로그래머스/Day 7] 데이터 규격화, 순환 데이터 처리, 논리적 인덱스 분리, 조합 탐색, 슬라이딩 윈도우와 자료형

2026. 1. 8. 11:22알고리즘

1. 데이터 규격화 (Normalization)

"복잡한 경우의 수(회전 등)는 '강제 정렬'로 단순화하라."

  • 문제 상황: 명함(직사각형)을 회전시킬 수 있을 때, 가로/세로를 어떻게 배치해야 최소 크기가 되는지 구할 때.
  • 해결: if문으로 회전 여부를 따지지 말고, "무조건 긴 쪽을 가로, 짧은 쪽을 세로"로 통일시켜 버린다.
  • Code Pattern:
// 눕히든 세우든 상관없이 큰 값을 w, 작은 값을 h로 고정
int w = max(sizes[i][0], sizes[i][1]);
int h = min(sizes[i][0], sizes[i][1]);

 

2. 순환 데이터 처리 (Cyclic Modulo)

"도는 것은 0부터 시작하게 만들어라. (0-Base Indexing)"

  • 문제 상황: 알파벳(z 다음 a), 시간(24시 다음 1시)처럼 끝과 시작이 연결된 데이터를 다룰 때.
  • 해결: 아스키코드 그대로 더하지 말고, 0 ~ N-1 범위로 변환한 뒤 나머지 연산(%)을 활용한다.
  • 공식: (현재값 - 시작값 + 이동량) % 주기 + 시작값
  • Code Pattern:
char base = isupper(c) ? 'A' : 'a';
// if문 없이 한 줄로 순환 처리 가능
c = base + (c - base + n) % 26;

 

3. 논리적 인덱스 분리

"반복문의 i를 맹신하지 마라."

  • 문제 상황: 공백을 제외하고 홀/짝 인덱스를 판단해야 할 때. (예: "Hello World" -> "HeLlO WoRlD")
  • 해결: for문의 i는 전체 위치일 뿐이다. 문제 로직을 위한 별도의 변수(idx)를 선언하고 직접 제어한다.
  • Code Pattern:
int idx = 0; // 별도 인덱스 관리
for (char c : s) {
    if (c == ' ') {
        idx = 0; // 초기화
        continue;
    }
    // 로직 처리 후 idx 직접 증가
    idx++; 
}

 

 

4. 조합 탐색의 정석 (Combination)

"중복 없는 조합은 i + 1부터 시작한다."

  • 문제 상황: 순서 상관없이 N개 중 3개를 뽑는 경우 (nC3).
  • 해결: 다중 for문 작성 시, 내부 루프의 시작점을 상위 루프 인덱스 + 1로 설정한다.
  • Code Pattern:
for (int i = 0; i < n; ++i) {
    for (int j = i + 1; j < n; ++j) {     // i 다음부터
        for (int k = j + 1; k < n; ++k) { // j 다음부터
            // 로직 수행
        }
    }
}

 

5. 슬라이딩 윈도우와 자료형

  • 슬라이딩 윈도우: 고정된 틀(Window)을 만들어 한 칸씩 옆으로 밀면서(Sliding) 확인

"길이를 뺄 때는 오버플로우(Underflow)를 주의하라."

  • 문제 상황: 문자열 t에서 길이가 pLen인 부분 문자열을 계속 잘라서 확인할 때.
  • 해결:
    1. 반복문 종료 조건은 tLen - pLen이다.
    2. size_t(unsigned)끼리 뺄셈을 하면 음수가 아니라 엄청 큰 양수가 될 수 있으므로, 형변환(int)을 하거나 덧셈식으로 비교한다.
    3. 숫자 변환 시 범위가 크다면 stoi 대신 stoll (long long)을 사용한다.
  • Code Pattern:
// 안전한 반복문 조건 (형변환 사용)
for (int i = 0; i <= (int)t.size() - (int)p.size(); ++i) {
    long long num = stoll(t.substr(i, p.size())); // stoll 활용
}
  • 창문을 밀면서 확인하는(슬라이딩 윈도우) 로직을 짤 때는, 그 창문 안에 들어오는 숫자가 얼마나 큰지(자료형) 반드시 체크해야 한다.