GreatAlgorithm-Study / AlgorithmStudy

🌟알고리즘 대장정🌟
6 stars 4 forks source link

[10주차_목요일] 표 병합 #131

Closed yeahdy closed 4 days ago

yeahdy commented 1 week ago
### 🤔 시간복잡도 고려사항

### 💡 풀이 아이디어
yeongleej commented 1 week ago

🤔 시간복잡도 고려사항

=> 최대 시간복잡도: 각 command당 5050의 탐색이 일어남 -> O(50 50 * 1000) 약 2,500,000 => 완전탐색 가능

💡 풀이 아이디어

BFS로 풀었는데, Union-FInd 문제였네요,,!! ㅎㅎ

baexxbin commented 1 week ago

🤔 시간복잡도 고려사항

💡 풀이 아이디어

14-22번까지 계속 틀려서 문제가 뭘까 엄청 고민했었는데 인덱스 문제였습니다... 0인덱스로 설정을 안해줘서(-1)... 인덱스 놓치지 않기!! 문자열도 다루고 유니온 파인드도 연습할 수 있어서 좋은 문제였던것 같습니당

icegosimperson commented 6 days ago

🤔 시간복잡도 고려사항

표 크기 50*50, 문자열 길이 <= 1000 : 구현 가능

💡 풀이 아이디어

1) case UPDATE

3) case `UNMERGE` : 병합된 칸 초기화
```java
case "UNMERGE":
    r = Integer.parseInt(st.nextToken()) - 1;
    c = Integer.parseInt(st.nextToken()) - 1;

    int g = find(r * 50 + c);  // 대표 칸 찾기
    v = values[g];            // 대표 칸의 값 저장

    // 모든 셀에 대해 경로 압축 수행
    for (int j = 0; j < n; j++) {
        find(j);
    }

    for (int j = 0; j < n; j++) {
        if (find(j) == g) {      // 동일한 대표 칸을 가진 경우 초기화
            grp[j] = j;          // 병합된 셀을 개별 셀로 분리

            if (j == r * 50 + c) {
                values[j] = v;   // 지정된 칸의 값 유지
            } else {
                values[j] = null; // 나머지 칸 초기화
            }
        }
    }
    break;

4) case PRINT : list-> String[] 출력

case "PRINT":
    r = Integer.parseInt(st.nextToken()) - 1;
    c = Integer.parseInt(st.nextToken()) - 1;

    v = values[find(r * 50 + c)]; // 대표 칸의 값 가져오기

    if (v == null) {
        answers.add("EMPTY");    // 값이 없는 경우 "EMPTY" 추가
    } else {
        answers.add(v);          // 값이 있으면 추가
    }
    break;

처음에 단순 구현 문제인줄 알고 풀었었는데 테케 틀려서 찾아보니까 유니온 파인드로도 풀 수 있는 문제더라고요..! 문자열 입출력, 유니온 파인드 복습 할 수 있어서 좋았습니다

yeahdy commented 6 days ago

🤔 시간복잡도 고려사항

💡 풀이 아이디어

계속 테케 11~16 , 18번에서만 런타임에러 발생하는데, String 배열 초기값을 "" 으로 바꿔보고(NPE), 배열크기를 넉넉히(ArrayIndexOutOfBoundsException) 해봤는데도 런타임에러가 발생하네요.. 질문하기에 있는 반례 테케 다 넣어서 실행해보면 통과하는데 도대체.. 어떤게 문제인지 모르겠어요😫😭 토요일날 같이 디버깅해주실 스터디원 분들....

Jewan1120 commented 6 days ago

🤔 시간복잡도 고려사항

💡 풀이 아이디어

KodaHye commented 6 days ago

🤔 시간복잡도 고려사항

💡 풀이 아이디어


~최대한 풀어보려고 했는데,,, 1, 10, 13, 14, 16에서 실패하네요!!!!!!!!!!!,,,, 근데 어디서 잘못된지는 잘 모르겠습니다 ㅠㅠ,,,, 리뷰 전까지 한 번 더 봐보고,,,, 안되면,,, 저도,,,, 코드상 오류 한 번만 봐주시면 감사하겠습니다1!!!~

해결완료!!! unmerge()과정에서 오류가 있었네요!!

원래 코드

static void unmerge(int r, int c) {
  int key = markGroupNum[r][c];

  ArrayList<Point> removeSet = new ArrayList<Point>();
  for(Point p: hashMap.get(key)) {
      int nextKey = p.r * 51 + p.c;
      markGroupNum[p.r][p.c] = nextKey;
      table[p.r][p.c] = null;

      removeSet.add(p);
      hashMap.get(nextKey).add(p);
  }

  hashMap.get(key).removeAll(removeSet);
}


수정코드

static void unmerge(int r, int c) {
    int key = markGroupNum[r][c];
    String value = table[r][c];

    hashMap.get(key).clear();

    for(int rr = 1; rr < table.length; rr++) {
        for(int cc = 1; cc < table[0].length; cc++) {
            if(markGroupNum[rr][cc] == key) {
                int realKey = rr * 51 + cc;
                table[rr][cc] = null;
                markGroupNum[rr][cc] = realKey;
                hashMap.get(realKey).add(new Point(rr, cc));
            }
        }
    }
    table[r][c] = value;
}

처음 했던 방법은 key 값이 r * 51 + c인 경우에만 성립되는 코드였고, 제가 구현을 이상하게 했네요!!!! 문제 해결도 했으니,,, 편히 자러 갑니다,,,