728x90

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

 

코딩테스트 연습 - 큰 수 만들기

 

programmers.co.kr

일단 이렇게 풀었는데 너무 복잡하게 푼 것 같아서 다시 풀어봐야겠다.

#include <string>
#include <vector>

using namespace std;

string solution(string number, int k) {
	int n = 0;
	int targetLength = number.length() - k;
	int length = number.length();
	string targetStr = "";
	bool flag = false;
	int maxNum = -1;
	int maxIndex;
	while (true) {
		for (int i = 0; i <= length - targetLength; i++) {
			if (stoi(number.substr(i, 1)) > maxNum) {
				maxNum = stoi(number.substr(i, 1));
				maxIndex = i;
				if (maxNum == 9)
					break;
			}
		}
		targetStr += number[maxIndex];
		number.erase(0, maxIndex + 1);
		length -= maxIndex;
		if (targetStr.length() == targetLength)
			break;
		maxNum = 0;
		maxIndex = 0;
	}
	return targetStr;
}
728x90

'알고리즘 문제' 카테고리의 다른 글

[프로그래머스] 행렬의 곱셈  (0) 2020.08.01
[프로그래머스] 기능개발  (0) 2020.07.31
[프로그래머스] 땅따먹기  (0) 2020.07.30
[프로그래머스] 폰켓몬  (0) 2020.07.28
[백준] 1780번 종이의 개수  (0) 2020.04.11
728x90

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

 

코딩테스트 연습 - 땅따먹기

땅따먹기 게임을 하려고 합니다. 땅따먹기 게임의 땅(land)은 총 N행 4열로 이루어져 있고, 모든 칸에는 점수가 쓰여 있습니다. 1행부터 땅을 밟으며 한 행씩 내려올 때, 각 행의 4칸 중 한 칸만 밟��

programmers.co.kr

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int solution(vector<vector<int> > land) {
	for (int i = 1; i < land.size(); i++) {
		land[i][0] = land[i][0] + max(max(land[i - 1][1], land[i - 1][2]), land[i - 1][3]);
		land[i][1] = land[i][1] + max(max(land[i - 1][0], land[i - 1][2]), land[i - 1][3]);
		land[i][2] = land[i][2] + max(max(land[i - 1][0], land[i - 1][1]), land[i - 1][3]);
		land[i][3] = land[i][3] + max(max(land[i - 1][0], land[i - 1][1]), land[i - 1][2]);
	}
	return max(max(max(land[land.size() - 1][0], land[land.size() - 1][1]), land[land.size() - 1][2]), land[land.size() - 1][3]);
}

동적계획법으로 풀었다. 메모리는 따로 사용하지 않았고 주어진 이차원 벡터에 그대로 덮어썼다.

(i행 0열)에 왔다는 것은 i - 1행에서는 0열이 아닌 1열 또는 2열 또는 3열을 거쳤다는 것이기 때문에 (i행 0열)의 값에 (i - 1행 1열), (i - 1행 2열), (i - 1행 3열) 중 최댓값을 더해주었다. 그러면 land[i][0]에는 i행 0열까지 오는 경로 중 가장 최댓값을 가질 수 있는 경로로 왔을 때의 점수가 저장되어있는 것이다. 그런식으로 누적해서 더해서 land[마지막 행]에는 각 열의 최댓값 4개가 저장되어 있다. (4열이기 때문) 그 4개의 숫자 중에서 최댓값이 정답이 된다.

728x90

'알고리즘 문제' 카테고리의 다른 글

[프로그래머스] 기능개발  (0) 2020.07.31
[프로그래머스] 큰 수 만들기  (0) 2020.07.30
[프로그래머스] 폰켓몬  (0) 2020.07.28
[백준] 1780번 종이의 개수  (0) 2020.04.11
[백준] N M 찍기  (0) 2020.04.11
728x90

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

 

코딩테스트 연습 - 폰켓몬

당신은 폰켓몬을 잡기 위한 오랜 여행 끝에, 홍 박사님의 연구실에 도착했습니다. 홍 박사님은 당신에게 자신의 연구실에 있는 총 N 마리의 폰켓몬 중에서 N/2마리를 가져가도 좋다고 했습니다. �

programmers.co.kr

#include <vector>
#include <set>

using namespace std;

int solution(vector<int> nums) {
	set<int> s;
	for (int i = 0; i < nums.size(); i++) {
		s.insert(nums[i]);
	}
	if (s.size() <= nums.size() / 2) {
		return s.size();
	}
	else {
		return nums.size() / 2;
	}
}

일단 이렇게 set으로 간단하게 풀었다. vector를 set으로 복사하는 함수를 몰라서 일단 저렇게 for문을 돌려서 풀고나서 vector를 set으로 복사하는 방법을 찾아봤다.

http://www.cplusplus.com/reference/set/set/set/

 

set::set - C++ Reference

range (2)template set (InputIterator first, InputIterator last, const key_compare& comp = key_compare(), const allocator_type& = allocator_type()); template set (InputIterator first, InputIterator last, const allocator_type& = allocator_type());

www.cplusplus.com

여기에 있는 생성자들 중 range에 해당하는 방법으로 vector의 원소들을 원소로 가지는 set으로 만들 수 있다.

만약 v라는 int 타입의 vector가 있고 그것의 원소들을 원소로 가지는 set s을 만들고 싶다면

set<int> s(v.begin(), v.end());

이렇게 하면 된다.

 

따라서 이 방법을 이용해서 폰켓몬을 풀면 코드가 다음과 같이 더 짧아진다.

#include <vector>
#include <set>

using namespace std;

int solution(vector<int> nums) {
	set<int> s(nums.begin(), nums.end());
	if (s.size() <= nums.size() / 2) {
		return s.size();
	}
	else {
		return nums.size() / 2;
	}
}
728x90

'알고리즘 문제' 카테고리의 다른 글

[프로그래머스] 큰 수 만들기  (0) 2020.07.30
[프로그래머스] 땅따먹기  (0) 2020.07.30
[백준] 1780번 종이의 개수  (0) 2020.04.11
[백준] N M 찍기  (0) 2020.04.11
[백준] 10815번 숫자 카드  (0) 2020.04.11
728x90

gs25 편의점에 갔다가 냉동식품 있는(하겐다즈, 매그넘 아이스크림 있는) 냉장고에 우연히 불닭맛 야채곱창이 있는 것을 봤다. 불닭맛 소대창이 나온다는건 들었었는데 불닭맛 야채곱창은 처음 봐서 사봤다. 가격은 8900원.

불닭맛 야채곱창

냉동보관 해야하는 냉동식품이다.

불닭맛 야채곱창


비닐을 뜯어보면 이렇게 생겼다. 원래는 저 비닐도 뜯지 않고 그대로 전자레인지에 데워야 하는데 나는 그릇에 옮겨서 데웠다. 따로 해동 과정 필요없이 700W 기준 2분 30초 데우면 된다.

데우고 난 모습. 8900원인데 양이 너무 적어서 약간 놀랐다.



이런게 한 14개 들어있다. 큰건 12개 정도?

맛은 있다. 냄새도 안 나고 맛있는데 진짜 심각하게 맵다. 매운거 꽤 잘 먹고 불닭볶음면은 그냥 아무렇지도 않게 잘 먹을 수 있는데 이건 진짜 매웠다. 맵지만 맛있기는 한데 좀 질기다. 나에게는 꽤 질겼다.

728x90
728x90

파이참에서 모듈을 설치하고 그 모듈을 import 해서 사용할 때

ModuleNotFoundError

이렇게 ModuleNotFoundError가 나는 경우가 있다.

 

분명히 이렇게 pip로 성공적으로 설치했는데 말이다.

이럴 때 간단하게 파이참에서 해결할 수 있다.

 

1. Settings에 들어간다.

Settings 클릭

 

2. + 를 누른다.

 

3. 원하는 모듈의 이름을 검색한다.

 

4. 원하는 모듈을 선택하고 Install Package를 누른다.

 

5. 설치중

 

6. 설치완료

 

 

아까는 빨간줄로 에러가 났던 것이 이제 에러 안 남

아까는 빨간 줄이 그어지면서 에러가 났던 모듈 import 부분이 에러가 안 나고 프로그램이 멀쩡히 잘 돌아간다.

728x90

'Python' 카테고리의 다른 글

[Python] 백준 시간초과 해결, 입출력 속도 개선  (3) 2020.02.01
728x90

벡터 v에서 i번째 원소를 삭제하고 싶다면

erase 함수를 사용하면 된다.

erase 함수의 인자는 iterator 즉, 지우고 싶은 원소의 주소이다.

http://www.cplusplus.com/reference/vector/vector/erase/

 

vector::erase - C++ Reference

123456789101112131415161718192021222324 // erasing from vector #include #include int main () { std::vector myvector; // set some values (from 1 to 10) for (int i=1; i<=10; i++) myvector.push_back(i); // erase the 6th element myvector.erase (myvector.begin(

www.cplusplus.com

벡터 v의 시작 주소는 v.begin()이다. i번째 원소의 주소는 v.begin() + i 라고 하면 된다.

따라서 벡터 v의 i번째 인덱스에 있는 원소를 삭제하고 싶을 때에는

v.erase(v.begin() + i);

이렇게 쓰면 된다.

 

v[5]를 지우고 싶다면

v.erase(v.begin() + 5);

이렇게 하면 된다.

코드로 보자면 아래 코드를 실행하면

#include <iostream>
#include <vector>
using namespace std;

int main() {
	vector<int> v(10);
	for (int i = 0; i < 10; i++) {
		v[i] = i;
	}
	cout << "지우기 전:          ";
	for (int i = 0; i < v.size(); i++) {
		cout << v[i] << " ";
	}
	cout << endl;
	v.erase(v.begin() + 5);
	cout << "5번 인덱스 지운 후: ";
	for (int i = 0; i < v.size(); i++) {
		cout << v[i] << " ";
	}
	cout << endl;
	return 0;
}

다음과 같이 5번 인덱스에 저장되어 있던 5가 삭제된다.

벡터 클래스의 더 많은 함수들을 알고 싶다면 아래 링크에 있는 포스팅을 참고하면 된다.

https://breakcoding.tistory.com/139

 

[C++] 라이브러리, 벡터 클래스, 동적 할당

만약에 입력으로 n을 입력받아 크기가 n인 배열을 만들고 싶다면 어떻게 해야 할까? int n; cin >> n; int arr[n]; 이렇게 하면 될까? 이렇게 선언하면 컴파일 에러가 나는 것을 볼 수 있다. 배열의 크기를 나타..

breakcoding.tistory.com

 

728x90
728x90

https://www.acmicpc.net/problem/1780

 

1780번: 종이의 개수

N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1의 세 값 중 하나가 저장되어 있다. 우리는 이 행렬을 적절한 크기로 자르려고 하는데, 이때 다음의 규칙에 따라 자르려고 한다. 만약 종이가 모두 같은 수로 되어 있다면 이 종이를 그대로 사용한다. (1)이 아닌 경우에는 종이를 같은 크기의 9개의 종이로 자르고, 각각의 잘린 종이에 대해서 (1)의 과정을 반복한다. 이와 같이 종이를 잘랐을 때, -1로만 채워진 종이의 개수, 0으

www.acmicpc.net

분할정복으로 9등분을 해가면서 풀면 된다.

그 나눠진 부분의 전체가 같은 수라면 재귀호출을 하지 않고 나눠진 부분에 있는 수들이 모두 같지 않으면 재귀호출을 해서 또 9등분을 하는 식으로 풀었따.

#include <iostream>
#include <vector>
using namespace std;

vector<vector<int>> v;
int minusOne = 0;
int zero = 0;
int one = 0;

void divide(int rowStart, int rowEnd, int colStart, int colEnd, int width) {
	int first = v[rowStart][colStart];
	bool flag = true;
	if (width != 1) {
		for (int i = rowStart; i <= rowEnd; i++) {
			for (int j = colStart; j <= colEnd; j++) {
				if (first != v[i][j]) {
					flag = false;
					break;
				}
			}
			if (!flag)
				break;
		}
	}
	if (flag) {
		if (first == -1) {
			minusOne++;
		}
		else if (first == 0) {
			zero++;
		}
		else if (first == 1) {
			one++;
		}
	}
	else {
		divide(rowStart, rowStart + width / 3 - 1, colStart, colStart + width / 3 - 1, width / 3);
		divide(rowStart + width / 3, rowStart + width / 3 + width / 3 - 1, colStart, colStart + width / 3 - 1, width / 3);
		divide(rowStart + width / 3 + width / 3, rowEnd, colStart, colStart+ width / 3 - 1, width / 3);

		divide(rowStart, rowStart + width / 3 - 1, colStart + width / 3, colStart + width / 3 + width / 3 - 1, width / 3);
		divide(rowStart + width / 3, rowStart + width / 3 + width / 3 - 1, colStart + width / 3, colStart + width / 3 + width / 3 - 1, width / 3);
		divide(rowStart + width / 3 + width / 3, rowEnd, colStart + width / 3, colStart + width / 3 + width / 3 - 1, width / 3);

		divide(rowStart, rowStart + width / 3 - 1, colStart + width / 3 + width / 3, colEnd, width / 3);
		divide(rowStart + width / 3, rowStart + width / 3 + width / 3 - 1, colStart + width / 3 + width / 3, colEnd, width / 3);
		divide(rowStart + width / 3 + width / 3, rowEnd, colStart + width / 3 + width / 3, colEnd, width / 3);
	}
}

int main() {
	int n;
	cin >> n;
	v = vector<vector<int>>(n, vector<int>(n));
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> v[i][j];
		}
	}
	divide(0, n - 1, 0, n - 1, n);
	cout << minusOne << endl;
	cout << zero << endl;
	cout << one << endl;
	return 0;
}
728x90

'알고리즘 문제' 카테고리의 다른 글

[프로그래머스] 땅따먹기  (0) 2020.07.30
[프로그래머스] 폰켓몬  (0) 2020.07.28
[백준] N M 찍기  (0) 2020.04.11
[백준] 10815번 숫자 카드  (0) 2020.04.11
[백준] 1158번 요세푸스 문제  (0) 2020.04.11
728x90

https://www.acmicpc.net/problem/18883

 

18883번: N M 찍기

총 N개의 줄을 출력해야 한다. 각 줄에는 M개의 정수를 공백 한 칸으로 구분해 출력해야 한다. 1번 줄에는 1부터 M까지, 2번 줄에는 M+1부터 2×M까지, ..., N번 줄에는 (N-1)×M+1부터 N×M까지 출력해야 한다. 모든 줄의 시작과 끝에 공백이 있으면 안되고, 모든 줄은 줄바꿈(\n)으로 끝나야 한다.

www.acmicpc.net

num이라는 변수를 후위 연산자로 증가시키며 출력했다.

주의할 것은 줄 끝에 공백이 있으면 안 된다. 따라서

if(j == m - 1)

이렇게 조건문으로 행의 마지막 숫자 뒤에는 바로 '\n'으로 줄바꿈을 하도록 했다.

#include <iostream>
using namespace std;

int main() {
	int n, m;
	cin >> n >> m;
	int num = 1;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (j == m - 1)
				cout << num++ << '\n';
			else
				cout << num++ << " ";
		}
	}
	return 0;
}
728x90

'알고리즘 문제' 카테고리의 다른 글

[프로그래머스] 폰켓몬  (0) 2020.07.28
[백준] 1780번 종이의 개수  (0) 2020.04.11
[백준] 10815번 숫자 카드  (0) 2020.04.11
[백준] 1158번 요세푸스 문제  (0) 2020.04.11
[백준] 4949번 균형잡힌 세상  (0) 2020.04.08
728x90

https://www.acmicpc.net/problem/10815

 

10815번: 숫자 카드

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다. 두 숫자 카드에 같은 수가 적혀있는 경우는 없다. 셋째 줄에는 M(1 ≤ M ≤ 500,000)이 주어진다. 넷째 줄에는 상근이가 가지고 있는 숫자 카드인지 아닌지를 구해야 할 M개의 정수가 주어지며, 이

www.acmicpc.net

정렬을 해놓은 후 이진탐색(이분검색)을 이용하면 된다. 

그리고 많은 수를 입력받고 많은 수를 출력해야 하기 때문에 입출력 시간을 줄이는 다음 코드를 써줘야 한다.

ios_base::sync_with_stdio(false);
cin.tie(NULL);

정렬하는 것은 <algorithm> 헤더의 sort() 함수를 이용하고 이진탐색은 binary_search() 함수를 이용하면 된다.

이 함수들의 사용법을 자세히 알고 싶다면 아래 링크에서 볼 수 있다.

 

https://breakcoding.tistory.com/117

 

[C++] vector (벡터) 정렬, 배열 정렬하기

정렬을 하려면 라이브러리의 sort() 함수를 쓰면 된다. 따라서 헤더파일을 포함해줘야 한다. sort() 함수의 첫번째 두번째 매개변수는 iterator, 즉 포인터이다. sort - C++ Reference cu..

breakcoding.tistory.com

https://breakcoding.tistory.com/188

 

[C++] 이진탐색 binary_search, upper_bound, lower_bound 함수 사용법

C++로 코딩을 하다가 이진탐색을 할 필요가 있다면 직접 구현할 필요없이 헤더에 정의되어 있는 binary_search() 함수를 사용하면 된다. C++에서 이진탐색을 어떻게 하는지 알아보자. 일단 이진탐색이..

breakcoding.tistory.com

코드는 다음과 같다.

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	int n;
	cin >> n;
	vector<int> v(n);
	for (int i = 0; i < v.size(); i++) {
		cin >> v[i];
	}
	sort(v.begin(), v.end());
	int m;
	cin >> m;
	vector<bool> result(m);
	for (int i = 0; i < m; i++) {
		int temp;
		cin >> temp;
		result[i] = binary_search(v.begin(), v.end(), temp);
	}
	for (int i = 0; i < m; i++) {
		cout << result[i] << " ";
	}
	return 0;
}
728x90

'알고리즘 문제' 카테고리의 다른 글

[백준] 1780번 종이의 개수  (0) 2020.04.11
[백준] N M 찍기  (0) 2020.04.11
[백준] 1158번 요세푸스 문제  (0) 2020.04.11
[백준] 4949번 균형잡힌 세상  (0) 2020.04.08
[백준] 2589번 보물섬  (0) 2020.04.07
728x90

https://www.acmicpc.net/problem/1158

 

1158번: 요세푸스 문제

첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)

www.acmicpc.net

벡터에 일단 1~N을 저장해놓고 직접 지워가며 시뮬레이션하며 풀었다. 이 과정을 벡터가 빌 때까지 반복해주었다.

원형 연결리스트처럼 동작하게 하기 위해 modulo 연산을 사용해주었다.

#include <iostream>
#include <vector>
using namespace std;

int main() {
	int n, k;
	cin >> n >> k;
	vector<int> v(n);
	for (int i = 0; i < n; i++) {
		v[i] = i + 1;
	}
	vector<int> result;
	int start = 0;
	while (!v.empty()) {
		int index = (start + k - 1) % v.size();
		result.push_back(v[index]);
		v.erase(v.begin() + index);
		if(!v.empty())
			start = index % v.size();
	}
	cout << "<";
	for (int i = 0; i < result.size(); i++) {
		cout << result[i];
		if (i == result.size() - 1) {
			cout << ">";
		}
		else {
			cout << ", ";
		}
	}
	return 0;
}

start 변수는 K번째를 세기 시작하는 곳이다. start부터 K번째 위치를 지우면 된다.

그런데 지우고 나서가 문제이다. start로부터 K번째 위치가 index라고 하면 지우고 나서 이 위치가 start가 되면 안 된다.

예를 들어 벡터의 크기가 8이었다고 하자. 그리고 start가 5, K가 3이어서 지워야 할 위치인 index가 7이었다고 하자. 그래서 인덱스가 7인 원소를 삭제했다고 하자. 그러면 벡터의 크기는 8에서 7로 줄어드는데 그러면 인덱스 7은 벡터의 범위를 벗어났으므로 index out of range 에러가 날 것이다. 따라서 현재 vector 크기로 한 번 더 modulo 연산을 해줘야 한다.

 

728x90

'알고리즘 문제' 카테고리의 다른 글

[백준] N M 찍기  (0) 2020.04.11
[백준] 10815번 숫자 카드  (0) 2020.04.11
[백준] 4949번 균형잡힌 세상  (0) 2020.04.08
[백준] 2589번 보물섬  (0) 2020.04.07
[백준] 2630번 색종이 만들기  (0) 2020.03.30

+ Recent posts