2018년 10월 12일 금요일

[알고스팟] 인형


   문제

   181011

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void cleanBuf(void) {
 while(getchar()!='\n');
}

int main() {
 int T, n, m, *kd, i, *an;
 char str[1024];
 scanf("%d", &T); cleanBuf();
 if(T<1||T>50) return -1; //변수 범위 검사 
 while(T--){
  scanf("%[^\n]s", str); cleanBuf();
  n = atoi(strtok(str, " "));
  m = atoi(strtok(NULL, " "));
  if(n<1||n>100000) return -1; //변수 범위 검사 
  kd = malloc(sizeof(int)*n);
  an = malloc(sizeof(int)*n);
  for(i=0;i<n;i++) an[i]=0;
  
  scanf("%[^\n]s", str); cleanBuf();
  kd[0] = atoi(strtok(str, " "));

  for(i=1;i<n;i++){
   kd[i] = atoi(strtok(NULL, " "));
  }

  while(m>0){
   for(i=0;i<n;i++){
    if(kd[i]!=0 && m>0){
     an[i]++; kd[i]--;
     m--;
     printf("[%d] m:%d kd[%d]:%d an[%d]:%d\n", T, m, i, kd[i], i, an[i]);
    }
   }
  }
  printf("%d %d %d\n", an[0], an[1], an[2]);
  free(kd); free(an);
 }
}

이 문제도 어려운 편은 아니었는데, 더 효율적인 방법이 없을까하고 고민하다가 시간을 보냈다. 현재의 나한테는 이게 최선인 것 같다. 최적화는 되지 않아서 다음에 시간나면 최적화를 해봤으면 좋겠다.
인형의 종류별 개수를 계산하는 부분에서 잘못된 값이 나왔다. 조건문 부분에서 깊게 생각하지 않아 생긴 문제이다. 이중 반복문에 조건문까지 합하면 고려해야 할 조건들이 3가지 였는데, 각 조건들이 겹칠 모든 경우의 수를 생각하지 못하였다. while(m>0)안의 for이 독립적으로 반복될 때, n>m이고, m>0인 경우가 생겨 while이 완료되지 않고 계산되었다.

*n>m && m>0인 경우 효율적인 방안 생각해보았으면 한다.

*런타임 오류가 났다. 해결하고, 다시 올렸으면 좋겠다.

RTE (SIGSEGV: segmentation fault, probably incorrect memory access or stack overflow)

댓글 없음:

댓글 쓰기