728x90

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

 

1292번: 쉽게 푸는 문제

첫째 줄에 구간의 시작과 끝을 나타내는 정수 A, B(1≤A≤B≤1,000)가 주어진다. 즉, 수열에서 A번째 숫자부터 B번째 숫자까지 합을 구하면 된다.

www.acmicpc.net

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

int main() {
	int aa, bb;
	cin >> aa >> bb;
	int arr[1001];
	int index = 1;
	for (int i = 1; index <= 1000; i++) {
		for (int j = 0; j < i; j++) {
			if (index > 1000) break;
			arr[index++] = i;
		}
	}
	int total = 0;
	for (int i = aa; i <= bb; i++) {
		total += arr[i];
	}
	cout << total;
	return 0;
}

처음에는 아래와 같이 제출했는데

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

int main() {
	int aa, bb;
	cin >> aa >> bb;
	int arr[1001];
	int index = 1;
	for (int i = 1; index <= 1000; i++) {
		for (int j = 0; j < i; j++) {
			arr[index++] = i;
		}
	}
	int total = 0;
	for (int i = aa; i <= bb; i++) {
		total += arr[i];
	}
	cout << total;
	return 0;
}

배열의 인덱스를 초과해도 오류가 나지 않아서 바꾸지도 않은 a와 b가 45로 바뀌는 신기한 경험을 했다. 그래서 변수 이름을 aa, bb로 바꾸기까지 했다. 그런데 index가 1000을 넘어서도 안쪽 for문이 계속 돌면서 배열이 할당된 메모리를 넘어서도 계속 쓰기 때문에 배열 다음에 할당된 a와 b를 건드리는 것이었다.

 

728x90

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

[백준] 1388번 바닥 장식  (0) 2020.02.24
[백준] 1075번 나누기  (0) 2020.02.24
[백준] 수 정렬하기 3  (0) 2020.02.24
[백준] 1927 최소 힙  (0) 2020.02.24
[백준] 10569번 다면체  (0) 2020.02.22
728x90

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

 

10989번: 수 정렬하기 3

첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.

www.acmicpc.net

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

int main() {
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);
	vector<int> arr(10001);
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		int temp;
		cin >> temp;
		arr[temp]++;
	}
	for (int i = 1; i < 10001; i++) {
		for (int j = 0; j < arr[i]; j++) {
			cout << i << '\n';
		}
	}
	return 0;
}
728x90

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

[백준] 1075번 나누기  (0) 2020.02.24
[백준] 1292번 쉽게 푸는 문제  (0) 2020.02.24
[백준] 1927 최소 힙  (0) 2020.02.24
[백준] 10569번 다면체  (0) 2020.02.22
[백준] 2864 5와 6의 차이  (0) 2020.02.22
728x90

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

 

1927번: 최소 힙

첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 자연수라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0이라면 배열에서 가장 작은 값을 출력하고 그 값을 배열에서 제거하는 경우이다. 입력되는 자연수는 2^31보다 작다.

www.acmicpc.net

C++의 priority_queue를 사용하면 된다.

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

int main() {
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);
	int n;
	cin >> n;
	priority_queue<int, vector<int>, greater<int>> q;
	for (int i = 0; i < n; i++) {
		int num;
		cin >> num;
		if (num == 0) {
			if (q.empty()) cout << 0 << '\n';
			else {
				cout << q.top() << '\n';
				q.pop();
			}
		}
		else {
			q.push(num);
		}
	}
	return 0;
}
728x90

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

[백준] 1292번 쉽게 푸는 문제  (0) 2020.02.24
[백준] 수 정렬하기 3  (0) 2020.02.24
[백준] 10569번 다면체  (0) 2020.02.22
[백준] 2864 5와 6의 차이  (0) 2020.02.22
[백준] 16637번 괄호 추가하기  (0) 2020.02.21
728x90

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

 

10569번: 다면체

문제 수학자가 구를 깎아서 볼록다면체를 만들었다. 이 수학자는 임의의 볼록다면체에 대해 (꼭짓점의 수) - (모서리의 수) + (면의 수) = 2가 성립한다는 것을 알고 있다. 그래서 구를 깎는 게 취미인 이 사람은 꼭짓점, 모서리와 면의 수를 기록할 때 꼭짓점과 모서리의 수만 세고 면의 수는 세지 않는다. 입력 첫 번째 줄에 1 이상 100 이하의 자연수 T가 주어진다. 다음 T개의 줄에 4 이상 100 이하의 자연수 V와 E가 공백을 사이에 두고 주어

www.acmicpc.net

#include <iostream>
using namespace std;

int main() {
	int t;
	cin >> t;
	for (int i = 0; i < t; i++) {
		int v, e;
		cin >> v >> e;
		cout << e - v + 2 << '\n';
	}
	return 0;
}
728x90

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

[백준] 수 정렬하기 3  (0) 2020.02.24
[백준] 1927 최소 힙  (0) 2020.02.24
[백준] 2864 5와 6의 차이  (0) 2020.02.22
[백준] 16637번 괄호 추가하기  (0) 2020.02.21
[백준] 5585번 거스름돈  (0) 2020.02.21
728x90

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

 

2864번: 5와 6의 차이

문제 상근이는 2863번에서 표를 너무 열심히 돌린 나머지 5와 6을 헷갈리기 시작했다. 상근이가 숫자 5를 볼 때, 5로 볼 때도 있지만, 6으로 잘못 볼 수도 있고, 6을 볼 때는, 6으로 볼 때도 있지만, 5로 잘못 볼 수도 있다. 두 수 A와 B가 주어졌을 때, 상근이는 이 두 수를 더하려고 한다. 이때, 상근이가 구할 수 있는 두 수의 가능한 합 중, 최솟값과 최댓값을 구해 출력하는 프로그램을 작성하시오. 입력 첫째 줄에 두 정수 A와 B가 주어

www.acmicpc.net

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

int main() {
	string a, b;
	cin >> a >> b;
	string minA = "";
	string maxA = "";
	for (int i = 0; i < a.size(); i++) {
		if (a[i] == '6' || a[i] == '5') {
			minA += "5";
			maxA += "6";
		}
		else {
			minA += a[i];
			maxA += a[i];
		}
	}
	string minB = "";
	string maxB = "";
	for (int i = 0; i < b.size(); i++) {
		if (b[i] == '6' || b[i] == '5') {
			minB += "5";
			maxB += "6";
		}
		else {
			minB += b[i];
			maxB += b[i];
		}
	}
	int minResult = stoi(minA) + stoi(minB);
	int maxResult = stoi(maxA) + stoi(maxB);
	cout << minResult << " " << maxResult;
	return 0;
}
728x90

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

[백준] 1927 최소 힙  (0) 2020.02.24
[백준] 10569번 다면체  (0) 2020.02.22
[백준] 16637번 괄호 추가하기  (0) 2020.02.21
[백준] 5585번 거스름돈  (0) 2020.02.21
[백준] 10995번 별 찍기 - 20  (0) 2020.02.20
728x90

삼성 SW 역량 테스트 A형 기출문제

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

 

16637번: 괄호 추가하기

길이가 N인 수식이 있다. 수식은 0보다 크거나 같고, 9보다 작거나 같은 정수와 연산자(+, -, ×)로 이루어져 있다. 연산자 우선순위는 모두 동일하기 때문에, 수식을 계산할 때는 왼쪽에서부터 순서대로 계산해야 한다. 예를 들어, 3+8×7-9×2의 결과는 136이다. 수식에 괄호를 추가하면, 괄호 안에 들어있는 식은 먼저 계산해야 한다. 단, 괄호 안에는 연산자가 하나만 들어 있어야 한다. 예를 들어, 3+8×7-9×2에 괄호를 3+(8×7)-(9×

www.acmicpc.net

#include <iostream>
#include <vector>
#include <string>
using namespace std;
//16637번
vector<int> result;
vector<char> operators;
vector<int> operands;
int n;
long long maxResult = -2147483647;

void combination(vector<bool> visited, vector<int> endResult, int k, int num) {
	if (k == num) {
		vector<char> realOperators;
		vector<int> realOperands;
		realOperands.push_back(operands[0]);
		for (int i = 1; i < operands.size(); i++) {
			bool isIn = false;
			for (int j = 0; j < endResult.size(); j++) {
				if (endResult[j] == i) {
					isIn = true;
					break;
				}
			}
			if (isIn) {
				realOperators.push_back(operators[i - 1]);
				realOperands.push_back(result[i]);
				i++;
			}
			else {
				realOperators.push_back(operators[i - 1]);
				realOperands.push_back(operands[i]);
			}
		}
	
		int calculate = realOperands[0];
		for (int i = 0; i < realOperators.size(); i++) {
			switch (realOperators[i]) {
			case '*':
				calculate *= realOperands[i + 1];
				break;
			case '-':
				calculate -= realOperands[i + 1];
				break;
			case '+':
				calculate += realOperands[i + 1];
				break;
			}
		}
		if (calculate > maxResult) maxResult = calculate;
		return;
	}
	for (int i = 1; i < n / 2; i++) {
		if (num == 0) {
			if (!visited[i]) {
				visited[i] = true;
				endResult[num] = i;
				combination(visited, endResult, k, num + 1);
				visited[i] = false;
			}
		}
		else {
			if (!visited[i] && endResult[num - 1] < i - 1) {
				visited[i] = true;
				endResult[num] = i;
				combination(visited, endResult, k, num + 1);
				visited[i] = false;
			}
		}
	}
}


int main() {
	cin >> n;
	int operandIndex = 0;
	int operatorIndex = 0;
	string s;
	cin >> s;
	for (int i = 0; i < n; i++) {
		if (i % 2 == 0) {
			operands.push_back(s[i] - '0');
		}
		else {
			operators.push_back(s[i]);
		}
	}
	result = vector<int>(n / 2);
	for (int i = 0; i < n / 2; i++) {
		switch (operators[i]) {
		case '*':
			result[i] = operands[i] * operands[i + 1];
			break;
		case '+':
			result[i] = operands[i] + operands[i + 1];
			break;
		case '-':
			result[i] = operands[i] - operands[i + 1];
			break;
		}
	}
	if (n == 1) {
		cout << operands[0];
	}
	else {
		for (int i = 0; i <= (n - 3) / 2; i++) {
			vector<int> endResult(i);
			vector<bool> visited(n / 2);
			combination(visited, endResult, i, 0);
		}
		cout << maxResult;
	}
	return 0;
}
728x90

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

[백준] 10569번 다면체  (0) 2020.02.22
[백준] 2864 5와 6의 차이  (0) 2020.02.22
[백준] 5585번 거스름돈  (0) 2020.02.21
[백준] 10995번 별 찍기 - 20  (0) 2020.02.20
[백준] 3980번 선발 명단  (0) 2020.02.20
728x90

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

 

5585번: 거스름돈

문제 타로는 자주 JOI잡화점에서 물건을 산다. JOI잡화점에는 잔돈으로 500엔, 100엔, 50엔, 10엔, 5엔, 1엔이 충분히 있고, 언제나 거스름돈 개수가 가장 적게 잔돈을 준다. 타로가 JOI잡화점에서 물건을 사고 카운터에서 1000엔 지폐를 한장 냈을 때, 받을 잔돈에 포함된 잔돈의 개수를 구하는 프로그램을 작성하시오. 예를 들어 입력된 예1의 경우에는 아래 그림에서 처럼 4개를 출력해야 한다. 입력 입력은 한줄로 이루어져있고, 타로가 지불할

www.acmicpc.net

greedy 알고리즘의 아주 대표적인 문제이다.

#include <iostream>
using namespace std;

int main() {
	int cost;
	cin >> cost;
	int money[] = { 500, 100, 50, 10, 5, 1 };
	int change = 1000 - cost;
	int total = 0;
	int cnt = 0;
	while (true) {
		if (change == total) break;
		if (total + money[0] <= change) {
			total += money[0];
			cnt++;
		}
		else if (total + money[1] <= change) {
			total += money[1];
			cnt++;
		}
		else if (total + money[2] <= change) {
			total += money[2];
			cnt++;
		}
		else if(total + money[3] <= change) {
			total += money[3];
			cnt++;
		}
		else if (total + money[4] <= change) {
			total += money[4];
			cnt++;
		}
		else if (total + money[5] <= change) {
			total += money[5];
			cnt++;
		}
	}
	cout << cnt;
	return 0;
}
728x90

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

[백준] 2864 5와 6의 차이  (0) 2020.02.22
[백준] 16637번 괄호 추가하기  (0) 2020.02.21
[백준] 10995번 별 찍기 - 20  (0) 2020.02.20
[백준] 3980번 선발 명단  (0) 2020.02.20
[백준] 1182번 부분수열의 합  (0) 2020.02.20
728x90

이런 String 배열이 있을 때

public class ArrayTest {
    public static void main(String[] args) {
        String[] arr = {"apple", "banana", "cherry", "donut"};
        System.out.println(arr);
    }
}

이 배열을 출력하면

이렇게 이상한 글자가 출력된다.

public class ArrayTest {
    public static void main(String[] args) {
        String[] arr = {"apple", "banana", "cherry", "donut"};
        System.out.println(arr.toString());
    }
}

이렇게 arr.toString()을 출력해도 결과는 똑같다. toString()을 출력하는 것은 어떤 변수를 그냥 출력했을 때와 같다.

 

일반 배열은 그냥 출력하면 이렇게 이상하게 출력된다.

그럴 때 사용하는 것이 Arrays 클래스의 static 메소드 toString()이다.

import java.util.Arrays;

public class ArrayTest {
    public static void main(String[] args) {
        String[] arr = {"apple", "banana", "cherry", "donut"};
        System.out.println(Arrays.toString(arr));
    }
}

그러면 이렇게 우리가 원하는 대로 출력되는 것을 볼 수 있다.

 

Arrays와 같이 s로 끝나는 클래스들은 대부분 유용한 static 메소드들이 들어있는 유틸리티 클래스이다.

Arrays 클래스에서 자주 쓰이는 유용한 정적 메소드 중 하나가 sort() 메소드이다.

static 메소드이기 때문에 메소드 앞에 클래스이름.을 꼭 붙여서 Arrays.sort() 이렇게 사용해야 한다.

String[] arr = {"cherry", "Banana", "apple", "donut"};

이렇게 문자열들이 다 섞여있는 배열을 Arrays.sort() 메소드를 이용해서 정렬해보자.

import java.util.Arrays;

public class ArrayTest {
    public static void main(String[] args) {
        String[] arr = {"cherry", "Banana", "apple", "donut"};
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

정렬이 되긴 했지만 대문자가 소문자보다 유니코드 값이 더 작기 때문에 Banana가 가장 앞에 온다.

대소문자를 구분하지 않고 정렬하고 싶다면 Arrays.sort() 메소드의 두 번째 인자에 Comparator 객체를 비교기준으로 넣어주면 된다.

import java.util.Arrays;

public class ArrayTest {
    public static void main(String[] args) {
        String[] arr = {"cherry", "Banana", "apple", "donut"};
        Arrays.sort(arr, String::compareToIgnoreCase);
        System.out.println(Arrays.toString(arr));
    }
}

그러면 이렇게 대소문자를 무시하고 알파벳 순서대로 정렬된 것을 볼 수 있다.

위 코드는 메소드 참조를 이용한 것이고 람다식을 이용하고 싶다면 다음과 같이 하면 된다.

import java.util.Arrays;

public class ArrayTest {
    public static void main(String[] args) {
        String[] arr = {"cherry", "Banana", "apple", "donut"};
        Arrays.sort(arr, (a, b) -> a.compareToIgnoreCase(b));
        System.out.println(Arrays.toString(arr));
    }
}

이 코드를 실행해도 결과는 같다.

람다식과 메소드 참조를 잘 모른다면 아래 두 글을 먼저 읽어보는 것을 추천한다.

https://breakcoding.tistory.com/4

 

[Java] 람다식(lambda expression)과 메소드 참조(method reference)

C/C++에는 함수포인터라는 개념이 있어 함수를 다른 함수로 전달하고 싶을 때에는 함수 포인터를 사용하면 된다. 그런데 자바는 C/C++보다 더 객체지향적인 언어이기 때문에 메소드(C/C++로 따지면 함수)는 무조건..

breakcoding.tistory.com

https://breakcoding.tistory.com/183

 

[Java] 메소드 참조 (Method Reference)

이 글에 이어지는 글이다. (↓링크) [Java] 람다식(lambda expression)과 메소드 참조(method reference) C/C++에는 함수포인터라는 개념이 있어 함수를 다른 함수로 전달하고 싶을 때에는 함수 포인터를 사용..

breakcoding.tistory.com

람다식이나 메소드 참조를 이용하고 싶지 않다면 Comparator 클래스를 구현한 클래스를 만들어서 객체를 생성해서 sort() 메소드의 두 번째 인자로 넣어줄 수도 있다.

import java.util.Arrays;
import java.util.Comparator;

public class ArrayTest {
    public static void main(String[] args) {
        String[] arr = {"cherry", "Banana", "apple", "donut"};
        Arrays.sort(arr, new MyComparator());
        System.out.println(Arrays.toString(arr));
    }
}
class MyComparator implements Comparator<String> {
    @Override
    public int compare(String o1, String o2) {
        return o1.compareToIgnoreCase(o2);
    }
}

이렇게 해도 결과는 똑같다.

 

그런데 역시 정적 배열이라서 출력할 때도 귀찮고 중간에 원소를 삭제하고 싶을 때 곤란하다. 따라서 이런 정적 배열을 동적배열(리스트)로 바꾸고 싶다면 어떻게 해야 할까?

이것 역시 유틸리티 클래스인 Arrays에 있는 static 메소드 asList() 메소드를 이용하면 된다.

import java.util.Arrays;
import java.util.List;

public class ArrayTest {
    public static void main(String[] args) {
        String[] arr = {"apple", "banana", "cherry", "donut"};
        List<String> list = Arrays.asList(arr);
    }
}

이렇게 하면 배열을 동적 배열인 List로 쉽게 바꿀 수 있다.

 

이 List를 ArrayList로 바꾸고 싶다면 다음과 같이 하면 된다.

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ArrayTest {
    public static void main(String[] args) {
        String[] arr = {"apple", "banana", "cherry", "donut"};
        List<String> list = Arrays.asList(arr);
        ArrayList<String> arrayList = new ArrayList<>(list);
    }
}

이렇게 ArrayList의 생성자의 인자로 넣어주면 된다.

동적 배열 ArrayList로 바꾸고 나면 정적 배열이었을 때보다 훨씬 할 수 있는 것들이 많다. 특히 스트림을 이용해서 굉장히 편리하게 처리할 수 있는 것들이 많아진다.

728x90
728x90

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

 

10995번: 별 찍기 - 20

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

www.acmicpc.net

#include <iostream>
using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		if (i % 2 == 1) cout << ' ';
		for (int j = 0; j < n; j++) {
			cout << '*' << ' ';
		}
		cout << '\n';
	}
	return 0;
}
728x90

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

[백준] 16637번 괄호 추가하기  (0) 2020.02.21
[백준] 5585번 거스름돈  (0) 2020.02.21
[백준] 3980번 선발 명단  (0) 2020.02.20
[백준] 1182번 부분수열의 합  (0) 2020.02.20
[백준] 4948번 베르트랑 공준  (0) 2020.02.20
728x90

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

 

3980번: 선발 명단

문제 챔피언스 리그 결승전을 앞두고 있는 맨체스터 유나이티드의 명장 퍼거슨 감독은 이번 경기에 4-4-2 다이아몬드 전술을 사용하려고 한다. 오늘 결승전에 뛸 선발 선수 11명은 미리 골라두었지만, 어떤 선수를 어느 포지션에 배치해야 할지 아직 결정하지 못했다. 수석코치 마이크 펠란은 11명의 선수가 각각의 포지션에서의 능력을 0부터 100가지의 정수로 수치화 했다. 0은 그 선수가 그 포지션에 적합하지 않다는 뜻이다. 이때, 모든 선수의 포지션을 정하는

www.acmicpc.net

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

int ability[11][11];
vector<int> result(11);
int maxTotal = 0;

void select(vector<bool> visited, int num) {
	if (num == 11) {
		int total = 0;
		for (int i = 0; i < 11; i++) {
			total += ability[i][result[i]];
		}
		if (total > maxTotal) maxTotal = total;
		return;
	}
	for (int i = 0; i < 11; i++) {
		if (ability[num][i] != 0 && !visited[i]) {
			visited[i] = true;
			result[num] = i;
			select(visited, num + 1);
			visited[i] = false;
		}
	}
}


int main() {
	cin.tie(NULL);
	vector<bool> person(11);
	vector<bool> position(11);
	int testCase;
	cin >> testCase;
	for (int t = 0; t < testCase; t++) {
		for (int i = 0; i < 11; i++) {
			for (int j = 0; j < 11; j++) {
				cin >> ability[i][j];
			}
		}
		vector<bool> visited(11);
		maxTotal = 0;
		select(visited, 0);
		cout << maxTotal << '\n';
	}
	return 0;
}
728x90

+ Recent posts