애드센스와이드


[SRM 478] 키위 주스 TopCoder

나만 어려운건지 문제와 예시를 봐도 도저히 이해가 안가서 상세 정리해놓음.

내가 이해한 핵심 결론은 fromId 병의 주스를 toId 병의 주스로 부어 넣는데 toId 병이 꽉 차면 더 안 붓는다는 것임.

헤깔린 이유는 fromId가 3이고 toId가 1와 같은 경우 때문이었음.

그냥 fromId와 toId는 1개의 병만을 지칭한다고 처음부터 이해가 되었다면 쉬웠을 것임.

책에는 'i번째의 조작은 타로가 병 fromId[i] 부터 병 toId[i]에 키위 주스를 는 것을 의미합니다.' 부분이 나에게 문제였는데
부터라는 표현이 마치 fromId[i]병 부터 순서대로 릴레이 식으로 이어 붓는다는 것 처럼 이해가 되었다.

개인적인 생각이지만 병 fromId[i]에서 병 toId[i]로 키위 주스를... 이런 식으로 썼다면 더 이해가 용이했겠다. 1:1로 부어 넣는다는 의미로 쉽게 이해된다고 생각한다.

예시 3번의 숫자 변화를 정리한 표를 사진으로 첨부해놓는다.

소스코드는 워낙 인터넷에 많아서 일단 생략한다.

3)
capacities = {14, 35, 86, 58, 25, 62}
bottles = { 6, 34, 27, 38, 9, 60}
fromId = { 1, 2, 4, 5, 3, 3, 1, 0}
toId = { 0, 1, 2, 4, 2, 5, 3, 1}
Returns : {0, 14, 65, 35, 25, 35}




Binlog.dll import C#

벡터사에서 제공하는 로그 변환 dll인 binlog.dll을 사용할 일이 있어 정리해본다.

C++로 만들어진 예제는 주어지나 나는 C#을 사용해야하므로 import를 해오는 과정에서
struct를 3번 중첩해서 가져오는 부분이 있는데 이 부분을 처리할 때 컴파일 에러는 아닌
실행상 오류가 나서 이를 해결한 과정을 아래와 같이 중요 부분만 정리해둔다.

포인트
1. struct를 가져올 때는 명시적으로 가져오고 offset을 설정하여 그 크기를 고정해두자.
2. dll import 시 struct는 포인터로 선언되어 있으므로 ref를 사용한다.
3. struct를 main함수에서 정의할 때 sizeOf 처리는 아래와 같이 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        /* setup object headers */
        appTrigger.mHeader.mBase.mSignature = BL_OBJ_SIGNATURE;
        appTrigger.mHeader.mBase.mHeaderSize = sizeof( appTrigger.mHeader);
        appTrigger.mHeader.mBase.mHeaderVersion = 1;
        appTrigger.mHeader.mBase.mObjectSize = sizeof( VBLAppTrigger);
        appTrigger.mHeader.mBase.mObjectType = BL_OBJ_TYPE_APP_TRIGGER;
        appTrigger.mHeader.mObjectFlags = BL_OBJ_FLAG_TIME_ONE_NANS;
 
        /* setup object headers */
        appTrigger.mHeader.mBase.mSignature = BL_OBJ_SIGNATURE;
        appTrigger.mHeader.mBase.mHeaderSize = (ushort)Marshal.SizeOf(appTrigger.mHeader);
        appTrigger.mHeader.mBase.mHeaderVersion = 1;
        appTrigger.mHeader.mBase.mObjectSize = (uint)Marshal.SizeOf(typeof(VBLAppTrigger));
        appTrigger.mHeader.mBase.mObjectType = BL_OBJ_TYPE_APP_TRIGGER;
        appTrigger.mHeader.mObjectFlags = BL_OBJ_FLAG_TIME_ONE_NANS;
cs

4. C++ --> C#으로 변환 시 주요 자료형 주의한다.


소스가 완성되면 첨부 추가 예정



7568_덩치 백준코딩

브루트 포스 문제 중 하나로 너무 어렵게 생각해서 푸는데 오래걸렸기에 그 이력을 정리해둔다.

브루트 포스는 무식하게 전부 다 대입해서 시도해보는 것을 의미하는데 (내가 받아 들이기엔...)

이 문제의 경우도 주어진 조건에 맞춰 이중 루프로 전부 대입해서 rank를 구하면 되는 문제였다.

헤깔린 부분은 rank를 구할 때 무게 또는 높이 중 하나가 더 높으면 동등하다는 부분이었다.

알고리즘 구현엔 실제로는 " x>p 그리고 y>q " 이 조건만 처리하면 되는데
괜히 꼬아서 생각해서 다른 조건을 더 걸려고 하다보니 초반에 어려워졌다.

이중 for문을 돌리면서 위 조건일 때 rank++만 해주면 간단히 구해지는 문제 였다.



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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace _7568_덩치
{
    class Program
    {
        static void Main(string[] args)
        {
            int N = int.Parse(Console.ReadLine());
            char sp = ' ';
            node[] xy = new node[N];
 
 
            for (int i = 0; i < N; i++)
            {
                string[] xyList = Console.ReadLine().Split(sp);
                xy[i].weight = int.Parse(xyList[0]);
                xy[i].height = int.Parse(xyList[1]);
                xy[i].rank = 1;
                //Console.WriteLine("{0} {1} {2}", xy[i].weight, xy[i].height, xy[i].rank);
            }
 
            for (int i = 0; i < N; i++ )
            {
                for (int j = 0; j < N; j++)
                {
                    if (xy[i].weight < xy[j].weight && xy[i].height < xy[j].height)
                    {
                        xy[i].rank++;
                        //Console.WriteLine("i [{0}], j [{1}], rank [{2}]", i, j, xy[i].rank);
                    }
                }
            }
 
            string result = "";
 
            for (int i = 0; i < N; i++)
            {
                result += xy[i].rank;
                result += " ";
            }
 
            Console.WriteLine("{0}", result);
 
        }
    }
 
    public struct node
    {
        public int weight; public int height; public int rank;
    }
}
 
cs

10870_피보나치_수_5 백준코딩

어려운 문제는 아닌데 재귀함수를 이용한 피보나치 수 알고리즘을 정리해두고자 포스팅 한다.



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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace _10870_피보나치_수_5
{
    class Program
    {
        static void Main(string[] args)
        {
            int inputData = int.Parse(Console.ReadLine());
            Console.WriteLine("{0}", pivonachiRecursive(inputData));
        }
 
        public static int pivonachiRecursive(int num)
        {
            if (num == 0)
                return 0;
            else if (num == 1)
                return 1;
            else
                return pivonachiRecursive(num - 1+ pivonachiRecursive(num - 2);
        }
    }
}
 
cs

1002_터렛 백준코딩


원의 관계에 대해 집중해야 풀기 용이함.

생각보다 알고리즘은 간단함. 다만, 수학적 지식이 있으면 더 쉽게 풀었을 것 같음.

아래 주석을 참고하면 풀이가 용이함.


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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace _1002_터렛
{
    class Program
    {
        static void Main(string[] args)
        {
            /* 두개의 원이 주어진다. 터렛 기준으로 측정 가능한 레이더 범위라고 생각하면 이해가 쉬운데 원 내부가 아닌 원 외곽만 측정 가능 범위라고 보면 됨.
             * 즉, 두개의 원이 교차하는 지점은 최대 2개, 원이 교접하면 1개, 원이 만나지 않으면 0개, 원이 정확히 겹치면 무한대(-1)이 된다.
             *
             * 1. 내접 : 1 => d = r1 - r2 (r1>r2) => d = | r1 - r2 |
             * 2. 외접 : 1 => d = r1 + r2
             * 3-1. 한 원이 다른 원 안에 있음 (중심점 달라도 됨) : 0  => d > r1 + r2 
             * 3-3. 원과 원이 떨어져 있음 : 0 => d < r1-r2 (r1>r2) => d < | r1-r2 |
             * 3-2. 동심원 (중심점 같고 r다름) : 0 
             * 4. 두 원 일치 : -1
             * 5. 그외 : 2
             * 
             */
            char sp = ' ';
            int inputDataCnt = int.Parse(Console.ReadLine());
            for (int i = 0; i < inputDataCnt; i++)
            {
                string[] inputData = Console.ReadLine().Split(sp);
                int x1 = int.Parse(inputData[0]), y1 = int.Parse(inputData[1]),
                    r1 = int.Parse(inputData[2]), x2 = int.Parse(inputData[3]),
                    y2 = int.Parse(inputData[4]), r2 = int.Parse(inputData[5]);
                //Console.WriteLine("x1: [{0}], y1: [{1}], r1: [{2}], x2: [{3}], y2: [{4}], r2: [{5}]", x1, y1, r1, x2, y2, r2);
                //Console.WriteLine("r1 + r2: [{0}]", r1 + r2);
                double distanceCir2Cir = 0;
                int pos = 999;
 
                //distanceCir2Cir = Math.Sqrt(Math.Abs(x1 - x2)) + Math.Sqrt(Math.Abs(y1 - y2));
                distanceCir2Cir = Math.Sqrt((Math.Abs(x1 - x2) * Math.Abs(x1 - x2)) + (Math.Abs(y1 - y2) * Math.Abs(y1 - y2)));
                //Console.WriteLine("distanceCir2Cir: [{0}]", distanceCir2Cir);
 
                if (x1 == x2 && y1 == y2 && r1 == r2)
                    pos = -1;
                else if (distanceCir2Cir == r1 + r2) // 외접
                    pos = 1;
                else if (distanceCir2Cir == Math.Abs(r1 - r2)) // 내접
                    pos = 1;
                else if (distanceCir2Cir > r1 + r2) // 두 원이 안만나고 서로 떨어짐 (외부)
                    pos = 0;
                else if (distanceCir2Cir < Math.Abs(r1 - r2)) // 두 원이 안만나고 내부에 있음
                    pos = 0;
                else // 그외 모든 경우 (두 원이 접하지 않고 서로 교차할 경우)
                    pos = 2;
                
                Console.WriteLine("{0}", pos);
            }
        }
    }
}
 
cs


3053_택시_기하학 백준코딩

유클리드 기하학의 원 넓이 구하기 = r * r * pi
택시 기하학의 원 넓이 구하기 = (r * r * 1/2) * 4 ; 반지름 r을 두 변으로 하는 이등변삼각형의 넓이를 구한뒤 이를 4번 더함

택시 기하학은 비유클리드 기하학의 대표적 예로 상세 내용은 아래 블로그 참고
https://m.blog.naver.com/alwaysneoi/100172516753

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace _3053_택시_기하학
{
    class Program
    {
        static void Main(string[] args)
        {
            int r = int.Parse(Console.ReadLine());
 
            double areaUcl = r * r * Math.PI;
            Console.WriteLine("{0}", areaUcl);
 
            double areaTaxi = r * r * 0.5 * 4;
            Console.WriteLine("{0}", areaTaxi);
        }
    }
}
 
cs

1085_직사각형에서_탈출 백준코딩

좌측과 상단측만 가까운 것을 생각해서 처음 시도에서 틀렸는데,
우측과 하단측이 가까운 경우도 답이 될 수 있음.

반례는 많겠지만 아래 소스코드의 코멘트의 반례 2개를 만족하면 됨.



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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
namespace _1085_직사각형에서_탈출
{
    class Program
    {
        static void Main(string[] args)
        {
            /* x,y,w,h가 있다. 좌하단 점은 (0,0)이고 우상단 점은 (w,h)이다. 이는 사각형을 표현한다.
             * 여기서 (x,y)는 사각형 내 좌표점이다. 
             * 이 점에서 사각형의 한 변까지 최소거리를 구한다.
             * 단, 위와 우측만이 아닌 아래, 좌측도 포함이다.
             * 반례: 6 2 10 3 => 1 (우측으로 1칸) 
             *       1 2 10 4 => 1 (좌측으로 1칸)
             */
            char sp = ' ';
            string[] inputData = Console.ReadLine().Split(sp);
            int x = int.Parse(inputData[0]), y = int.Parse(inputData[1]), 
                w = int.Parse(inputData[2]), h = int.Parse(inputData[3]);
 
            int wxCha = 0, hyCha = 0;
 
            wxCha = w - x;
            hyCha = h - y;
 
            int answerX = 0, answerY = 0;
            if (wxCha < x )
            {
                answerX = wxCha;
            }
            else if (wxCha >= x)
            {
                answerX = x;
            }
            if (hyCha < y)
            {
                answerY = hyCha;
            }
            else if (hyCha >= y)
            {
                answerY = y;
            }
 
            if (answerX < answerY)
                Console.WriteLine("{0}", answerX);
            else if (answerX >= answerY)
                Console.WriteLine("{0}", answerY);
        }
    }
}
 
cs


9020_골드바흐의_추측 백준코딩


C#으로 통과한 소스를 기록으로 남겨둔다.

핵심:

1) 에라토스테네스의 체로 소수를 구할 때 for문의 종료 시점을 num이 아닌 Math.Sqrt(num)으로 해서 시도 횟수를 줄인다.
2) 소수 끼리 더할 때 이중 for문을 쓰지 말것, 단일 for문을 쓰고 합이 num인 소수 p의 다른 소수는 num - p이다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
namespace _9020_골드바흐의_추측
{
class Program
{
static void Main(string[] args)
{
int testCase = int.Parse(Console.ReadLine());
for (int i = 0; i < testCase; i++)
{
int testValue = int.Parse(Console.ReadLine());
CalculateGoldbach(testValue);
}
}
static void CalculateGoldbach(int num)
{
// 입력값 보다 작은 소수들을 모두 구함
// 이중 for문을 돌려서 구한 소수들끼리 더함 (for문 작성 시 처음 인수가 작은 값이 되도록 비교할 것)
// if 입력값 - 소수들끼리 더한 값 == 0, a = 소수1, b = 소수2
int[] arr = new int[num + 1];
int i = 2;
for (i = 2; i <= num; i++)
{
arr[i] = i;
}
for (i = 2; i <= Math.Sqrt(num); i++)
{
if (arr[i] == 0)
continue;
for (int j = i + i; j <= num; j += i)
arr[j] = 0;
}
//for (i = 2; i <= num; i++)
//{
// Console.WriteLine("prime: [{0}]",arr[i]);
//}
/* 반례 10 => 2 3 5 7
* 2 2, 2 3, 2 5, 2 7, 3 5, 3 7, 5 5
*/
int cha = 0;
ArrayList arrPrime1 = new ArrayList();
ArrayList arrPrime2 = new ArrayList();
ArrayList arrCha = new ArrayList();
for (i = 2; i <= num; i++)
{
if (arr[i] != 0 && arr[num-arr[i]] !=0)
{
//Console.WriteLine("rank {0}", Math.Abs(arr[i] - arr[j]));
cha = Math.Abs(arr[i] - (num - arr[i]));
//Console.WriteLine("| {0} - {1} | = {2}", arr[i], num - arr[i], cha);
arrPrime1.Add(arr[i]);
arrPrime2.Add(num - arr[i]);
arrCha.Add(cha);
}
}
//for (i = 2; i <= num; i++)
//{
// if (arr[i] != 0)
// {
// for (int j = 2; j <= num; j++)
// {
// //Console.WriteLine("rank {0}", Math.Abs(arr[i] - arr[j]));
// if (arr[i] + arr[j] == num)
// {
// cha = Math.Abs(arr[i] - arr[j]);
// //Console.WriteLine("| {0} - {1} | = {2}", arr[i], arr[j], cha);
// arrPrime1.Add(arr[i]);
// arrPrime2.Add(arr[j]);
// arrCha.Add(cha);
// }
// }
// }
//}
int minCha = (int)arrCha[0];
int minChaIdx = 0;
for (i=0;i<arrCha.Count;i++)
{
if(minCha > (int)arrCha[i])
{
minCha = (int)arrCha[i];
minChaIdx = arrCha.IndexOf(arrCha[i]);
}
}
Console.WriteLine("{0} {1}", arrPrime1[minChaIdx], arrPrime2[minChaIdx]);
}
}
}


결과: 맞았습니다!! (메모리 115380KB, 시간 1036ms)


1330번 두 수 비교하기 백준코딩

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Baekjun_IF
{
    class Program
    {
        static void Main(string[] args)
        {
            //int inputNum, num1, num2;
 
            var inputNum = Console.ReadLine();
 
            //var num1 = inputNum.Split(' ');
 
 
            var location = inputNum.IndexOf(' '+ 1;
            var num1 = inputNum.Substring(0, location);
            //Console.WriteLine("first num {0}", num1);
 
            //Console.WriteLine("blank {0}", location);
 
            var num2 = inputNum.Substring(location, inputNum.Length - location);
            //Console.WriteLine("second num {0}", num2);
 
            if (Convert.ToInt32(num1) > Convert.ToInt32(num2))
            {
                Console.WriteLine(">");
            }
            else if (Convert.ToInt32(num1) < Convert.ToInt32(num2))
            {
                Console.WriteLine("<");
            }
            else if (Convert.ToInt32(num1) == Convert.ToInt32(num2))
            {
                Console.WriteLine("==");
            }
        }
    }
}
 
 
cs

LENOVO X230, GTX1060 3G, 400W PS로 eGPU 설정하기 IT,핸드폰

eGPU 설정을 기록해두어서 다음에 동일 실수가 없도록 하자.

- 환경
랩탑: LENOVO X230, 16GB MEM, 500GB SSD
VGA: INNO3D GTX 1060 3G
P/S: FSP 400W SFX
eGPU: GDC EXP v8.5

참고 글: https://egpu.io/forums/builds/thinkpad-x230-express-card-2-0-5-gt-s-windows-10-by-boelly/
1. BIOS 들어가서 POWER - EXPRESS CARD 설정 : GEN1 으로 변경
2. GDC카드: ATX-ON, PTD-7s 스위치 설정

3. 윈도 10 PRO 포맷
4. 포맷 후 오버워치 설치 (테스트용)
5. 안전모드 부팅
6. DDU 실행 및 INTEL, NVIDIA DRIVER 모두 제거 (중요, 둘다 제거해야 함)
7. 재부팅
8. 네트웍 연결 없이 NVIDIA 드라이버 설치 (378.81 설치함)
9. 재부팅
10. ERROR 43발생, 구글링 결과로 다운받은 배치파일 실행 후 조치
11. 제어판-장치관리자-디스플레이의 MICROSOFT VGA 어댑터(명칭 맞나? 암튼)를 사용 안함 설정
12. 재부팅
13. BIOS 셋팅 들어가서 아까 1번에서 바꾼 EXPRESS CARD 설정을 AUTO로 변경
14. 재부팅
15. WIN10 VGA 자동 업데이트 금지 설정
참고글
http://usinan.blogspot.com/2017/12/prevent-driver-update.html

16. 재부팅
17. Nvidia 제어판의 기본 그래픽 프로세서를 '고성능 NVIDIA 프로세서' 로 변경 및 FPS 게임에 최적 사양으로 설정 변경 (적절히 구글링 요망)
18. GTX1060에 외부 모니터 연결
19. 디스플레이 설정에서 외부모니터 선택 후 '다중 디스플레이'옵션에서 '확장' 선택 및 '이 디스플레이를 주 모니터로 만들기' 선택 (이를 통해 외부 모니터가 주 모니터로 됨)
20. 옵치 실행 - 플레이 (다운되지 않으면 OK)

★주의 사항
이건 모든 X230에 공통사항이라고는 말 못하겠다. 내 경우엔 그랬다고 기록 남기는 것임.
1. INTEL VGA 드라이버를 절대 설치하지 말 것. 렌더링 오류 나면서 옵치 실행 중 튕김.
2. P/S는 400W 이상이어야 할 것. 300W로 실행해보니 옵치 대기장까진 들어가지는데 겜만 들어가면 튕김.
3. WIN10 실행 상태에서 EXPRESS CARD를 바로 뽑지 말 것. 컴터 끄고 뽑거나 제어판-장치관리자 들어가서 GTX1060을 '디바이스 사용안함'을 먼저 선택 한 뒤 EXPRESS CARD를 뽑을 것.
만약 그냥 뽑으면 'VIDEO DXGKRNL FATAL ERROR' 에러를 만나야 함. 아주 슬픔.
4. 3번과 같이 GTX1060을 사용안함으로 해놓고 EXPRESS CARD를 뺐다 꼈다 해보면 핫스왑으로 인해 장치관리자에 GTX1060이 디스플레이 어댑터에 하드웨어 추가/삭제가 되는걸 볼 수 있다. 약간의 딜레이는 필요하다.
'디바이스 사용안함' 설정 없이 빼버리면 여지없이 3번처럼 FATAL 에러를 만난다.

그외 참고할만한 글의 링크를 추가해둔다.
https://hotheadfactory.com/?p=1029
https://cafe.naver.com/sharinghp.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=1546
http://forum.notebookreview.com/threads/diy-egpu-experiences.418851/
https://egpu.io/forums/builds/lenovo-thinkpad-t430s-gtx-6704gbps-ec2-exp-gdc-8-4d-win10-custom-case-shaki/(t430s사례)
https://support.microsoft.com/ko-kr/help/12376/windows-10-start-your-pc-in-safe-mode (안전모드 진입)
http://tpholic.com/xe/9831814



1 2 3 4 5 6 7 8