https://school.programmers.co.kr/learn/courses/30/lessons/12909

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이

 

괄호가 완성되려면 '(' 와 ')' 개수가 같아야 하는 점을 이용

 

** ())( 와 같은 케이스처럼 개수가 같지만, 불완전한 괄호일 경우 탐색을 위해 

'(' , ')' 의 개수가 같은 시점, 즉 모든 괄호가 정상적으로 닫힌 시점에서 ')' 로 시작하는 괄호가 있다면  해당 괄호는 비정상적인 괄호

 

 

 

 

 

 

bool solution(string s)
{
	bool answer = true;
	int lcnt = 0;
	int rcnt = 0;
	for (auto i : s) {
        if (i == ')' && lcnt == rcnt)
			return false;

		if (i == '(')
			lcnt++;
		else
			rcnt++;
	}
	
    return (lcnt - rcnt) == 0;
}

 

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/12906

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이

 

그냥 for문으로 순회하며 현재 값이 앞의 값이랑 같다면 continue

다르다면 answer에 push 해서 answer 리턴

 

 

** unique 함수를 사용해 arr.begin() 부터 arr.end() 까지 중복되는 값을 탐색하여

erase하는 방법을 사용하면 한줄로 풀이 가능

 

 

vector<int> solution(vector<int> arr)
{
	vector<int> answer;
	int cur = -1;


	for (auto i : arr) {
		if (cur == i)
			continue;
		else
			answer.push_back(i);
		cur = i;
	}
	return answer;
}

 

 

Unique 함수 사용

vector<int> solution(vector<int> arr) 
{
    arr.erase(unique(arr.begin(), arr.end()),arr.end());
    return arr;
}

https://school.programmers.co.kr/learn/courses/30/lessons/42584

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이

 

단순 반복

중첩 for문 사용

 

for문을 통해 prices의 값을 자신 이후의 값들과 비교

만약 자신보다 적은 값이 있다면 그 값과 자신 사이의 거리를 answer에 push

 

answer 리턴

 

 

 

vector<int> solution(vector<int> prices) {
	vector<int> answer;
	for (int i = 0; i < prices.size();i++) {
		
		int cur = prices[i];
		int cnt = 0;
        
		for (int j = i; j < prices.size();j++) {
        
			cnt++;
			if (prices[j] < cur) 
				break;
		}
        
		answer.push_back(cnt-1);
		
	}
	return answer;
}

https://school.programmers.co.kr/learn/courses/30/lessons/42583#

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이

 

(차량의 무게, 차량이 다리를 다 건너는 시간)

을 쌍으로 가지는 큐 활용

 

truck_weights 벡터의 맨 처음 값과 그 트럭이 다리를 통과하는데 걸리는 시간(다리길이 +1) 를 먼저 큐에 삽입

>> 그래야 while 문 돌리기 가능하기 때문

 

이후 while문 반복을 통해

큐의 맨 앞과의 값을 비교하여 pop,

현재 도로 위의 차량들 무게와 다음 순서의 차량의 무게를 비교하여 push 수행

 

모든 차량이 지나가면 (q.empty() = true 라면) 반복문 탈출

time 값 리턴

 

int solution(int bridge_length, int weight, vector<int> truck_weights) {

	int sum = 0;	// 현재 다리 위의 무게
	queue<pair<int, int>> q;	// 현재 다리 위 차량 무게, 차량이 다리를 다 건너는 시간
	int idx = 0;	// 인덱스	
	int time = 1;	// 시간
	
	
	q.push(make_pair(truck_weights[idx], bridge_length+1));
	sum += truck_weights[idx++];

	while(!q.empty()){
    
		// 시간 증가
		time++;
		
		// (time == 맨 앞 차량이 통과하는데 걸리는 시간) 이라면
		// q.pop() 으로 도로에서 차량 빼고, sum 에서 해당 차량 무게 제외 
		if (time == q.front().second) {
			sum -= q.front().first;
			q.pop();	
		}

		// 다음 차량과 현재 도로위에 있는 차량의 무게를 더한 값 < 도로가 견딜수 있는 무게
		// 다음 차량이 도로에 들어갈 수 있다
		if (idx< truck_weights.size() && (sum+truck_weights[idx])<= weight) {
        
			// 큐에 차량의 무게, 다 지나가는데 걸리는 소요 시간을 pair로 삽입
			q.push(make_pair(truck_weights[idx], bridge_length+time));
            // 현재 도로위의 무게 증가, idx값 증가
			sum += truck_weights[idx++];
		}
	}
	return time;
}

https://school.programmers.co.kr/learn/courses/30/lessons/42587

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이

 

중요도, 인덱스 정보를 한 쌍으로 가지는 큐

큐의 front 값이 최우선 순위인지 확인하기 위해 사용하는 우선순위큐

두가지를 사용해 풀이

 

우선 for문으로 큐(q)와 우선순위큐(pq)에 정보 push

 

우선순위큐의 top 에는 가장 값이 큰 데이터가 옴

따라서 현 시점에서 가장 높은 중요도를 찾을 수 있음

 

q의 front 값, 즉

q.front().first (중요도)

q.front().second (인덱스)

정보를 pq.front() 와 비교하여 q.front가 현 시점에서 가장 중요한 문서가 아니라면 해당 데이터를 다시 큐 뒤로 push

가장 중요한 문서라면 우선순위큐 pop 실행하여 다음 중요도 탐색 후 카운터 (cnt) 증가

 

여기서 만약 q.front().second (인덱스) 값이 내가 찾고자 했던 값, location의 값과 동일하다면 break로 while 반복문 탈출

 

 

 

    int solution(vector<int> priorities, int location) {
        int answer = 0;
        int cnt = 0;
        int size = priorities.size();
        queue<pair<int, int>> q;
        priority_queue<int> pq;

        
        for (int i = 0; i < priorities.size(); i++) {
            q.push(make_pair(priorities[i], i));
            pq.push(priorities[i]);
        }
        
        while(!q.empty()) {
            int val = q.front().first;
            int idx = q.front().second;
            q.pop();
            if (pq.top()==val) {
                pq.pop();
                cnt++;
                if (idx == location)
                    break;
            }
            else {
                q.push(make_pair(val, idx));
            }
        }
        answer = cnt;
        return answer;
    }

https://school.programmers.co.kr/learn/courses/30/lessons/42586

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이

큐를 사용해도 되지만, 단순 for문으로 해결하기로 함

for문을 통해 progresses, speeds를 인덱스별로 순회하며 완료되는데 걸리는 시간 (duration)을 계산

 

처음엔 단순히 이전 duration과 현재 duration을 비교하여 현재 값이 작으면 앞의 값과 동시에 들어가도록 구현

그러나 duration이 5, 3, 4 일 경우 위와같이 구현하면 5, 3은 동시에 들어가고 4는 따로 들어가기 때문에 

answer = {2, 1} 이 나옴

하지만 실제로는 5일동안 모든 작업이 완료되기 때문에 answer = {3} 이 정답

 

** 해결

걸리는 최대 일수는 100일이기 때문에 max값 100으로 설정

max값과 duration을 비교하여 duration이 크다면, answer vector에 1 삽입

작다면 answer.back(), 즉 answer에 가장 최근에 들어간 값을 1 증가

 

이렇게 현재 duration 값보다 큰 값이 앞의 어느 부분에라도 있었다면 해당 값과 함께 삽입되도록 구현해야 정답

 

 

    vector<int> solution(vector<int> progresses, vector<int> speeds) {
        vector<int> answer;

        int max = 0;
        for (int i = 0; i < progresses.size(); i++) {
            int duration = (100 - progresses[i]) / speeds[i];
            if ((100 - progresses[i]) % speeds[i] > 0)
                duration++;
            if (max < duration) {
                max = duration;
                answer.push_back(1);
            }
            else
                answer.back()++;
        }
        return answer;
    }

풀이

 

stringstream 사용하여 공백 기준으로 문자열 분리

분리한 문자열을 stoi로 int형변환하여 vector v에 push_back

sort 로 v 벡터 오름차순 정렬

 

최소값 : v의 처음 값 = v[0] 

최대값 : v의 마지막 값 = v[v.size()-1]

 

answer에 삽입

 

	string solution(string s) {
		string answer = "";	
		vector<int> v;
		string temp;
		stringstream sstream;

		sstream.str(s);


		while (sstream >> temp) {
			v.push_back(stoi(temp));
		}
		
		sort(v.begin(), v.end());

		answer += to_string(v[0]);
		answer += " ";
		answer += to_string(v[v.size() - 1]);

		return answer;
	}

 

풀이

 

두 수의 최대공약수를 구하는 함수 gcd

최대공약수를 사용하여 최소공배수를 구하는 함수 lcm

 

{a, b, c, d, e......} 와 같은 n개의 최소공배수는 어떻게?

 

a, b의 최소공배수 x를 구하고

x와 c의 최소공배수 y를 구하고

y와 d의 최소공배수 z를 구하고..

 

반복

 

 

int gcd(int x, int y) {
	int n;
	while (y!=0) {
		n = x % y;
		x = y;
		y = n;
	}
	return x;
}

int lcm(int x, int y) {
	return x * y / gcd(x, y);
}

int solution(vector<int> arr) {
	int answer = lcm(arr[0], arr[1]);
	for (int i = 2; i < arr.size(); i++) 
		answer = lcm(arr[i], answer);
	return answer;
}

 

https://programmers.co.kr/learn/courses/30/lessons/92341

 

코딩테스트 연습 - 주차 요금 계산

[180, 5000, 10, 600] ["05:34 5961 IN", "06:00 0000 IN", "06:34 0000 OUT", "07:59 5961 OUT", "07:59 0148 IN", "18:59 0000 IN", "19:09 0148 OUT", "22:59 5961 IN", "23:00 5961 OUT"] [14600, 34400, 5000]

programmers.co.kr

 

 

1. 차 번호를 key, 해당 차량이 드나든 시간 vector를 value로 갖는 car변수에 차 번호와 시간정보 저장

2. 차 번호와 해당 차량의 요금 정보를 pair로 갖는 carNum에 (차 번호, 0) 의 값을 pair로 저장

3. car에 담긴 시간 정보를 바탕으로 총 이용시간 산출

4. 산출된 시간정보를 바탕으로 feeCal함수를 사용하여 요금 정보 산출

5. 산출된 요금 정보를 carNum의 second value로 입력

6. 해당 값을 answer vector에 push_back

 

// 주차장에 머무른 총 시간을 계산하는 함수
int timeCal(string t, string tn) {
	int result=0;
	int h = stoi(t.substr(0, 2));
	int m = stoi(t.substr(3, 2));
	int hn = stoi(tn.substr(0, 2));
	int mn = stoi(tn.substr(3, 2));

	result = ((hn - h)*60) + (mn - m);
	return result;
}

// 시간 정보를 받아 요금을 계산하는 함수
int feeCal(int baseTime, int baseFee, int unitTime, int unitFee, int time) {
	int result=0;
	if (time > baseTime) {
		if((time - baseTime) % unitTime != 0)
			return (((time - baseTime) / unitTime)+1) * unitFee + baseFee;
		else
			return ((time - baseTime) / unitTime) * unitFee + baseFee;
	}
	else
		return baseFee;
}

vector<int> solution(vector<int> fees, vector<string> records) {
	vector<int> answer;
	map<string, vector<string>> car;
	set<pair<string, int>> carNum;	

	for (auto i : records) {
		car[i.substr(6, 4)].push_back(i.substr(0, 5));
		carNum.insert(make_pair(i.substr(6, 4), 0));
	}
	
	for (auto i : carNum) {
		string s = i.first;
		int x = car[s].size();
		if (x % 2 != 0)
			car[s].push_back("23:59");
	}

	for (auto i : carNum) {
		string s = i.first;
		int t = 0;
		for (int j = 0; j < car[s].size()-1; j+=2) {
			int time = timeCal(car[s][j], car[s][j + 1]);
			t += time;
		}
		answer.push_back(feeCal(fees[0], fees[1], fees[2], fees[3], t));
	}
	return answer;
}

https://programmers.co.kr/learn/courses/30/lessons/92335

 

코딩테스트 연습 - k진수에서 소수 개수 구하기

문제 설명 양의 정수 n이 주어집니다. 이 숫자를 k진수로 바꿨을 때, 변환된 수 안에 아래 조건에 맞는 소수(Prime number)가 몇 개인지 알아보려 합니다. 0P0처럼 소수 양쪽에 0이 있는 경우 P0처럼 소

programmers.co.kr

 

1. n을 k진수로 변환 (string) : result(변환 후의 값)

2. reverse() 로 result를 뒤집은 후 끝에 '0' 삽입

3. for문으로 하나씩 탐색하면서 연결된 숫자들이 소수인지 판별

4. 소수라면 cnt++

5. 지금까지 탐색한 수를 erase로 지우고 반복

 

bool isPrime(long long num) {
    if(num < 2) return false;
    for(int i=2; i<=sqrt(num); ++i)
        if(num % i == 0) return false;
    return true;
}

int solution(int n, int k) {

	int t=1, num =1;
	int x=0, cnt = 0;
	long long val = 0;
	string result = "";

	while (t <= n)
		t *= k;
	do {
		t /= k;
		num = n / t;
		result += to_string(num);
		n -= num * t;
	} while (t>= k);


	reverse(result.begin(), result.end());
	result += '0';

	for (long long i = 0; i < result.size();++i) {
		if (result[i] == '0') {
			if (isPrime(val))
				cnt++;
			result.erase(0, i + 1);
			i = -1;
			val = 0;
		}
		else
			val = val + pow(10, i) * (result[i] - '0');
	}
	return cnt;
}

+ Recent posts