C++ vector 최대값, 최소값






결과

결과






코드

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


int main() {
    
    vector<int> v = {5, 8, 2, 4, 5, -5};

    int max = *max_element(v.begin(), v.end());
    int min = *min_element(v.begin(), v.end());

    cout << "최대 : " << max << "\n";
    cout << "최소 : " << min << "\n";

    // 최대, 최소값의 인덱스 구하기
    int max_index = max_element(v.begin(),v.end()) - v.begin();
    int min_index = min_element(v.begin(),v.end()) - v.begin();

    return 0;
}




 #include <algorithm> 이 필요하다.



C++ string 소문자, 대문자 변환 - tolwer, toupper






결과

결과






코드

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


int main() {
    
    vector<string> v = {"abc", "EFG", "zYx"};

    // 소문자
    for(auto it = v.begin(); it != v.end(); it++)
        transform(it->begin(), it->end(), it->begin(), ::tolower);
    for (int i = 0; i < v.size(); i++) cout << v[i] << " ";

    cout << "\n";

    // 대문자
    for (auto it = v.begin(); it != v.end(); it++)
        transform(it->begin(), it->end(), it->begin(), ::toupper);
    for (int i = 0; i < v.size(); i++) cout << v[i] << " ";

    cout << "\n";


    return 0;
}




#include <algorithm> 이 필요하다.






[STL] C++ map, multimap, unordered_map





결과

map 내림차순 결과






코드

#include <iostream>
#include <string>

#include <map>
#include <unordered_map>
using namespace std;

int main() {
	
	// map<int, string> m;	// 오름차순
	map<int, string, greater<int>> m;	// 내림차순
	// multimap<int, string> m;	// 중복 key 가능

	// unordered_map<int, string> m;	// 정렬 x


	m.insert(make_pair(4, "d") );
	m.insert(make_pair(1, "a"));
	m.insert(make_pair(3, "c"));
	m.insert(make_pair(2, "b"));
	m.insert(make_pair(3, "c"));
	
	cout << "개수 : " << m.size() << "\n";
	
	// 3 키를 갖는 원소가 존재하면 해당 값 수정
	if(m.find(3) != m.end() ) m.at(3) = "w";

	m.erase(2);	// key 값

	for (auto i = m.begin(); i != m.end(); i++) {
		cout << i->first << " " << i->second << "\n";
	}
	cout << "\n";


	return 0;
}






1. map


map<int, string> m;	// 오름차순

- <키, 값> 의 구조를 갖는다.

ㄴ 여기서 키는 집합처럼 중복된 key는 갖을 수 없다.



- 해당 키가 이미 존재할 때, 값을 변경하도록 처리하기 위해서는 따로 검사하여 처리해주어야 한다. ( 글 하단에서 설명 )



- 자동으로 오름차순으로 정렬한다.


ㄴ 내림차순으로 정렬하기 위해서는 아래처럼 선언을 해준다.

map<int, string, greater<int>> m;	// 내림차순






2. multimap


multimap<int, string> m;	// 중복 key 가능

- map 라이브러리의 포함되어 있다.


- 기존의 map과는 다르게 동일한 Key를 갖을 수 있다.


- erase() 함수를 사용하여 삭제 시 값을 인수로 준다면 전부 지우지만

하나 씩 지우기 위해서는 find() 함수를 추가적으로 사용하여 삭제하여야 한다.


- at() 함수를 사용하여서 값을 변경할 수 없다.






3. unordered_map


unordered_map<int, string> m;	// 정렬 x

- 기존의 map과 동일하지만 정렬을 하지 않는다.



- 사용하기 위해서는 #include <unordered_map> 해주어야 한다.











insert(make_pair(E key, E value)) : 삽입

- pair을 생성한 후 <키,값> 을 삽입한다.


- 만약 키가 이미 존재할 경우 second의 false를 리턴한다.




erase(E key) 또는 erase(map<E>::iterator) : 삭제

- 키를 넣으면 삭제할 수 있다.


- 혹은 iterator을 인수로 주어서 삭제할 수도 있다.

ㄴ multimap일 경우 중복 값이 가능하므로 

키를 넣어 삭제 시 해당 값이 모두 삭제되지만

find를 사용하여 iterator을 인수로 주면 하나씩 삭제가 가능하다.





find(E e) : 탐색

- 존재하지 않는 값이면 map.end()를 리턴한다.

( end의 iterator )





at(E Key) = "수정할 값" : 수정


- 만약 삽입 시 이미 키가 존재할 경우 값을 변경해 주고 싶다면 해당 예처럼 하면 된다.

if( m.insert(make_pair(3, "w")).second == false ) m.at(3) = "w";

ㄴ 삽입 시 이미 키가 존재하므로 second의 false를 갖는다.

그러면 at() 함수를 사용하여 해당 값을 변경해주면 된다.






[STL] C++ set, multiset, unordered_set





결과

multiset 결과






코드

#include <iostream>
#include <string>

#include <set>
#include <unordered_set>
using namespace std;

int main() {
	
	// set<int> set;	// 오름차순
	// set<int, greater<int>> set;	// 내림차순
	multiset<int> set;	// 중복 집합(중복 가능)

	// unordered_set<int> set;	// 정렬 x


	set.insert(4);
	set.insert(1);
	set.insert(3);
	set.insert(2);
	set.insert(3);

	cout << "개수 : " << set.size() << "\n";

	set.erase(set.find(3));	// 2개의 3 중 하나만 제거

	for (auto i = set.begin(); i != set.end(); i++) {
		cout << *i << " ";
	}
	cout << "\n";


	return 0;
}





1. set


set<int> set;	// 오름차순

- 집합의 구조를 갖는다.

중복 원소 불가능



- 자동으로 오름차순으로 정렬한다.


ㄴ 내림차순으로 정렬하기 위해서는 아래처럼 선언을 해준다.

set<int, greater<int>> set;	// 내림차순






2. multiset


multiset<int> set;	// 중복 집합(중복 가능)

- set 라이브러리의 포함되어 있다.


- 기존의 set과는 다르게 동일한 값의 중복 저장이 가능하다.


- erase() 함수를 사용하여 삭제 시 값을 인수로 준다면 전부 지우지만

하나 씩 지우기 위해서는 find() 함수를 추가적으로 사용하여 삭제하여야 한다.






3. unordered_set


unordered_set<int> set;	// 정렬 x

- 집합의 구조를 갖는다.

 중복 원소 불가능


- 기존의 set와는 다르게 정렬을 하지 않는다. (=삽입한 순서)


- 사용하기 위해서는 #include <unordered_set> 해주어야 한다.










insert(E e) : 삽입

- 값을 삽입한다.





erase(E e) 또는 erase(set<E>::iterator) : 삭제

- 값으로 삭제할 수 있다.


- 혹은 iterator을 인수로 주어서 삭제할 수도 있다.

ㄴ multiset일 경우 중복 값이 가능하므로 

값을 넣어 삭제 시 해당 값이 모두 삭제되지만

find를 사용하여 iterator을 인수로 주면 하나씩 삭제가 가능하다.




find(E e) : 탐색

- 존재하지 않는 값이면 set.end()를 리턴한다.

( end의 iterator )







Java Queue(큐) 컬렉션 사용





결과

결과





코드

package pk;

import java.util.LinkedList;
import java.util.Queue;

public class Test {

	public static void main(String[] args) {
		Queue<String> ss = new LinkedList<>();
		
		// ss.add() = ss.offer() 삽입
		// ss.remove() = ss.poll() 삭제
		// ss.element() = ss.peek() 맨앞
		
		System.out.println(ss.offer("가") );
		ss.offer("나");
		ss.offer("다");
		ss.offer("가");
		ss.offer("라");
		
		System.out.println("현재 맨앞 : " + ss.peek());
		System.out.println("'다' 포함 여부 : " + ss.contains("다"));
		

		while(!ss.isEmpty()) {
			System.out.print(ss.poll() + " ");
		}
		
	}

}





Queue(큐) : 선입선출의 구조로서 먼저 들어온 객체가 가장 먼저 나가는 자료구조 이다.

Queue 인터페이스로 구현된 클래스 중 하나가 LinkedList 이며 이를 형변환하여 사용한다.





boolena offer() & add() : 삽입

- 객체를 삽입한다.






E poll() & remove() : 삭제

- 맨앞의 객체를 삭제한며 리턴해준다.


- 큐가 비어있을 경우 poll()을 사용하여 삭제를 시도하면 null을 리턴하지만 

remove() 사용하면 Exception을 발생시켜 종료한다.





E peek() & element() : 맨앞 가져오기

- 맨앞의 객체를 리턴해준다.


- 큐가 비어있을 경우 peek()를 사용한다면 null을 리턴해주지만 

element() 사용한다면 Exception을 발생시켜 종료한다.





boolean contains(E e) : 객체 찾기


- 인수로 준 객체가 존재한다면 true 아니면 false를 리턴한다.






Java Stack(스택) 컬렉션 사용





결과

결과





코드

package pk;

import java.util.Stack;

public class Test {

	public static void main(String[] args) {
		Stack<String> ss = new Stack<>();
		
		ss.push("가");
		ss.push("나");
		ss.push("다");
		ss.push("가");
		ss.push("라");
		
		System.out.println("현재 맨위 : " + ss.peek());
		System.out.println("'가' 순서 : " + ss.search("가"));
		System.out.println("'라' 순서 : " + ss.search("라"));
		
		while(!ss.empty() ) {
			System.out.print(ss.pop() + " ");
		}
		
	}

}




Stack : 후입선출의 구조로서 나중에 들어온 값이 가장 먼저 나가는 자료구조이다.





E push(E e) : 객체 삽입

- 인수로 준 객체를 스택의 삽입한다.


- 리턴형은 E로 삽입한 객체를 리턴한다.





E peek() : 객체를 가져옴

- 스택에서 객체를 갖고온다.

후입선출의 구조이므로 가장 위에 있는 값, 즉 가장 마지막으로 들어온 값을 리턴한다.


- pop과는 다르게 꼭대기 값을 가져오기만 한다.





E pop() : 객체를 삭제

- 가장 꼭대기의 객체를 삭제한다.


- 리턴형은 E로서 삭제한 객체를 리턴한다.


ㄴ 객체를 가져옴 = peek()

ㄴ 객체를 가져옴 + 삭제 = pop()





int serach(E e) : 객체를 찾음

- 꼭대기부터 인수로 준 객체를 스택에서 찾는다.


- 찾는 다면 해당 객체의 순서를 리턴한다.

여기서 순서란 꼭대기(=1) 부터 아래로 내려갈수록 1씩 증가한다.


즉, 스택의 들어온 역순이며 해당 객체와 동일한 객체가 다수 존재하면 꼭대기와 가장 가까운 객체의 순서를 리턴한다.


만약 객체가 없을경우 -1을 리턴한다.









Java HashSet 합집합, 차집합, 교집합, 부분집합





코드

package pk;

import java.util.HashSet;

public class Test {

	public static void main(String[] args) {
		HashSet<Integer> ss = new HashSet();	// 1 2 3 4
		HashSet<Integer> ss2 = new HashSet();	// 3 4 5 6
		HashSet<Integer> ss3 = new HashSet();	// 1 2
		
		ss.add(1);
		ss.add(2);
		ss.add(3);
		ss.add(4);
		
		ss2.add(3);
		ss2.add(4);
		ss2.add(5);
		ss2.add(6);
		
		ss3.add(1);
		ss3.add(2);
		
		/*
		ss.addAll(ss2);	// (1 2 3 4) ∪ (3 4 5 6) = (1 2 3 4 5 6) 합집합
		for(int n : ss) System.out.print(n + " ");
		System.out.println();
		*/
		
		/*
		ss.retainAll(ss2);	// (1 2 3 4) ∩ (3 4 5 6) = (3 4) 교집합
		for(int n : ss) System.out.print(n + " ");
		System.out.println();
		*/
		
		/*
		ss.removeAll(ss2);	// (1 2 3 4) - (3 4 5 6) = (1 2) 차집합
		for(int n : ss) System.out.print(n + " ");
		System.out.println();
		*/
		
		/*
		System.out.println(ss.containsAll(ss2));	// (1 2 3 4) ≠ (3 4 5 6)
		System.out.println(ss.containsAll(ss3));	// (1 2 3 4) ⊃ (1 2)
		*/
	}

}





HashSet 기본 사용법


링크

[JAVA/심화] - Java HashSet - 집합 삽입, 삭제, 탐색







addAll() : 합집합

합집합

- 두 집합의 원소들을 합한 집합을 만든다.

집합이므로 중복된 원소는 1개만 포함된다.





retainAll() : 교집합

교집합

- 두 집합에서 동일하게 포함하고 있는 원소만 있는 집합을 만든다.





removeAll() : 차집합

차집합

- 인수로 주는 집합의 포함된 동일한 원소들을 제거한다.




containsAll() : 집합 포함 여부(부분 집합)

부분 집합

- 인수로 주는 집합이 부분 집합이면 true이다.


- 해당 코드는 위쪽은 false가 아래는 true가 도출된다.


※ contains와 혼동하면 안된다.







Java HashSet - 집합 삽입, 삭제, 탐색





결과

결과





코드

package pk;

import java.util.HashSet;
import java.util.Iterator;

public class Test {

	public static void main(String[] args) {
		HashSet<String> ss = new HashSet<String>();
		
		ss.add("가");
		ss.add("나");
		ss.add("다");
		ss.add("라");
		ss.add("가");
		
		for(String s : ss) {
			System.out.print(s + " ");
			if(s.equals("라")) ss.remove(s);
		}
		
		System.out.println();
		Iterator<String> it = ss.iterator();
		while(it.hasNext()) {
			String s = it.next();
			System.out.print(s + " ");
			if(s.equals("다")) it.remove();
		}
		
		System.out.println();
		for(String s : ss) {
			System.out.print(s + " ");
		}
		System.out.println();
		System.out.println("길이 : " + ss.size());
		System.out.println("'가' 포함 여부 : " + ss.contains("가"));
		
	}

}




HashSet : 저장 순서가 유지되지 않으며 동일한 값을 1개만 저장할 수 있다.

중복이 없고, 순서가 없으므로 집합으로 볼 수 있다.

ex) 결과 1라인을 보면 중복이 허용안되며 순서도 무작위인걸 확인 가능하다.





boolean add(E e) : 원소 추가

- 리턴형이 boolean형으로 저장이 완료되면 true를, 중복된 원소라 저장이 실패한다면 false를 리턴한다.




boolean remove(Object o) : 원소 제거

- 성공적으로 제거하면 true를 실패하면 false를 리턴한다.




isEmpty() : 비었는지 검사




size() : 개수를 구함




boolean contains(Object o) : 포함 여부 확인

- 인수로 준 객체가 존재하는지 검사한다.




iterator() : iterator 객체를 얻음




탐색

1. for each문을 사용


2. Iterator를 사용

ㄴ boolean hasNext() : 가져올 객체가 있는지 없는지 검사한다.

ㄴ E next() : 한칸 다음으로 이동 후 그 객체 값을 리턴한다.


ex) 0 "가" "나 "다" "라"

이러한 set이 있다면 처음 next()를 실행하였을 경우 0에서 "가" 로 이동한 후 "가"를 리턴하게 된다.






+) 추가


- HashSet은 객체를 비교할 시 hashCode()와 equals() 메소드들을 재정의하여 조건을 지정해 주어야 한다.



링크

[JAVA/심화] - Java HashSet 합집합, 차집합, 교집합, 부분집합






+ Recent posts