내배캠 TIL

[내배캠 TIL 260309] C++ 대칭 문자열 생성

xodn246 2026. 3. 9. 21:58

문제 해결 아이디어

각 음식의 개수 food[i] 중에서 절반만 사용하여 왼쪽 문자열을 만든 뒤, 중앙에 "0"을 두고 대칭 구조를 만들어야 한다.

핵심 포인트

  • food[i]는 짝수 개만 사용 가능
  • 따라서 food[i] / 2 만큼 왼쪽에 배치
  • 오른쪽은 왼쪽의 역순

1. 직접 양쪽 문자열을 만드는 방식

#include <string>
#include <vector>

using namespace std;

string solution(vector<int> food) {
    string answer = "";
    for(int i = 1 ; i < food.size(); ++i)
    {
        if(food[i] % 2 == 1) food[i] -= 1;
        
        for(int j = 0 ; j < food[i] / 2 ; ++j)
        {
            answer += to_string(i);
        }
    }
    
    answer += '0';
    
    for(int i = food.size() - 1 ; i > 0 ; --i)
    {
         for(int j = 0 ; j < food[i] / 2 ; ++j)
        {
            answer += to_string(i);
        }
    }
}

 

왼쪽 절반을 먼저 만든 뒤, "0"을 넣고 다시 뒤에서부터 같은 방식으로 추가하는 방법이다.

구현 흐름

  1. food[1]부터 순회
  2. 홀수라면 food[i] -= 1
  3. food[i] / 2 만큼 왼쪽 문자열 생성
  4. "0" 추가
  5. 배열을 뒤에서부터 다시 순회하며 오른쪽 문자열 생성

특징

장점

  • 문제의 대칭 구조를 그대로 구현한 직관적인 방식
  • 별도의 문자열 복사 없음

단점

  • 비슷한 반복문이 두 번 등장
  • 코드 길이가 길어짐

구조

left 생성
-> "0"
-> right 생성 (역순 순회)
 

2. reverse를 활용한 방식

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

string solution(vector<int> food) {
    string answer = "";    
    string half = "";
    
    for(int i = 1 ; i < food.size(); ++i)
    {
        if(food[i] % 2 == 1) food[i] -= 1;
        
        for(int j = 0 ; j < food[i] / 2 ; ++j)
        {
            half += to_string(i);
        }
    }
    
    string re_half = half;
    reverse(re_half.begin(), re_half.end());
    
    answer = half + "0" + re_half;
    
    return answer;
}

 

왼쪽 문자열 half만 만든 뒤, 이를 복사해서 reverse하여 오른쪽을 만드는 방식이다.

구현 흐름

  1. food[1]부터 순회
  2. food[i] / 2 만큼 half 문자열 생성
  3. half 복사 → re_half
  4. reverse()로 뒤집기
  5. answer = half + "0" + re_half

특징

장점

  • 코드가 훨씬 간결
  • 반복문이 한 번만 등장
  • 대칭 구조 표현이 명확

단점

  • 문자열을 한 번 복사해야 함

구조

half 생성
-> reverse(half)
-> half + "0" + reversed_half
 

두 방법 비교

방식반복문 수코드 길이직관성
직접 생성 2 길다 구조가 명확
reverse 활용 1 짧다 구현이 간결

일반적으로는 reverse를 사용하는 방식이 더 깔끔한 풀이가 된다.


느낀 점

대칭 구조 문제에서는 다음 패턴이 자주 등장한다.

  1. 왼쪽만 만든다
  2. reverse로 오른쪽 생성한다
  3. 중앙 요소 추가

문자열이나 배열을 다룰 때 불필요한 반복문을 줄이기 위해 reverse 패턴을 활용하는 것이 좋은 습관이라는 것을 다시 확인했다.