[TIL] 1월 27일

yeon·2021년 1월 27일
0
post-custom-banner

해커랭크 알고리즘

Diagonal difference

Diagonal Difference | HackerRank

public static int diagonalDifference(List<List<Integer>> arr) {
    int firstAdd = 0, secondAdd = 0;
        for (int i = 0; i < arr.size(); i++) {
                firstAdd += arr.get(i).get(i);
                secondAdd += arr.get(i).get(arr.size() - 1 -i);

        }
        return Math.abs(firstAdd - secondAdd);
    }

Kangaroo

Number Line Jumps | HackerRank

static String kangaroo(int x1, int v1, int x2, int v2) {
        String result = "NO";
        double movingNum = (double) (x2 - x1) / (v1 - v2);

        if (x2 > x1 && v2 > v1) return result = "NO";
        else if (movingNum < 0 || movingNum > 10000) return             result = "NO";
        else if (movingNum != (int) movingNum) return result =          "NO";
        else result = "YES";

        return result;
}

Save The Prisoner

Save the Prisoner! | HackerRank

static int saveThePrisoner(int n, int m, int s) {
    if ((m % n + s - 1) % n == 0) return n;
    else return  (m % n + s - 1) % n;
}
  • 처음에 그냥 return m % n + s - 1 을 해주었는데 테스트케이스에서 통과하지 못했다.
  • 그래서 if(m > n)이라는 조건을 추가해주어서 사탕의 갯수가 죄수보다 많을 때 m % n + s - 1을 해주고, 사탕이 죄수의 수보다 적을 때는 s + m - 1을 해주었는데 계속 wrong answer가 떴다...
  • 찾아보니 사탕이 죄수의 수보다 적을 경우를 내가 처음 구현했던대로 하지 않고, (m % n + s - 1) % n으로 해주었다.
    • 예를들어 죄수 수가 13, 사탕 수 5, 시작 번호 12 인 경우에 내가 원래 작성한 코드의 결과는 16이 되기 때문에 죄수의 수를 넘어버려서 틀린 답이 되기 때문에 n으로 나누어주어야 한다!
    • 만약 m % n + s - 1에서 나온 값이 죄수보다 크다면 사탕이 죄수보다 적은 경우이다. 그래서 이 값을 죄수 수로 나누어준다. (% n 을 해준다.)
    • %n 까지 해준 값이 0인 경우에는 답이 n 이다.

Time Conversion

Time Conversion | HackerRank

static String timeConversion(String s) {
      int h = Integer.parseInt(s.substring(0, 2));
        if (s.substring(8, 10).equals("AM") && h == 12) h = 0;
        if (s.substring(8, 10).equals("PM") && h != 12) {
            h += 12;
            if (h == 24) h = 0;
        }
        return String.format("%02d", h) + s.substring(2, 8);
    }
  • 시간이 12PM 인 경우를 코드에 넣지 않아서 테스트 코드의 한 케이스에서 통과하지 못하고 수정했다.

자바의 정석 12장 지네릭스, 열거형, 애너테이션 학습 시작

지네릭스(Generics)

지네릭스란?

컴파일 시의 체크를 해주는 기능

타입의 안정성을 제공한다. → 의도하지 않은 타입의 객체가 저장되는 일을 방지

다룰 객체의 타입을 미리 명시해줌으로써 번거로운 형변환을 생략할 수 있다.

타입변수

  • 지네릭 클래스를 작성할 때, Object 타입 대신 타입변수를 선언한다.

  • 지네릭 클래스의 객체 생성시, 타입변수(E) 대신 실제 타입을 대입한다.

  • 타입변수 대신 실제 타입이 지정되면 형변환 생략이 가능하다.

  • 예제 (일반 클래스와 지네릭 클래스)

    일반 클래스

    class Box {
    		Object item;
    
    			void setItem(Object item){
    				this.item = item;
    			}
    			
    			Object getItem() {
    				return item;
    			}
    }

    위의 클래스를 지네릭 클래스로 변경하면 클래스 옆에 를 붙이고, Object를 모두 T로 바꾼다.

    class Box<T> {
    		T item;
    	
    		void setItem(T item) {
    			this.item = item;
    		}
    
    		T getItem() {
    			return item;
    		}
    }
    • 여기서 T를 타입변수(type variable) 이라고 한다.

    • 타입변수는 T 이외에 다른 것을 사용해도 된다.

      • ArrayList의 경우 타입 변수 E를 사용 하고 E는 element에서 따온 글자이다.
    • 지네릭 클래스인 Box클래스의 객체를 생성할 때는 실제 타입을 지정해주어야 한다.

      Box<String> b = new Box<>();  // T 대신 실제 타입 지정
      b.setItem(new Object());   // 에러!!! String 이외의 타입 지정 불가
      b.setItem("ABC");
      String item = b.getItem();  // 형변환 필요 없음 

오늘 한 일

  • 해커랭크 알고리즘 네 문제를 풀었다.
  • 자바의 정석 12장 학습 시작
    • 지네릭스? 지네릭스 클래스? 지네릭스 클래스의 객체 생성 시?
  • 그제 어제 힘들었나보다 사람은 스트레스를 받으면 잠을 많이 잔다는 이야기를 본것 같은데 어제 밤에 많이 잤는데도 점심시간에 밥도 안먹고 잠만 잤다... 흑흑
  • 오늘도 공부는 조금만하고 스프링입문 책 읽고 자야겠다.
post-custom-banner

0개의 댓글