Beat Clicker
66 posts
Offline
프로그래밍에 대해 이야기하는 쓰레드입니다!

다양한 프로그래밍 관련 이야기들을 올려봅시다!

궁금한 것을 물어봐도 되고, 코딩하다 막히는 부분에 대해 이야기해봐도 됩니다!

참고로 저는 C계열(C/C++/C#)을 주로 쓰고, 자바와 파이썬은 부로 씁니다.
Last edited by A BCDe on , edited 1 time in total.
my maps!
currently working
https://osu.ppy.sh/s/601185
User avatar
Global Moderator
2,444 posts
Offline
전 취미, 단순한 작업용으로 예전에 배웠었기에 그닥 잘하진 못합니다만 주로 쓰는건 C/C++, C#, Go 정도네요.
Python은 약간 되긴 하는데, 솔직히 잘은 모르겠...

그러고보니 osu! 하시는 분들중에는 프로그래밍 전공으로 배우시는분들이 많더군요

Fly away!

User avatar
Combo Commander
471 posts
Offline
저는 C를 공부하는것으로 시작해서 학교에서 자바, 지금은 python으로 디스코드에서 봇을 돌리고 있어요.
파이썬은... 저도 역시 그냥 필요할 때 찾아보고 나머지는 그냥 땜빵해서....... 안다고 말할 수 있을지 모르겠네요.
Image
User avatar
Rhythm Incarnate
1,449 posts
Offline
저도 주로 C 스타일 언어들 (C/C++, Java) 많이 쓰는데 요즘 들어서 OOP 언어 보단 C가 더 끌리네요, 어설프게 OOP 스타일로 디자인해서 코딩하는 것보단 그냥 대충(...) 하는게 더 빨라서

그리고 이번 학기는 Javascript WebGL 하느라 죽는줄
ImageImage
Beat Clicker
66 posts
Offline
저는 친구따라 강남간다는 말 따라 친구따라 코딩 시작했는데, 이제는 취미라기기보다는 전공으로 가지고 갈 생각도 하고 있습니다.
개인적으로는 자바보다는 c#인 것 같습니다. 아직은 Java가 더 많이 쓰이기는 하지만 아마 자바의 시대도 끝나고 있지 않나 싶네여

> 파이썬은 기계학습할 때만 씁시다! 쓰기는 편해도 너무 느려서..
>> Go를 쓰시는 분은 처음봐요!
my maps!
currently working
https://osu.ppy.sh/s/601185
User avatar
Global Moderator
2,444 posts
Offline
A BCDe wrote:
>> Go를 쓰시는 분은 처음봐요!

그저 컴퓨터에 환경을 저거 3개만 해둬서 하고있는거긴 합니다만...
지금은 그마저도 포맷하고나서 설정하기 귀찮단 이유로 멍때리고 있음

Fly away!

Beat Clicker
66 posts
Offline
Sylphi wrote:
그저 컴퓨터에 환경을 저거 3개만 해둬서 하고있는거긴 합니다만...
지금은 그마저도 포맷하고나서 설정하기 귀찮단 이유로 멍때리고 있음

많이 설정할 필요없는 비주얼 스튜디오 쓰세요..!
my maps!
currently working
https://osu.ppy.sh/s/601185
User avatar
Rhythm Incarnate
776 posts
Offline
Image

고작 그거야 설마
스크립트 키드들이 득실거리는구나...어설프군
Image
User avatar
Rhythm Incarnate
816 posts
Offline
형님들 제가 과제가 막혀서 그런데 좀 도와주세용 ㅠㅠ

문제
산타의 양말 찾기
50개의 선물 상자 중에 한 개의 상자에는 산타의 양말이 들어 있다. 다음의 조건에 맞는 양말이 들어있는 상자를 찾는 프로그램을 작성하시오.
1. 상자는 배열을 이용하여 구현, 선물 상자의 무게는 10 양말 상자의 무
게는 1로 가정
2. 상자를 여는 횟수는 1번으로 제한 (배열을 탐색하여 1인 것을 찾는 방
법은 불가)
3. 상자들의 무게를 비교하여 범위를 제한하는 함수는 재귀 함수로 작성(
비교하는 횟수는 6번 이하)


일단 조교님 힌트로는 이진 탐색이랑 비슷한 방법으로 하면 된다는데

도오오오오오오저히 답이 안나옵니다 ㅠㅠ

일단 지금까지 짠 코드는 이따 집가서 보여드릴게용 ㅠㅠ
User avatar
Global Moderator
2,444 posts
Offline
UnLock- wrote:
형님들 제가 과제가 막혀서 그런데 좀 도와주세용 ㅠㅠ

문제
산타의 양말 찾기
50개의 선물 상자 중에 한 개의 상자에는 산타의 양말이 들어 있다. 다음의 조건에 맞는 양말이 들어있는 상자를 찾는 프로그램을 작성하시오.
1. 상자는 배열을 이용하여 구현, 선물 상자의 무게는 10 양말 상자의 무
게는 1로 가정
2. 상자를 여는 횟수는 1번으로 제한 (배열을 탐색하여 1인 것을 찾는 방
법은 불가)
3. 상자들의 무게를 비교하여 범위를 제한하는 함수는 재귀 함수로 작성(
비교하는 횟수는 6번 이하)


일단 조교님 힌트로는 이진 탐색이랑 비슷한 방법으로 하면 된다는데

도오오오오오오저히 답이 안나옵니다 ㅠㅠ

일단 지금까지 짠 코드는 이따 집가서 보여드릴게용 ㅠㅠ

일단 단순하게 수학적으로 생각해보면, 양측으로 나눠서 더 무거운쪽을 다시한번 그런식으로 해보는 방법으로 해보면 될거에요
공책에 한번 직접 해봤는데, 50개 기준으로는 6번정도만 확인하면 충분히 알수 있더군요

e.g. (25, 25) -> (12, 13) -> (6, 7) -> (3, 4) -> (2, 2) -> (1, 1)

50의 경우엔 25, 25로 나눈 다음부터는 똑같이 나눌수가 없는 상황이 되긴 하는데
어짜피 상자 하나의 무게가 10이라면 한개가 더 있다고 해서 문제가 되진 않을겁니다

12, 13을 기준으로 봤을때, 만약 12쪽에 10이라는 무게의 상자가 있다면 각각 무게는 21, 13이 될테고
13쪽에 10이라는 무게의 상자가 있다면 각각 무게는 12, 22가 될테니까요.

코드가 이상하게 되긴 했지만, 굳이 작성한다면 이런느낌이 되겠네요

C++
Code:
#include <iostream>
#include <algorithm>

int nyaa(int *arr, unsigned int size, int val) {
    if (size == 0)
        return -1;
    
    if (size == 1 && arr[0] == val) {
        return 0;
    }
    else if (size == 1 && arr[0] != val) {
        return -1;
    }
    
    unsigned int del = size / 2;
    int left = std::accumulate(arr, arr + del, 0, std::plus<int>());
    int right = std::accumulate(arr + del, arr + size, 0, std::plus<int>());

    if (left > right) {
        int ret = nyaa(arr, del, val);
        return (ret != -1) ? (size_t)arr + (size_t)ret - (size_t)arr : ret;
    }
    else if (left < right) {
        int ret = nyaa(arr + del, size - del, val);
        return (ret != -1) ? (size_t)arr + (size_t)del + (size_t)ret - (size_t)arr : ret;
    }
    else {
        return -1;
    }
}

int main()
{
    int arr[50];
    std::fill_n(arr, 50, 1);
    
    srand(time(0));
    arr[rand()%50] = 10;
    
    int search = nyaa(arr, 50, 10);
    if (search == -1) {
        std::cout << "Not found" << std::endl;
    }
    else {
        std::cout << "Found: arr[" << search << "] == " << arr[search] << std::endl; 
    }
}

Fly away!

Beat Clicker
66 posts
Offline
UnLock- wrote:
형님들 제가 과제가 막혀서 그런데 좀 도와주세용 ㅠㅠ

문제
산타의 양말 찾기
50개의 선물 상자 중에 한 개의 상자에는 산타의 양말이 들어 있다. 다음의 조건에 맞는 양말이 들어있는 상자를 찾는 프로그램을 작성하시오.
1. 상자는 배열을 이용하여 구현, 선물 상자의 무게는 10 양말 상자의 무
게는 1로 가정
2. 상자를 여는 횟수는 1번으로 제한 (배열을 탐색하여 1인 것을 찾는 방
법은 불가)
3. 상자들의 무게를 비교하여 범위를 제한하는 함수는 재귀 함수로 작성(
비교하는 횟수는 6번 이하)


일단 조교님 힌트로는 이진 탐색이랑 비슷한 방법으로 하면 된다는데

도오오오오오오저히 답이 안나옵니다 ㅠㅠ

일단 지금까지 짠 코드는 이따 집가서 보여드릴게용 ㅠㅠ


답이 좀 늦은것인지도 모르겠는데요

저는 이 상자들을 3개로 나눠봤습니다.

그러니까, 50개의 상자면 17,17, 16 이렇게 세 더미로 최대한 균등하게 나눠보자는 것입니다.

그럼 첫번째 17개 상자들과 두번째 17개 상자들을 비교하면

1) 무게가 같다
2) 첫번째가 무겁다
3) 두번째가 무겁다

이렇게 세가지가 있겠죠.

1)의 경우에는 16개짜리 더미에 양말이 들어있는 것이겠죠.
2)의 경우에는 첫번째 17개 상자들 중 양말이 있겠죠.
3)의 경우에는 두번째 17개 상자들 중 양말이 있겠죠.

17, 17, 16이 아니더라도 16, 16, 18도 되겠죠.

이런 식으로 범위를 줄여나갈 수 있습니다.

이러면 최대 4번이면 양말을 찾을 수 있습니다.

c++ 코드입니다.

Code:
#include <stdio.h>
#include <random> // 랜덤을 위한 헤더
#include <time.h> // 랜덤을 위한 헤더
#pragma warning(disable : 4996) // visual studio 2013 또는 그 이상을 사용하지 않는다면 필요없음

#define NUM 50

int box[NUM];

void SetSock() // 상자 안에 양말 넣기
{
    srand((unsigned)time(NULL));
    int a = rand() % NUM;
    printf("%d\n", a); // 확인용 출력
    for (int i = 0; i < NUM; i++)
    {
        if (i == a)
        {
            box[i] = 11; // 양말이 있는 상자
        }
        else
        {
            box[i] = 10; // 양말이 없는 상자
        }
    }
}

int BoxSum(int a, int b) // 상자들의 무게의 합
{
    int w = 0;
    for (int i = a; i < b; i++)
    {
        w += box[i];
    }
    return w;
}

void FindSock(int a, int b)
{
    int n = b - a; // 개수
    int delta = n / 3 + 1; // 한 묶음의 상자 개수

    int boxSum1 = BoxSum(a, a + delta);
    int boxSum2 = BoxSum(a + delta, a + 2 * delta);

    if (n == 1)
    {
        printf("ans : %d\n", a); // 답 출력
        return;
    }

    if (boxSum1 == boxSum2) // 첫번째 상자들과 두번째 상자들의 무게가 같다면
    {
        FindSock(a + 2 * delta, b);
        return;
    }
    else if (boxSum1 > boxSum2) // 첫번째 상자들이 무겁다면
    {
        FindSock(a, a + delta);
        return;
    }
    else // 두번째 상자들이 무겁다면
    {
        FindSock(a + delta, a + 2 * delta);
        return;
    }
}

int main()
{
    SetSock();
    FindSock(0, NUM);
}
my maps!
currently working
https://osu.ppy.sh/s/601185
User avatar
Global Moderator
2,444 posts
Offline
그러고보니 제쪽이 문제 자체를 잘못 이해하고 답변했네요. 저경우에는 제가 답변한대로는 결과가 안나옵니다.
(25, 25같이 같은 숫자의 경우에는 차이가 나겠지만, 12, 13같은 경우에는 무게가 121, 130 혹은 120, 131가 나와서 갯수가 적은쪽이 무조건 가벼움)

A BCDe님이 말하신대로 하면 결과가 나올겁니다.

collapsed text
양말이 들어있는 상자가 어느쪽에 있냐에 따라서 아래와 같이 되니

171, 170, 160
170, 171, 160
170, 170, 161

첫번째와 두번째 묶음을 비교해서 같다면 세번째 묶음에 양말이 있는 상자가 있는거고
나머지의 경우에는 더 무게가 많이 나가는쪽이 양말이 있는거라고 보면 되니까요

만약 11번째 상자에 양말이 있다는 전제하에 계산해보면 이런식으로 될겁니다.

Code:
17(171), 17(170), 16(160)
6(60), 6(61), 5(51)
3(20), 3(21), 0(30)
1(10), 1(11), 1(10)


도데체 왜 전 상자무게를 1로 보고 양말 무게로 10으로 본걸까요. (본격 상자보다 양말이 더 무거운 이상한 선물)

Fly away!

User avatar
Rhythm Incarnate
816 posts
Offline
결국 제출 못하고 0점 받았지맘 답변 감사합니다

다음엔 꼭 일찍 물어보는걸로....ㅠㅠ
Reply 13 posts

Users browsing this forum: None


Jump to: