컬렉션(Collection)
: 자료 구조의 전체
리스트(List) : 순서가 있는 데이터의 집합, 데이터 중복 허용(ArrayList, LinkedLise, Stack …)
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> integerList = new ArrayList<>(); // 1. List<어떤 타입의 자료구조를 담을지 선언>
integerList.add(1); // list는 add하는 순간 그에 맞춰 사이즈가 정해짐, 자료가 많아질 수록 크기도 늘어남
integerList.add(5);
integerList.add(4);
integerList.add(11);
integerList.add(10);
System.out.println(integerList);
Collections.sort(integerList); // List 내부 정렬, 오름차순으로
System.out.println(integerList);
System.out.println(integerList.size()); // 사이즈(크기) 출력
integerList.remove(4); // 지우기
System.out.println(integerList);
for (int i = 0; i < integerList.size(); i++) { // 0번부터 index 마지막 자리에 해당하는 i를 구할 수 있음
System.out.println(integerList.get(i));
for (int current: integerList) { // 위에랑 똑같은 결과
System.out.println(current);
}
}
}
}
셋(Set) : 순서를 유지하지 않는 데이터의 집합, 데이터의 중복 불가(HashSet, TreeSet …)
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Set<Integer> integerSet = new HashSet<>(); // Set은 인터페이스 형태, HashSet은 클래스
// 전에는 int라는 소문자로 primitive 타입을 사용했는데
// 컬렉션 프레임워크를 쓰기 위해선
// 이 자료구조(intergerSet)이 사실은 객체이다 보니까 객체를 담을 수 있는 타입이어야 함 > 참조형 자료
// 대신 primitive 타입 integer, boolean, long 클래스가 이미 자바에 정의 되어있기 때문에 integer = int임
integerSet.add(1);
integerSet.add(1);
integerSet.add(3);
integerSet.add(2);
integerSet.add(9);
integerSet.add(8);
System.out.println(integerSet); // 중복 제거됨, 순서 유지 안됨
Set<String> stringSet = new HashSet<>();
stringSet.add("LA");
stringSet.add("New York");
stringSet.add("LasVegas");
stringSet.add("San Francisco");
stringSet.add("Seoul");
System.out.println(stringSet); // 순서가 유지되지 않음
stringSet.remove("Seoul"); // 순서가 없기 때문에 index를 줄 수가 없음. 정확하게 지정해줘야 함
System.out.println(stringSet);
List<String> target = new ArrayList<>(); // 여러 개 지우기
target.add("New York");
target.add("LasVegas");
stringSet.removeAll(target); // collection 타입이면 뭐든 올 수 있음
System.out.println(stringSet);
System.out.println("LA 포함되어있나요? " + stringSet.contains("LA")); // 어떤 값이 포함되어 있는지 확인
System.out.println("Seoul 포함되어있나요? " + stringSet.contains("Seoul"));
System.out.println(stringSet.size()); // size 확인
stringSet.clear(); // 자료구조 다 지우기
System.out.println(stringSet);
}
}
맵(Map) : key와 value의 쌍으로 이루어진 데이터의 집합, 순서는 유지되지 않고 키는 중복 불가, 값은 중복 허용(HashMap, TreeMap …)
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<Integer, String > map = new HashMap<>();// key, value에 해당하는 타입 두 가지 써줘야 함
map.put(1, "apple");
map.put(2, "berry");
map.put(3, "cherry");
System.out.println(map);
System.out.println("1st in map: " + map.get(0)); // 첫 번째 값 가져오기 // null 나오는 이유: key를 넣어줘야 하는데 index를 넣음
System.out.println("1st in map: " + map.get(1)); // get 함수는 key 를 받아서 value 를 리턴함
map.remove(2); // index가 아닌 key를 지움
System.out.println(map);
System.out.println(map.containsKey(2)); // set 과 마찬가지로 contain 함수로 있는지 없는지 확인 가능
System.out.println(map.containsValue("cherry"));
System.out.println(map.containsValue(3)); // 타입이 잘못돼서 false 뜸
map.clear();
System.out.println(map);
}
}
스택(Stack) : 마지막에 넣은 데이터를 먼저 꺼내는 자료구조, LIFO 형태(Stack, ArrayDeque …)
import java.util.Stack;
public class Main {
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(3);
stack.push(7);
stack.push(5);
System.out.println(stack); // 순서대로 출력
System.out.println(stack.peek()); // 맨 위에 있는 거 확인하기
System.out.println("size: " + stack.size());
System.out.println(stack.pop()); // 맨 위에 있는 거 꺼내기
System.out.println("size: " + stack.size());
System.out.println(stack.contains(1)); // 들어있는지 확인
System.out.println(stack.empty()); // pop 한 이후 또 pop 하면 안 되니까 empty로 확인해보기
stack.clear();
System.out.println(stack.isEmpty());
}
}
큐(Queue) : 먼저 넣은 데이터를 먼저 꺼내는 자료구조, FIFO 형태(queue, ArrayDeque …)
import java.util.LinkedList;
import java.util.Queue;
public class Main {
public static void main(String[] args) {
Queue<Integer> queue = new LinkedList<>();
queue.add(1);
queue.add(5);
queue.add(3);
System.out.println(queue); // 순서대로 출력
System.out.println(queue.poll()); // poll: 맨 앞의 값을 꺼내고 반환함
System.out.println(queue); // poll을 한 이후 출력값의 변화 확인
System.out.println(queue.peek()); // 맨 앞의 값 확인
System.out.println(queue); // peek 이후에도 그대로 있는 것 확인 할 수 있음
}
}
// clear, isEmpty 등 스택과 마찬가지로 모두 존재함
ArrayDeque
양쪽에서 삽입과 반환이 가능함(스택과 큐의 기능 모두 포함)
코드
import java.util.ArrayDeque;
public class Main {
public static void main(String[] args) {
ArrayDeque<Integer> arrayDeque = new ArrayDeque<>();
arrayDeque.addFirst(1); // 이름이 명시적임
arrayDeque.addFirst(2);
arrayDeque.addFirst(3);
arrayDeque.addFirst(4);
System.out.println(arrayDeque); // 계속 새로운 값을 앞에 넣으니까 넣는 순서와 반대로 출력이 됨
arrayDeque.addLast(0); // 맨 뒤에 값을 넣기
System.out.println(arrayDeque);
arrayDeque.offerFirst(10);
System.out.println(arrayDeque); // queue의 크기에 문제가 생겼을 때, offerFirst는 false를 리턴하고 addFirst는 exception이 남
arrayDeque.offerLast(-1);
System.out.println(arrayDeque);
arrayDeque.push(22);
System.out.println(arrayDeque);
System.out.println(arrayDeque.pop());
System.out.println(arrayDeque);
System.out.println(arrayDeque.poll());
System.out.println(arrayDeque);
System.out.println(arrayDeque.peek());
System.out.println(arrayDeque);
System.out.println(arrayDeque.size());
arrayDeque.clear(); // 비우기
System.out.println(arrayDeque.isEmpty()); // 비운 다음 비웠는지 확인
}
}
def solution(angle):
if 0 < angle < 90:
answer = 1
elif angle == 90:
answer = 2
elif 90 < angle < 180:
answer = 3
else:
answer = 4
return answer
def solution(price):
if 100000 <= price < 300000:
answer = "%.2f" %(price*5.0/100.0)
elif 300000 <= price < 500000:
answer = "%.2f" %(price*10.0/100.0)
elif price >= 500000:
answer = "%.2f" %(price*20.0/100.0)
else:
return price
answer_1 = float(answer)
return price - answer_1
실행해보면 괜찮다했는데 제출하면 자꾸 오류나길래 뭐지 하다가 팀원분들이랑 코드 리뷰 하면서 물어봤더니 좋은 방법을 깨달았다.
바로 5%, 10%, 20% 할인이 된다하면 그냥 가격에 0.95, 0.9, 0.8 을 곱하면 된다고.... 이걸 왜 생각을 못했을까
암튼 이렇게 바꾸니까 됨!!
최종코드
def solution(price):
if 100000 <= price < 300000:
answer = int(price*0.95)
elif 300000 <= price < 500000:
answer = int(price*0.9)
elif price >= 500000:
answer = int(price*0.8)
else:
return price
return answer
order = 1
def solution(order):
for order in range(1,1000001):
if order.count(3):
answer3 = 1
elif order.count(6):
answer6 = 1
elif order.count(9):
answer9 = 1
else:
answer = 0
return answer + answer3 + answer6 + answer9