반응형
programmers.co.kr/learn/courses/30/lessons/43165
코딩테스트 연습 - 타겟 넘버
n개의 음이 아닌 정수가 있습니다. 이 수를 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다. -1+1+1+1+1 = 3 +1-1+1+1+
programmers.co.kr
bfs로 구현한 문제였습니다.
풀이방법
1. level이 증가할 수록 +, - 두 가지 경우씩 늘어나기 때문에 q의 size는 두 배씩 증가하게 됩니다. 현재 queue의 size만큼 push를 한다는 것의 의미는 같은 level의 원소들을 의미합니다. 따라서 numbers.size만큼 loop를 돌며 현재 queue size마다 더한값, 뺀 값을 push해주면 됩니다.
2. push를 마친 후에 q.empty()까지 target과 같은 queue의 원소를 세 준 후 반환하면 됩니다.
Code
#include <bits/stdc++.h>
using namespace std;
void input(queue <int> &q, int num){
int x = q.front();
q.pop();
for(int i =0; i < 2; i++)
!(i % 2) ? q.push(x + num) : q.push(x - num);
}
int bfs(vector <int> &numbers,int target){
queue <int> q;
q.push(numbers[0]);
q.push(-numbers[0]);
int cnt = 0;
for(int i = 1; i < numbers.size(); i++){
int sz = q.size();
while(sz--) input(q,numbers[i]);
}
while(!q.empty()){
int x = q.front();
if (x == target) cnt++;
q.pop();
}
return cnt;
}
int solution(vector<int> numbers, int target) {
return bfs(numbers,target);
}