이 블로그는 방문자 통계를 위해 티스토리 기본 기능과 Woopra를 사용합니다. 원하지 않으신다면 사용하시는 웹 브라우저에 내장된 DNT 헤더를 켜고, JavaScript를 끄셔도 무방합니다.
이 블로그 방문자의 약 60%는 네이버 검색을 사용하십니다. 을 이용하시면 더 유용한 정보를 쉽게 얻게 되실 수도 있습니다. [mediatoday]
« 2019/11 »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
블로그 이미지
제가 주제인 블로그... 그냥 주제 없는 블로그입니다. 전공 분야나 예전 관심 분야 등등에 관한 글이 우선입니다만, 두어 문단을 넘길 만한 글이라면 대강 정리해 기록합니다. 학부생입니다. 트위터에서 볼 수 있습니다. http://aurynj.net/ 어­리


지난번에 문제를 3번까지 올리다 만 사실조차 까먹고 말았다가 이제 깨달았다.
알고 보니 내 컴퓨터에도 문제를 풀어 놓은 소스가 없었다.
(난 뭐-_-지 ㅜㅠ)

시험기간 중간에 낀 주말이지만, 무시하고 지나가기에는 너무 큰 문제라서 손을 대기로 했다.

그리고 코딩 따위를 금방 끝냈다.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

char table[20][20];
char solution[20], solving[20];
int total = 0;
int size;
int diff_now, diff_best;

void tablein();
void divide(char col);
void checknow();
void makesol();
int uppersum();
void finish();

int main()
{
    tablein();
    divide(0);
    finish();
    return 0;
}

void tablein()
{
    int i, j;
    int sect;
    FILE *fp;
    fp = fopen("INPUT.TXT", "r");
    fscanf(fp, "%d", &size);
    for ( i = 0; i < size; i++ )
    {
        for ( j = 0; j < size; j++ )
        {
            fscanf(fp, "%d", &sect);
            total += sect;
            table[i][j] = sect;
        }
    }
    fclose(fp);
    diff_best = total;
}

void divide(char col)
{
    for (solving[col] = 0; col == 0 ? solving[col] <= size : solving[col] <= solving[col - 1]; solving[col]++)
    {
        if (col == size - 1)
            checknow();
        else
            divide((char)((int)col + 1));
    }
}

void checknow()
{
    if (total % 2 == 0)
        diff_now = abs(uppersum() - total / 2);
    else
        diff_now = abs(uppersum() - total / 2) + 1;
    if (diff_now < diff_best)
        makesol();
}

void makesol()
{
    diff_best = diff_now;
    memcpy(solution, solving, sizeof(char) * size);
}

int uppersum()
{
    int i, j, rets = 0;
    for (i = 0; i < size; i++)
        for (j = 0; j < solving[i]; j++)
            rets += table[j][i];
    return rets;
}

void finish()
{
    int i;
    FILE *fp = fopen("OUTPUT.TXT", "w");
    fprintf(fp, "%d\n", diff_best);
    for (i = 0; i < size; i++)
        fprintf(fp, "%d ", size - solution[i]);
    fclose(fp);
}

* 참고.
주어진 밭의 수확량에서 동생과 형의 차이를 1로 만드는 데에는 아래와 같은 방법들이 존재한다.
  • 2 2 2 3 4 (문제의 예시)
  • 1 2 2 3 4
  • 0 0 3 5 5
물론 이 밖에도 있을 것이다. 내가 짠 위의 소스는 두번째 결과를 낸다.
강조한 줄이 하나 있는데, if 내의 <를 <=로 바꾸면 세번째 결과를 내게 된다.

코드에 대한 자세한 설명은 다음 기회로 미룬다.

댓글을 달아 주세요