99클럽 코테 스터디 26일차 달리기 경주

2024. 8. 16. 23:37·스터디/99클럽 코테 스터디 TIL

📝 문제

🔥 시도해본 접근 방식

1. 배열에서 원소들 끼리 순서를 계속 바꿔줘야 하므로 효율성을 위해 LinkedList로 재선언 한다.

2. callings 배열을 순회하면서 이름이 불린 사람의 index를 찾는다. 

3. LinkedList에서 [2]에서 찾은 index를 사용하여 원소를 제거하고 index - 1 에 새로 추가한다.

 

1️⃣ 첫번째 시도

import java.util.Arrays;
import java.util.LinkedList;

class Solution {
    public String[] solution(String[] players, String[] callings) {
        LinkedList<String> playerList = new LinkedList<>(Arrays.asList(players));

        for (String calling : callings) {
            int index = playerList.indexOf(calling);
            playerList.remove(index);
            playerList.add(index - 1, calling);
        }

        return playerList.toArray(new String[0]);
    }
}

이렇게 코드를 작성하였는데 결과는 5개의 케이스에서 시간초과가 발생하였다.

indexOf 메서드는 리스트에서 해당 요소를 찾기 위해 처음부터 끝까지 순차적으로 탐색하므로 시간 복잡도가 O(n)이기 때문에

indexOf가 시간을 많이 잡아먹고 있는 것 같다는 의심이 들었다.

 

✨ 성공 코드

import java.util.HashMap;

class Solution {
    public String[] solution(String[] players, String[] callings) {
        // callings를 순회할 때 플레이어의 등수를 빠르게 얻기 위한 Map 선언
        HashMap<String, Integer> playerMap = new HashMap<>();

        for (int i = 0; i < players.length; i++) {
            playerMap.put(players[i], i);
        }

        // callings를 순회
        for (String calling : callings) {
            // 불려진 이름의 등수(index)를 가져온다.
            int index = playerMap.get(calling);

            // 이름이 불려진 플레이어와 앞 순위 플레이어의 순위를 변경한다.
            String aheadPlayer = players[index - 1];
            players[index - 1] = calling;
            players[index] = aheadPlayer;

            // Map의 value로 가지고 있던 등수 또한 갱신해준다.
            playerMap.put(calling, index - 1);
            playerMap.put(aheadPlayer, index);
        }

        return players;
    }
}

indexOf를 대체하기 위해서 문제를 첫번째 시도의 코드와같이 접근하면 안된다고 느꼈다.

그래서 플레이어의 등수를 O(1)로 빠르게 가져올 수 있도록 HashMap을 선언했고 

callings 를 순회하면서 players 배열에 바로 접근하여 순위를 변경해주었고 그에 따라 따로 선언했던 HashMap 또한 갱신해주어서 문제를 해결 하였다.

'스터디 > 99클럽 코테 스터디 TIL' 카테고리의 다른 글

99클럽 코테 스터디 28일차 괄호 회전하기  (0) 2024.08.19
99클럽 코테 스터디 27일차 할인 행사  (0) 2024.08.18
99클럽 코테 스터디 25일차 Evaluate Division  (0) 2024.08.16
99클럽 코테 스터디 24일차 대충 만든 자판 [작성중]  (0) 2024.08.14
99클럽 코테 스터디 23일차 마법의 엘리베이터  (0) 2024.08.13
'스터디/99클럽 코테 스터디 TIL' 카테고리의 다른 글
  • 99클럽 코테 스터디 28일차 괄호 회전하기
  • 99클럽 코테 스터디 27일차 할인 행사
  • 99클럽 코테 스터디 25일차 Evaluate Division
  • 99클럽 코테 스터디 24일차 대충 만든 자판 [작성중]
Been
Been
  • Been
    Been
    Been
  • 전체
    오늘
    어제
    • 분류 전체보기 (60)
      • 언어 (0)
        • Kotlin (0)
      • 안드로이드 (17)
      • iOS (3)
      • Git (1)
      • 스터디 (39)
        • 알고리즘 문제 풀이 (1)
        • 99클럽 코테 스터디 TIL (38)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Android
    언더라인 제거
    NSR
    nsl
    debugRuntimeClasspath
    안드로이드
    코딩테스트준비
    개발자취업
    밑줄제거
    객체변환
    풀이실패
    IOS
    Coroutines
    maxWidth
    99클럽
    FragmentStateAdapter
    java
    자바
    WRITE EXTERNAL
    깃
    TIL
    아이폰
    Androiod
    쓰기권한
    AndroidID
    항해99
    RecyclerView
    EditText
    Git
    리싸이클러뷰
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
Been
99클럽 코테 스터디 26일차 달리기 경주
상단으로

티스토리툴바