함께 스터디/PS스터디 심화반

[PS스터디 심화반] 1주차 백준 멀티탭 스케줄링

Unagi_zoso 2022. 7. 8. 00:57

개요

나흘 전 스터디원들은 멀티탭 스케줄링 문제를 나흘 뒤 오늘까지 (새벽에 작성 중이라 어제가 맞습니다)

문제를 해결하고 서로의 코드를 보며 리뷰하기러 하였습니다.

 

https://www.acmicpc.net/problem/1700

 

 

리뷰와 피드백

해당 문제를 해결하는 과정에서 큰 줄기는 비슷하지만 잦은 잎에서는 조금씩 차이가 있었습니다.

스터디원 중에서는 큐를 사용하여 인접 전자기기들을 다룬 경우도 있고 제가 쓴 코드와는 다르게

멀티탭 초기화부와 이후에 순서를 진행할 반복문을 결합시킨 경우도 있었습니다.

 

 

그리고 스터디활동에 따라 서로에게 코드를 보여주고 설명해야하니 자세한 주석이나

스타일 등에 신경을 써야할 것 같다는 이야기가 나왔습니다.

 

 

 

개선안

 

아무래도 저는 입력을 받는 부분과 멀티탭 초기화 부분을 같이 구성하여 가독성에 좋지 못하였습니다.

이러한 부분을 개선하여 멀티탭의 초기화 부분에는 인접 전자기기의 순서(인덱스)만을 추가하여 

입력부의 책임을 덜었습니다. 

그리고 순서 진행의 반복문에 멀티탭이 다 찬 경우와 다 차지 않은 경우를 플래그 변수로 다루었습니다.

 

막상 하기 전에는 엄청나게 큰 변화가 있을거라 생각하였는데, 만족스러우면서도 부족한 부분이 있습니다.

 

 

 

개선 전 / 후   코드 전문

 

... 생략
// 개선 전

int main() {
  cin >> n >> k;
  fill(adjc, adjc+105, INF);
    
  int nxt;
  int mtab_cnt = 0;
  for (int i = 0; i < k; ++i) {
    cin >> arr[i];
    if (adjc[arr[i]] == INF) adjc[arr[i]] = i;
    if (mtab_cnt < n) { 
      if (mtab[arr[i]] == 0) ++mtab_cnt; 
      mtab[arr[i]] = 1; adjc[arr[i]] = INF;
      nxt = i;
      }
  }
    
  for (int i = nxt; i < k; ++i) {
    if (mtab[arr[i]] == 1) adjc[arr[i]] = findAdjc(i+1, k, arr[i]);
    else {
      mtab[findMaxAdjc()] = 0;
      mtab[arr[i]] = 1;
      adjc[arr[i]] = findAdjc(i+1, k, arr[i]);
      ++ans;
    }
  }
  cout << ans;
}

 

 

 

... 생략
// 개선 후

int main() {
  cin >> n >> k;
  fill(adjc, adjc+105, INF);
  // 각 전자기기 가장 가까운 순서 adjc배열에 저장 (adjacent)  
  for (int i = 0; i < k; ++i) { if (adjc[arr[i]] == INF) adjc[arr[i]] = i; cin >> arr[i]; }
          
  // 멀티탭 초기화부 합침
  int mtab_cnt = 0;
  bool is_mtab_full = false;
  for (int i = 0; i < k; ++i) {
    // 멀티탭에 이미 존재할 시
    if (mtab[arr[i]] == 1) adjc[arr[i]] = findAdjc(i+1, k, arr[i]);
    else {
      // 멀티탭이 초기화 되었다면
      if (is_mtab_full == true) { mtab[findMaxAdjc()] = 0; ++ans; }
      else { ++mtab_cnt; }
      if (mtab_cnt == n) is_mtab_full = true;
      mtab[arr[i]] = 1;
      adjc[arr[i]] = findAdjc(i+1, k, arr[i]);
      
    }
  }
  cout << ans;
}

 

 

 

 

향후 방침, 느낀 점

 

 

살면서 경험하는 첫 스터디이기도 하고 지금까지 다른 사람과 상호직접적으로 코드를 리뷰하고 피드백 하는 것은 처음이라 불친절한 코드를 만들어왔다 느낄 수 있었습니다. 항상 다른 사람과 같이 작업하거나 검토하는 것을 생각해왔는데,

막상 해보니 나 자신에게 어설픈점이 많다는 걸 실감할 수 있었습니다. 다음 주차에서는 더욱 좋은 코드로 도움이 되었으면 좋겠네요. 그리고 무척 재밌었습니다!

 

 

 

읽어주셔서 감사합니다. 틀린 부분이나 부족한 부분은 알려주세요. 감사합니다.