vector 안의 요소가 1231 이 되는지 확인하면 되는 로직이지만
index 가 처음으로 계속 다시 돌아갈 경우 시간초과가 발생한다.
그러므로 vector 탐색을 한번으로 끝내는 방법을 사용해야 하는데
vector 의 back 을 평소처럼 불러서 쓰는 방법이 아닌 할당하는 방법으로 위의 문제를 해결 가능했다.
int solution(vector<int> ingredient) {
int answer = 0;
vector<int> v = { -1 };
for (int i : ingredient)
{
if (v.back() == 1 && i == 2)
v.back() = 12;
else if (v.back() == 12 && i == 3)
v.back() = 123;
else if (v.back() == 123 && i == 1)
{
answer++;
v.pop_back();
}
else
v.push_back(i);
}
return answer;
}
두 개의 문자열을 서로 비교해서 겹치는 문자를 찾아야하는 문제인데 여기서 단순히 중첩
반복문을 쓸 경우 입력 범위가 너무 커서 시간 초과가 된다.
따라서 단순히 문자의 개수를 세고 이를 통해 겹치는 부분을 계산하는 로직으로
map (혹은 1차원 배열) 을 이용한다.
string solution(string X, string Y) {
string answer = "";
map<char, int> x_map;
map<char, int> y_map;
for(char x : X)
x_map[x]++;
for(char y : Y)
y_map[y]++;
for(int i = 9; i >= 0; i--)
{
int n = min(x_map['0' + i], y_map['0' + i]);
for(int j = 0; j < n; j++)
answer += i + '0';
}
if (answer == "")
answer = "-1";
else if (answer[0] == '0')
answer = "0";
return answer;
}
요즘 C++ 코드로 프로그래머스를 풀고 자바로 코드를 바꿔보면서 자바를 좀 더 익히고 있는데
위의 숫자 짝꿍을 자바로 푸는 코드를 보고 있는데 String 타입이 있는데도 StringBuilder를
사용하는 것을 보고 왜 사용하는 지 궁금해져 조금 찾아보았다.
참고자료