문제 해결 아이디어
각 음식의 개수 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"을 넣고 다시 뒤에서부터 같은 방식으로 추가하는 방법이다.
구현 흐름
- food[1]부터 순회
- 홀수라면 food[i] -= 1
- food[i] / 2 만큼 왼쪽 문자열 생성
- "0" 추가
- 배열을 뒤에서부터 다시 순회하며 오른쪽 문자열 생성
특징
장점
- 문제의 대칭 구조를 그대로 구현한 직관적인 방식
- 별도의 문자열 복사 없음
단점
- 비슷한 반복문이 두 번 등장
- 코드 길이가 길어짐
구조
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하여 오른쪽을 만드는 방식이다.
구현 흐름
- food[1]부터 순회
- food[i] / 2 만큼 half 문자열 생성
- half 복사 → re_half
- reverse()로 뒤집기
- answer = half + "0" + re_half
특징
장점
- 코드가 훨씬 간결
- 반복문이 한 번만 등장
- 대칭 구조 표현이 명확
단점
- 문자열을 한 번 복사해야 함
구조
half 생성
-> reverse(half)
-> half + "0" + reversed_half
두 방법 비교
방식반복문 수코드 길이직관성
| 직접 생성 | 2 | 길다 | 구조가 명확 |
| reverse 활용 | 1 | 짧다 | 구현이 간결 |
일반적으로는 reverse를 사용하는 방식이 더 깔끔한 풀이가 된다.
느낀 점
대칭 구조 문제에서는 다음 패턴이 자주 등장한다.
- 왼쪽만 만든다
- reverse로 오른쪽 생성한다
- 중앙 요소 추가
문자열이나 배열을 다룰 때 불필요한 반복문을 줄이기 위해 reverse 패턴을 활용하는 것이 좋은 습관이라는 것을 다시 확인했다.
'내배캠 TIL' 카테고리의 다른 글
| [내배캠 TIL 260311] Unreal Network - NetDriver 구조 정리 (0) | 2026.03.11 |
|---|---|
| [내배캠 TIL 260310] Unreal Dedicated Server (0) | 2026.03.10 |
| [내배캠 TIL 260305] CH.3 조별 과제 KPT회고 (0) | 2026.03.05 |
| [내배캠 TIL 260304] 적 사망 시 피격 판정 제거 및 사운드 중복 방지 (0) | 2026.03.04 |
| [내배캠 TIL 260224] C++ std::sort 커스텀 비교 함수 구현하기 (0) | 2026.02.24 |