[원격 강의] Java 실무 기초(4), 프로그래머스 알고리즘

우정·2022년 11월 16일
0

[내일배움캠프] TIL

목록 보기
8/50

1) Java 실무 기초

  1. 컬렉션(Collection)

    : 자료 구조의 전체

    • 프레임워크
      • 다수의 데이터를 다루기 위한 자료 구조를 표현하고 사용하는 클래스의 집합
      • 모든 클래스는 Collection Interface를 구현하는 클래스, 또는 인터페이스임
    • 종류
      1. 리스트(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);
                  }
                  }
              }
          }
      2. 셋(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);
              }
          }
      3. 맵(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);
              }
          }
      4. 스택(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());
              }
          }
      5. 큐(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 등 스택과 마찬가지로 모두 존재함
      6. 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());  // 비운 다음 비웠는지 확인
            }
        }

2) 알고리즘

2-1. 각도기
  • 최종 코드
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
2-2. 옷가게 할인 받기
  • 오류난 코드
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
2-3. 369게임
  • 여기까지가.. 끝인가보오........
    풀다가 자꾸 오류나고,, 내가 지금 뭘 하는지도 모르겠어서 포기했다...
    접근부터 복잡하게 한 거 같은데 어떻게 접근해야할지도 모르겠음!!!!! 공부가 답이다
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

3) 느낀 점

  • 개념 공부만 하다가 알고리즘 한 번 풀어보니까 확실해 개념 정리가 잘되는 느낌! 하루에 하나씩 풀어보는게 목표~!

0개의 댓글

관련 채용 정보