주어진 food 배열을 가지고 규칙에 맞게 왼쪽과 오른쪽이 대칭되는 문자열을 만들어 반환하는 문제였다.
*초기 작성 코드
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string solution(vector<int> food) {
string answer = "";
for (int i = 1; i < food.size(); ++i)
{
string temp = to_string(i);
for (int j = 0; j < food[i] / 2; ++j)
{
answer += temp;
}
}
string temp = answer;
sort(temp.begin(), temp.end(), greater<>());
answer += '0' + temp;
return answer;
}
- 왼쪽을 먼저 규칙에 맞게 만든 후 '0' 과 반대로 정렬한 문자열을 추가해서 완성시키도록 하였다.
- 일단 코드가 길어 가독성 면에서 좋지 않고 2중 for문에 sort까지 사용해서 아쉽다는 생각이 들었다.
*다른 사람 풀이 참고해 수정 ver_1
#include <string>
#include <vector>
using namespace std;
string solution(vector<int> food) {
string answer = "0";
int count;
for(int i = food.size() - 1; i > 0; --i)
{
count = food[i] / 2;
while(count)
{
answer = to_string(i) + answer + to_string(i);
--count;
}
}
return answer;
}
- 반복문을 두 번 사용하는 것은 같지만 가운데 '0'을 기점으로 끝 숫자 부터 채워넣어 sort를 사용하지 않았다.
- 내가 처음 작성한 코드보다 더 심플해 가독성이 좋아보인다.
*다른 사람 풀이 참고해 수정 ver_2
#include <string>
#include <vector>
using namespace std;
string solution(vector<int> food) {
string answer = "";
for(int i = 1; i < food.size(); ++i)
{
answer.insert(answer.size() >> 1, food[i] - (food[i] & 1), '0' + i);
}
answer.insert(answer.size() >> 1, 1, '0');
return answer;
}
- 반복문을 1개만 사용했고 sort 또한 사용하지 않아서 제일 가독성이 좋으면서 속도도 빨라보인다.
- 처음에 answer.size( ) >> 1의 의미를 몰랐었는데, answer.size( )의 비트를 오른쪽으로 1만큼 이동시키는 연산이다. 오른쪽으로 1만큼 이동시킨 다는 것은 answer.size( )를 2의 1승으로 나눈 몫을 의미하게 되고 이는 절반으로 나눈 것이랑 같은 의미이다. 즉 answer의 현재 크기 중 가운데에 위치한 인덱스를 구하는 식이라고 보면 된다. ">>" 비트연산자에 관한 자세한 내용은 아래 링크에 따로 정리하겠다.
- food[i] & 1 의 의미는 이전에 And 비트 연산자를 정리하면서 알게 되었던 내용인데 비트에 대한 개념이 아직 정확하게 자리 잡지 않아서 다시 찾아보게 되었다. 간략하게 정리하면 홀수이면 1을 반환하고 짝수라면 0을 반환하게 된다. 이에 대한 정리 내용도 아래 링크에서 확인해보자.
https://dong-grae.tistory.com/74
비트 연산자
비트 And 연산자 / '&' 두 정수의 이진수 표현에서 같은 자리의 비트를 비교하여, 두 비트가 모두 1일 때만 '1'을 반환하고 나머지 경우에는 '0'을 반환하는 연산자이다.하드웨어 수준에서 작동하므
dong-grae.tistory.com
'공부 > Code Cata' 카테고리의 다른 글
과일장수 (0) | 2025.01.07 |
---|---|
priority_queue 우선순위 큐 활용 (0) | 2025.01.06 |
람다 함수로 사용자 설정 정의해 정렬하기 (0) | 2025.01.01 |
문자열에서 영문 숫자 변환하기 (0) | 2024.12.31 |
시저 암호(알파벳 순환 이동) (0) | 2024.12.31 |