[TIL] 2월 3일

yeon·2021년 2월 4일
0

이코테 구현 파트

왕실의 나이트(115p)

  • 내코드
				Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();

        int x = input.charAt(0) - 96;
        int y = Integer.parseInt(input.substring(1));
        int count = 0;

        int[] xMove = {x + 2, x - 2, x + 1, x - 1};
        int[] yMove = {y + 1, y - 1, y + 2, y - 2};

        // 8가지 경우를 다 적는건가..?
        if ((xMove[0] > 0 && xMove[0] < 9)) {
            if (yMove[0] > 0 && yMove[0] < 9) count++;
            if (yMove[1] > 0 && yMove[1] < 9) count++;
        }
        if ((xMove[1] > 0 && xMove[1] < 9)) {
            if (yMove[0] > 0 && yMove[0] < 9) count++;
            if (yMove[1] > 0 && yMove[1] < 9) count++;
        }
        if ((xMove[2] > 0 && xMove[2] < 9)) {
            if (yMove[2] > 0 && yMove[2] < 9) count++;
            if (yMove[3] > 0 && yMove[3] < 9) count++;
        }
        if ((xMove[3] > 0 && xMove[3] < 9)) {
            if (yMove[2] > 0 && yMove[2] < 9) count++;
            if (yMove[3] > 0 && yMove[3] < 9) count++;
        }
        System.out.println(count);
  • 잘 돌아가긴 하는데 나동빈님 풀이가 더 깔끔하다.
  • 어려운 문제같지 않은데 손쉽게 풀지 못한것 같다ㅜㅜ
  • 나동빈님 풀이
				Scanner sc = new Scanner(System.in);

        String input = sc.nextLine();
        int row = input.charAt(1) - '0';
        int column = input.charAt(0) - 'a' + 1;

        // 나이트가 이동할 수 있는 8가지 방향
        int[] dx = {-2, -1, 1, 2, 2, 1, -1, -2};
        int[] dy = {-1, -2, -2, -1, 1, 2, 2, 1};

        int count = 0;
        for (int i = 0; i < 8; i++) {
            int nextRow = row + dx[i];
            int nextColumn = column + dy[i];

            if (nextRow > 0 && nextRow < 9 && nextColumn > 0 && nextColumn < 9){
                count++;
            }
        }
        System.out.println(count);

char형을 숫자로

String input = sc.nextLine();
int row = input.charAt(1) - '0';
int column = input.charAt(0) - 'a' + 1;
  • input은 "a1"과 같이 입력받는다.
  • char형으로 된 숫자 - '0' : int 형 숫자
  • 알파벳 a는 1, b는 2 ... 라고 할 때 알파벳에서 - 'a' + 1을 하면 해당되는 숫자를 얻을 수 있다.

자바의 정석 11장 컬렉션 프레임웍

HashSet(631p)

Set인터페이스를 구현한 가장 대표적인 컬렉션

순서x, 중복x

HashSet은 객체를 저장하기 전에 기존에 같은 객체가 있는지 확인한다.

저장순서를 유지하고 싶다면 LinkedHashSet 이용

  • 생성자 HashSet(int initialCapacity, float loadFactor)

    • loadFactor : 저장공간이 가득 차기 전에 공간을 확보하는 것

      0.8로 지정하면 80%가 채워졌을때 용량을 두배로 늘린다.

      default값은 0.75임

  • 예제1

    public class HashSetEx1 {
        public static void main(String[] args) {
            Object[] objArr = {"1", new Integer(1), "2", "2", "3", "3", "4", "4"};
            Set set = new HashSet();
    
            for(int i = 0; i < objArr.length; i++){
                set.add(objArr[i]);
            }
            System.out.println(set);
        }
    }
    
    </> 실행 결과
    [1, 1, 2, 3, 4]
    • 그냥 System.out.println(set);만 해주어도 출력된다.
    • 실행 결과를 보면 HashSet은 중복된 객체를 저장하지 않는 것을 볼 수 있다.
  • 예제2 - HashSet에 add로 객체를 넣어줄 때 HeshSet의 특성상 중복된 객체가 있는지 확인해주는 절차를 거쳐야한다. 이때 equals()와 hashCode()를 호출해준다. 따라서 해당 객체의 클래스에 equals()와 hashCode()를 오버라이딩 해주어야한다!!! (635p)

    public class HashSetEx3 {
        public static void main(String[] args) {
            HashSet set = new HashSet();
    
            set.add("abc");
            set.add("abc");
            set.add(new Person("David", 10));
            set.add(new Person("David", 10));
    
            System.out.println(set);
        }
    }
    
    class Person {
        String name;
        int age;
    
        Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public String toString() {
            return name + " : " + age;
        }
    }
    
    </> 실행 결과
    [David : 10, abc, David : 10]
    • 실행 결과를 보면 중복된 Person객체가 들어간 것을 볼 수 있다.

      → 아래와 같이 Person클래스에 equals()와 hashCode()를 오버라이딩 해야한다. 
      public class HashSetEx3 {
          public static void main(String[] args) {
              HashSet set = new HashSet();
      
              set.add("abc");
              set.add("abc");
              set.add(new Person("David", 10));
              set.add(new Person("David", 10));
      
              System.out.println(set);
          }
      }
      
      class Person {
          String name;
          int age;
      
          Person(String name, int age) {
              this.name = name;
              this.age = age;
          }
      
          public String toString() {
              return name + " : " + age;
          }
      
          @Override
          public boolean equals(Object o) {
             if(o instanceof Person) {
                 Person tmp = (Person) o;    // 형변환 꼭 해주어야함 
                 return this.name.equals(tmp.name) && this.age == tmp.age;
             }
             return false;
          }
      
          @Override
          public int hashCode() {
              return Objects.hash(name, age);
          }
      }
    • equals()에서 o를 Person 타입으로 형변환 해주어야한다. o라는 리모콘에는 name과 age과 없기 때문에 name과 age에 접근하기 위해서 Person타입으로 바꾸어줘야한다.

    • hashCode()

      • hash()의 인자는 가변인자이기 때문에 iv를 다 적어주면 된다.
  • Generate 단축키 : command + n

  • 예제3-HashSet의 교집합, 합집합, 차집합 구하기

    밑에 코드는 예제여서 연습해본것이고 원래 HashSet에 있는 메서드를 쓰면 된다.

    합집합(addAll), 교집합(retainAll), 차집합(removeAll)

    public class HashSetEx5 {
        public static void main(String[] args) {
            HashSet setA = new HashSet();
            HashSet setB = new HashSet();
    
            HashSet setHab = new HashSet();
            HashSet setKyo = new HashSet();
            HashSet setCha = new HashSet();
    
            setA.add("1");
            setA.add("2");
            setA.add("3");
            setA.add("4");
            setA.add("5");
            System.out.println("A : " + setA);
            setB.add("4");
            setB.add("5");
            setB.add("6");
            setB.add("7");
            setB.add("8");
            System.out.println("B : " + setB);
    
            // 교집합
            Iterator it = setB.iterator();
            while (it.hasNext()) {
                Object tmp = it.next();
                if (setA.contains(tmp)) setKyo.add(tmp);
            }
            System.out.println("교집합 : " + setKyo);
    
            // 차집합
            it = setA.iterator();
            while (it.hasNext()) {
                Object tmp = it.next();
                if (!setB.contains(tmp)) setCha.add(tmp);
            }
            System.out.println("A - B 차집합 : " + setCha);
    
            // 합집합
            it = setA.iterator();
            while (it.hasNext()) {
                setHab.add(it.next());
            }
            it = setB.iterator();
            while (it.hasNext()) {
                setHab.add(it.next());
            }
            System.out.println("합집합 : " + setHab);
    
        }
    }
    
    </> 실행 결과
    A : [1, 2, 3, 4, 5]
    B : [4, 5, 6, 7, 8]
    교집합 : [4, 5]
    A - B 차집합 : [1, 2, 3]
    합집합 : [1, 2, 3, 4, 5, 6, 7, 8]

오늘한일

  • 알고리즘 푸는데 전보다 감이 사라진것이 느껴진다. 코딩연습 진짜 많이 해야겠다ㅜㅜㅜ
  • HashSet 특징과 HashSet 메서드 예제, HashSet에 객체를 담을때 중복여부를 확인해야 해서 객체 타입 클래스에 equlas()와 hashCode()를 오버라이딩 해야함
  • 미션이 없어도 공부를 많이 하려 했지만 뜻대로 하지 못했다..ㅎㅎ

Todo

  • (내일) 이코테 구현파트 게임 개발

0개의 댓글