enoch012 / JavaBasicStudy

Java 기초 스터디 (2023.09 ~ 10)
0 stars 1 forks source link

11월 6일 / 코딩테스트 연습(gwangho) #35

Open SDeung01 opened 1 year ago

SDeung01 commented 1 year ago

문제 1 : 귤 고르기

문제

입출력 예

k | tangerine | result -- | -- | -- 6 | [1, 3, 2, 5, 4, 5, 2, 3] | 3 4 | [1, 3, 2, 5, 4, 5, 2, 3] | 2 2 | [1, 1, 1, 1, 2, 2, 2, 3] | 1

문제풀이

class Solution { public int solution(int k, int[] tangerine) { int answer = 0; int total = 0;

    // 귤 사이즈, 개수 의 형태로 map에 저장
    Map<Integer, Integer> gyulMap = new HashMap<>();

    for(int size : tangerine){
        gyulMap.put(size, gyulMap.getOrDefault(size,0)+1);
    }

    // 개수가 많은 순으로 정렬하기 위해 map의 keySet을 리스트로 받아 내림차순으로 정렬
    List<Integer> sizeList = new ArrayList<>(gyulMap.keySet());
    sizeList.sort((s1,s2) -> gyulMap.get(s2).compareTo(gyulMap.get(s1)));

    // 정렬된 리스트의 요소를 key로 사용
    // 한 사이즈의 귤을 모두 상자에 담고 상자가 넘치면 break
    for(int size : sizeList){
        total += gyulMap.get(size);
        answer++;
        if(total >= k) break;
    }

    return answer;
}

}

## 회고
- 앞서 얘기한 Map의 value만을 받아 정렬하여 사용하는 방법이다.
- List에 저장하는 값과 정렬방식에 차이가 있을 뿐 기본적인 골자는 같다.
```java
        List<Integer> sizeList = new ArrayList(gyulMap.values());
        Collections.sort(sizeList ,Collections.reverseOrder());

        for(int i=0;i<sizeList .size();i++){

            k-=sizeList .get(i);
            answer++;
            if(k<=0){
                break;
            }
        }

Collections.sort(sizeList ,Collections.reverseOrder());

대신 아래와 같은 방법으로도 내림차순 정렬이 가능하다.

sizeList.sort(((o1, o2) -> o2 - o1));

위 방식은 Comparable 인터페이스를 구현하는 comparTo() 메소드를 사용하는 방식이고, 아래의 방식은 Comparator 인터페이스를 구현하여 compare() 메소드를 사용하는 방식이다.

SDeung01 commented 1 year ago

문제 2 : 영어 끝말잇기

문제

입출력 예

n | words | result -- | -- | -- 3 | ["tank", "kick", "know", "wheel", "land", "dream", "mother", "robot", "tank"] | [3,3] 5 | ["hello", "observe", "effect", "take", "either", "recognize", "encourage", "ensure", "establish", "hang", "gather", "refer", "reference", "estimate", "executive"] | [0,0] 2 | ["hello", "one", "even", "never", "now", "world", "draw"] | [1,3]

문제풀이

class Solution { public int[] solution(int n, String[] words) {

    int speak = 0;
    String prevWord = "" + words[0].charAt(0);
    Set<String> wordSet = new HashSet<>();

    for(String myWord : words){
        int playerNo = (speak % n) + 1;
        int turn = (speak / n) + 1;

        if(chainCheck(prevWord, myWord) && dupliCheck(wordSet, myWord)){
            prevWord = myWord;
            wordSet.add(myWord);
            speak++;
        } else {
            return new int[]{playerNo, turn};
        }
    }
    return new int[]{0, 0};
}

// 이전 단어의 마지막 알파벳과 현재 단어의 시작 알파벳이 일치하는지 체크
private boolean chainCheck(String prevWord, String myWord){
    char lastCh = prevWord.charAt(prevWord.length()-1);
    char startCh = myWord.charAt(0);
    return lastCh == startCh;
}

// 현재 단어가 이미 나온 단어인지 체크
private boolean dupliCheck(Set<String> wordSet, String myWord){
    return !wordSet.contains(myWord);
}

}



## 회고
- contains를 사용하지 않고 Set.size()와 변수 speak를 비교하는 방법으로도 중복성을 검사할 수 있다.(Set은 중복값을 허용하지 않으므로  만약 중복된 단어라면 Set.size()와 변수 speak는 그 크기가 다를 수 밖에 없다.)
- `return` 을 잘 사용할 경우 따로 break를 사용할 필요 없이 루프 탈출과 함수 탈출을 동시에 할 수 있어 편리하다.
- 리턴타입이 배열일 경우 반환을 위해 별도의 배열을 선언해줄 필요 없이 리턴값에서 new 연산자를 통해 생성하여 바로 반환 할 수 있다.
SDeung01 commented 1 year ago

문제3 : 점프와 순간 이동

문제

입출력 예

N | result -- | -- 5 | 2 6 | 2 5000 | 5

문제 풀이

회고