enoch012 / JavaBasicStudy

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

11월 12일 / 코딩테스트 연습(gwangho) #41

Open SDeung01 opened 12 months ago

SDeung01 commented 12 months ago

문제1 : 스킬트리

문제

  • 스킬은 알파벳 대문자로 표기하며, 모든 문자열은 알파벳 대문자로만 이루어져 있습니다.
  • 스킬 순서와 스킬트리는 문자열로 표기합니다.
    • 예를 들어, C → B → D 라면 "CBD"로 표기합니다
  • 선행 스킬 순서 skill의 길이는 1 이상 26 이하이며, 스킬은 중복해 주어지지 않습니다.
  • skill_trees는 길이 1 이상 20 이하인 배열입니다.
  • skill_trees의 원소는 스킬을 나타내는 문자열입니다.
    • skill_trees의 원소는 길이가 2 이상 26 이하인 문자열이며, 스킬이 중복해 주어지지 않습니다.

입출력 예

skill | skill_trees | return -- | -- | -- "CBD" | ["BACDE", "CBADF", "AECB", "BDA"] | 2

문제 풀이

회고

SDeung01 commented 11 months ago

문제 2 : 올바른 괄호

문제

입출력 예

s | answer -- | -- "()()" | true "(())()" | true ")()(" | false "(()(" | false

문제풀이

class Solution { boolean solution(String s) {

    Stack<Character> bracketStk = new Stack<>();

    if(!s.startsWith("(") || !s.endsWith(")")) { return false; }

    for(int i = 0; i < s.length(); i++){
        char nowBracket = s.charAt(i);
        if(nowBracket == '(') { bracketStk.push('('); }
        if(bracketStk.isEmpty()) { return false; }
        if(nowBracket == ')') { bracketStk.pop(); }
    }

    return bracketStk.size() == 0 ? true : false;

)

## 회고
- 스택이냐 큐 같이 1단계 문제에서는 자주 보이지 않던 자료구조를 사용하는 문제가 늘며 풀이에 난항을 겪고 있다. 매번 쓰던 리스트나 맵, 셋 뿐만 아니라 더 많은 자료구조에 대한 학습이 필요하다.
- 다른 사람의 코드를 보면 Stack과 같은 자료구조를 사용하지 않고도 복잡한 조건 없이 깔끔하게 풀 수 있었다.
```java
class Solution {
    boolean solution(String s) {
        boolean answer = false;
        int count = 0;
        for(int i = 0; i<s.length();i++){
            if(s.charAt(i) == '('){
                count++;
            }
            if(s.charAt(i) == ')'){
                count--;
            }
            if(count < 0){
                break;
            }
        }
        if(count == 0){
            answer = true;
        }

        return answer;
    }
}
SDeung01 commented 11 months ago

문제 3 : 혼자놀기의 달인

문제

입출력 예

cards | result -- | -- [8,6,3,7,2,5,1,4] | 12

문제풀이

class Solution {
    public int solution(int[] cards) {
        int highScore = Integer.MIN_VALUE;
        for(int i = 0; i < cards.length; i++){
            int[] cardArr = cards.clone();
            //group1
            int score1 = group(cardArr, i);
            if(score1 == cardArr.length) { return 0; }
            //group2
            for(int j = 0; j < cardArr.length; j++){
                int[] leftCards = cardArr.clone();
                // 1번 그룹에서 선택한 상자는 제외했기 때문에 2번 그룹에서 뽑을 일이 없다.
                // 따라서 -1 일 경우 continue
                if(leftCards[j] == -1) { continue; }
                int score2 = group(leftCards, j);
                int newScore = score1 * score2;
                if(newScore > highScore) {
                    highScore = newScore;
                }
            }
        }

        return highScore;
    }

    // 고른 상자 안의 카드에 적힌 숫자에 따라 다음 뽑을 상자를 고름
    // 연 상자에는 표시(-1)를 하고 이미 연 상자를 다 시 고를 때 까지 반복하며 그때까지의 횟수를 반환
    private int group (int[] cardArr, int startIdx){
        int selectIdx = startIdx;
        int cnt = 0;
        while(cardArr[selectIdx] > -1){
            int card = cardArr[selectIdx];
            cardArr[selectIdx] = -1;
            selectIdx = card - 1;
            cnt++;
        }
        return cnt;
    }
}

회고