본문 바로가기

IT

[algospot/알고리즘] 알고스팟, '왕초보' 난이도 ENDIANS 풀기

알고스팟에서 "왕초보"를 위한 문제를 찾았습니다.

늦은 시간에 퇴근하여 복잡한 머리로 어려운 알고리즘 문제를 읽고 있노라면,

어느새 졸고 있는 자신을 발견할 수 있는데요.

가장 쉬운 문제들이라면 문제를 읽고 (어쩌면) 풀 수도 있겠죠? :)


주말을 맞이하여 오늘은 8문제를 하나씩 살펴보면서,

한문제를 풀때마다 알고스팟 랭킹이 어떻게 바뀌는지 살펴보겠습니다.

랭킹시스템이 있으니 좋은 동기부여가 되겠지요?


algospot > 온라인 저지 > 튜토리얼

위의 메뉴에 접근하면 "왕초보급 구현문제" 항목을 볼 수 있습니다.



왕초보를 위한 문제가 8개나 준비되어 있죠.

'왕초보' 문제로 워밍업을 하고 '초보' 수준으로 올라가면 되겠군요.

'왕초보' 문제를 심사숙고하며 풀어보겠습니다. :)


첫번째 문제는 워밍업을 위한 워밍업입니다.

- 제목 : MERCY

- 난도 : ☆☆ (0점/5점)

- 문제 : 입력으로 숫자 N을 받으면, N번만큼 "Hello Algospot!"을 출력하세요.

- 답안

#include <stdio.h>

int main(int argc, char **argv)
{
    int count = 0;
    int i = 0;

    scanf("%d", &count);

    for (; i < count; i++) {
        printf("Hello Algospot!\n");
    }

    return 0;
}


지난 번에 튜토리얼 문제를 하나 풀고,

위처럼 MERCY 문제까지 총 두 문제를 푸니 3723등이 되었습니다.


오늘의 본 경기인 ENDIANS를 풀어보도록 하겠습니다.

문제가 영문으로 되어 있으니 '간단하게' 한글로 번역해놓겠습니다.

- 제목 : ENDIANS

- 난도 : ★☆ (1점/5점)

- 문제 : Lilliput과 Blefuscu는 라이벌 국가입니다. 두 국가는 서로 싫어하는데 가장 큰 이유가 계란을 깨서 먹는 방법이 다르기 때문이지요. Lilliput에서는 little-endians으로 계란 윗부분부터 깹니다. 하지만, Blefuscu는 Big-endians으로 아랫부분부터 깨지요.

단지 계란 깨는 것 뿐만 아니라 컴퓨터에서도 바이트를 저장하는 순서에 차이가 있습니다. Lilliput은 작은 바이트부터 배치하고 Blefuscu는 큰 바이트부터 배치합니다.

예를 들어, 32비트 unsigned integer 0x12345678은 다음 두가지 방식으로 저장할 수 있습니다.

  • 00010010 00110100 01010110 01111000 (in an Blefuscu computer)
  • 01111000 01010110 00110100 00010010 (in an Lilliput computer)

그러므로 Lilliput과 Blefuscu 컴퓨터가 서로 데이터를 교환하려면 변환과정이 필요합니다. 보내는 사람이 처리하는 대신 받는 사람이 변환과정을 거칩니다.

32비트 unsigned integer를 추출하여 제대로된 값으로 변환하는 프로그램을 짜세요.

- 답안

#include <stdio.h>

struct bytes {
    char byte_1;
    char byte_2;
    char byte_3;
    char byte_4;
};

int main(int argc, char **argv)
{
    int count = 0;
    register int i = 0;

    scanf("%d", &count);

    for (; i < count; i++) {
        unsigned int number_bf;
        unsigned int number_af;
        struct bytes *bf = (struct bytes *) &number_bf;
        struct bytes *af = (struct bytes *) &number_af;

        scanf("%u", &number_bf);
       
        af->byte_1 = bf->byte_4;
        af->byte_2 = bf->byte_3;
        af->byte_3 = bf->byte_2;
        af->byte_4 = bf->byte_1;

        printf("%u\n", number_af);
    }

    return 0;
}


SWAP을 위한 방법은 많이 있겠지만,

char 4개를 가진 구조체를 두고 변환하는 방법을 사용하겠습니다.

비트연산보다는 struct을 사용하는게 (제게는) 가독성이 더 좋아서요.

두 개의 구조체를 두고, 처음과 마지막 바이트를 서로 바꾸고, 두번째와 세번째를 서로 바꾸었습니다.

직관적으로 이해하기 쉬운 코드라고 생각합니다.

쉽죠? :)


세번째 문제를 완수하니 3100등으로 순위가 올라갔습니다.

왕초보 문제로 순위를 올리니 뭔가 겸연쩍네요.


오늘은 너무 열심히 뇌를 사용했습니다.

그럼 좋은 하루 보내세요~