1월, 2017의 게시물 표시

2016/01/31 코드그라운드 2016 SCPC 예선1차 : 3N+1

https://www.codeground.org/practice/practiceProbView.do?probId=25 해석 요약 : 3N+1 문제, 함수 F를 적용시켰을 때 2^60 이하의 모든 정수들은 1로 도달할 수 있다는 게 증명되었다. 함수 F를 K 번 적용했을 때 1이 되는 숫자중 가장 큰 수와 가장 작은 수를 구하자. 생각할 것 : 1. 제일 큰 수는 2^K 2. 결국엔 2의 지수승 형태가 되어야 함수 F로 1에 도달할 수 있다. 3. 홀수*3은 (홀수)*(2+1)이므로 짝수+홀수=홀수이다. 따라서 3N+1을 한 후엔 반드시 짝수가 되게 되어있다. 4. F(c)=k가 될 수 있는 방법은 F(x)=k-1 인 숫자x가 2배가 되거나 (x-1)/3 이 된 숫자이다. F(x)=k k값에 따라 -> 나올 수 있는 x k=0 -> 1 (문제에서 이렇게 정의함) k=1 -> 2 k=2 -> 4 k=3 -> 8 k=4 -> 16 k=5 -> 32 5 이제 가지치기를 하면 된다. 각 숫자 왼쪽으로 가는 가지는 2배, 오른쪽으로 가는 가지는 3으로 나눈 나머지가 1일 경우면서 짝수일 때에만 생성되며 값은 (x-1)/3 k=6 -> 64 10 k=7 -> 128 20 3 k=8 -> 256 40 6 k=9 -> 512 85 80 13 12 k=10 -> 1024 170 (28) 160 26 (4) 24 여기서 보면 k=9 인 13에서 k=10 인 4를 계산할 수 있다. 근데 4는 k=2였던 값이고 2의 승수이므로 빼야된다. 85는 3N+1이지만 홀수니까 28이 나올 수 없다. k=11 -> 2048 341 340 320 53 52 48 k=12 -> 4096 682 680 113 640 106 104 17 96 작은 숫자만 저장하면 안된 다는걸 보여준다. 한참 전에 분기했던 두 번째로 큰 수인 52가 17이 되고 가장 작았던 48은 96이 되버린다.

2016/01/31 코드그라운드 문제 SCPC2015 예선 : 개구리 뛰기

https://www.codeground.org/practice/practiceProbView.do?probId=11 생각해볼 점 1. dynamic 알고리즘 문제 -> P+1 번 째 돌까지 가려고 할 때 최소 점프횟수는 P,P-1,P-2,... 번 째 돌까지(뛸 수 있는 거리내에 있는 돌들)중에서의 최소 점프횟수 +1이다. 2. 좌표는 1billion까지 있지만 돌 갯수는 1million이 최대니까 배열은 돌 갯수에 맞춰서 만들면 된다. 3. 거리 확인을 위해 돌의 좌표를 저장한 배열을 따로 만들어야 한다. 문제에서 정렬된 순서로 돌 좌표를 준다고 했으니 따로 정렬을 할 필요는 없다. 4. c 자체에선 bool 개념이 없어서 typedef로 유사 개념을 만들어줘야 한다. 5. 컴퓨터 본체에서 돌렸는데도 stack overflow가 떴다. 1000000개 이상 배열은 heap으로 사용해야할 것 같다. 6. 답은 찾는데 시간제한 1초를 초과해서 만점을 못 받고 있다. // 아래 기본 제공된 코드를 수정 또는 삭제하고 본인이 코드를 사용하셔도 됩니다. #include <stdio.h> #include <stdlib.h> typedef enum { false , true } bool ; int main ( void ) { /* 아래 freopen 함수는 input.txt를 read only 형식으로 열고, 표준입력(키보드) 대신 input.txt 로 부터 읽어오겠다는 의미의 코드입니다. 만약 본인 PC 에서 테스트 할 때는, 입력값을 input.txt에 저장한 후 freopen 함수를 사용하면 그 아래에서 scanf 함수를 사용하여 표준입력 대신 input.txt 파일로 부터 입력값을 읽어 올 수 있습니다. 또한, 본인 PC에서 freopen 함수를 사용하지 않고 표준입력을 사용하여 테스트하셔도 무방합니다. 단, Codeground 시스템에서 ...

2016/01/31 코드그라운드 문제 : 미궁 속의 방

https://www.codeground.org/practice/practiceProbView.do?probId=6# 생각할 점 1. 방 크기인 N이 10만까지인데 배열을 만들어서 숫자를 쓸 경우 N제곱 백억개의 배열을 만들어야하고 int가 unsigned로 선언해도 4억까지니 double 배열을 만들어야 하는데 그럴 경우 메모리를 8백억byte 사용해야 한다. 메모리 제한 256MB로는 대략 2억6천 바이트 int형의 경우 5천만 개 정도 생성할 수 있다. 배열로 풀 문제는 아니다. 2. 행과 열의 조합으로 숫자를 구해야 한다. 1~n까지 더한 값은 n*(n+1)/2이다. 행과 열을 더하면 line 번호가 나오고 그 line 전까지 나온 숫자에다가 행이나 열을 더하면 원하는 값이 나온다. 3. 정사각형을 대각선으로 나뉘는 두 개의 삼각형으로 잘라놓고 생각했을 때 아래 있는 삼각형은 위에 있는 삼각형과 대칭으로 생각할 수 있다. // 아래 기본 제공된 코드를 수정 또는 삭제하고 본인이 코드를 사용하셔도 됩니다. #include <stdio.h> int N; double room_number ( int x, int y) { int lineNum = x + y - 1 ; double result; if (lineNum > N) { x = N + 1 - x; y = N + 1 - y; lineNum = x + y - 1 ; result = (lineNum) * (lineNum - 1 ) / 2 ; if (lineNum % 2 == 1 ) { result += y; } else { result += x; } return ((N * N) - result + 1 ); } else { result = (lineNum) * (lineNum - 1 ) / 2 ; if ...

c언어 scanf로 입력 받을 때 double과 float형을 어떻게 구분해야하는지

scanf("%d",&val); 와 printf("%d",val); 을 보면 왜 & scanf에는 참조기호가 붙는지 의아해 해 본 경험이 있다. 입력을 받을 때는 입력받은 값의 포인터를 전달 받는다. 출력을 할 때는 값을 전달한다. 이 때문에 float와 double을 scanf로 입력받을 때 %f인지 %lf인지 명시해주어야 한다. 입력 받을 때는 일종의 void형 포인터를 전달받는 것으로 입력받은 값이 float인지 double인지 알 수 없다. 따라서 4byte float을 받을 때는 %f 8byte double을 받을 때는 %lf로 자료형에 대한 정보를 미리 줘야한다. printf는 값을 전달하기 때문에 자료형과 대응하는 크기를 알 수 있기 때문에 float을 출력하든 double을 출력하든 %f로 해주면 된다. 사용자 정의 함수의 경우도 입력받을 때는 마찬가지이지만 대개는 자료형이 고정되어 있다. scanf처럼 자료형이 가변적일 경우에는 포인터의 크기에 대한 정의가 필요하다. 참고 사이트http://luyin.tistory.com/276

2016/01/31 코드 그라운드 문제 : 다트 게임

https://www.codeground.org/practice/practiceProbView.do?probId=4 다트판은 원형이고 총 20개의 점수가 균등한 칸으로 나누어져 있다. 생각해야 할 점은 크게 두가지다. 1. 거리에 따라 점수가 1,2,3배 혹은 0점이나 50점으로 된 다는 것. 2. 좌표를 입력받은 뒤 원형 좌표계에서 (x,y)는 (r cosθ , r sinθ)에 대응한다는 점을 이용해서 θ가 포함되는 범위를 계산해 대응하는 점수표를 찾는다. 나는 cos함수를 이용해서 sin이 음수냐 양수이냐에 따라 구분해줬는데 tan함수를 이용하면 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 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 // 아래 기본 제공된 코드를 수정 또는 삭제하고 본인이 코드를 사용하셔도 됩니다....

2016/01/31 시사

1. 건강보험료 상한 조정 건강보험료의 최고 상한가는 7800만원 이상의 소득을 얻는 직장인들에게 239만원으로 고정되어있었다. 건강 보험은 조세가 아니라 보험이기 때문에 수입에 따라 보험료를 무작정 늘릴 수 없다고 한다. 고소득자에 대해 부의 쏠림을 완화하고 재정확보를 위해 상한가를 더 올린다는 개선안이 나왔다. 이에 따른 상한가는 약 300만원으로 조정됐다. 기사에서는 보험 가입자(직장인 증가)가 8% 늘어난 데 비해 고소득 직장인의 증가는 35% 증가했기 때문이라고 하는데 고소득 직장인의 증가는 몇백명이다. 50만*300명 약 1억5천만원정도의 추가 재정이 확보되는걸까? 2. 국채와 특수채 900조원 돌파 국채는 국가가 보증하는 채권, 특수채는 정부가 원리금 지급을 보증하는 채권으로 나중에는 국민들의 세금으로 갚아야 하는 돈 3. 미국쪽은 트럼프 대통령의 이민제한과 H1(노동)비자발급 축소로 이슈. 실리콘 밸리 및 이민자 출신 CEO들이 강하게 반대하는 중이라고 한다.

2016/01/30 PowerWorld - SDN - 스마트그리드

이미지
처음 시작은 file -> new case 제일 왼쪽에 있는 모드. 1. edit mode 모델링할 수 있다. Draw탭에서 굵은 검은선 Bus, 원형의 Generator, 화살표 Load, 두 개의 Bus를 잇는 가는 실선 Transmission Line을 그릴 수 있다. 만들고 나면 Option dialogue가 나타나는데 크게 설정할 것은 Display Information에서 orientation과 Costs의 Cost model 을 설정하면 된다. 2. run mode 에 들어가면 녹색 화살표가 나오고 tools 탭에서 녹색 화살표를 누르면 Message Log와 함께 구동된다. 전력망에 대해 잘 모르다 보니 스마트 그리드 case sample을 찾아봐야겠다. 논문 Security Enhancement of Power Systems with Smart Grid Implementation에 이미지가 나와있다.

2016/01/30 임베디드 소프트웨어 NTFS 파일시스템 지원하는 커널 설치 후 window->linux로 파일이동

구글DOC으로 보기 https://docs.google.com/document/d/1txQK6Kz01PSedmqiFDYtGKZpgzCRCUwtoEnAz56emvQ/edit?usp=sharing

2016/01/30 코드 그라운드 문제 풀 때 메모리 제한

이미지
코드 그라운드 문제에서 보면 메모리 제한이 다음과 같이 있다. -메모리 사용 제한 : heap, global, static 총계 256MB, stack 1MB 프로그램을 실행하면 운영체제는 프로그램을 위한 메모리 공간을 할당해준다. 이 메모리 공간은 stack, heap, data 영역으로 나뉜다. 1. data 영역에는 global(전역변수), static 변수가 들어간다. 프로그램 시작하자마자 크기에 맞는 영역이 할당되고, 프로그램이 종료되어야 메모리에서 해제된다. 2. stack 영역은 함수 호출시에 할당되서 함수에 대한 지역변수와 매개변수가 저장된다. 함수 호출이 끝나면 메모리에서 해제된다. 크기는 컴파일 타임에 결정된다. 3. heap 영역은 프로그래머에 의해 할당되며 크기는 런타임에 결정된다. 할당해야 할 메모리의 크기를 런타임에 결정해야하는 때 사용되는 공간이다. 이렇게 할당하는 것을 동적할당이라고 한다.  그림 출처:http://dsnight.tistory.com/50 다시 본론으로 돌아와, 만약 문제를 풀 때 int형 배열이 필요하다고 하자. main 함수에서 int 배열을 호출할 경우 stack 메모리에 배열이 할당된다. 그럼 1MB 제한에서는 얼마나 큰 배열을 선언할 수 있을까? 1MB=1048576Byte int는 4Byte이므로 262144개의 int를 선언할 수 있다. 보통 문제에서 백 만개가 넘는 배열을 선언해야 할 경우가 많기 때문에 왠만하면 동적할당, 혹은 전역변수로 선언해야 메모리 제한으로 0점 맞는 것을 해결할 수 있다. ( http://mwultong.blogspot.com/2008/01/kb-mb-gb-tb-pb-convert.html 변환기)

2016/01/30 visual studio github와 연동하기

이미지
http://stackoverflow.com/questions/19982053/how-do-i-add-an-existing-solution-to-github-from-visual-studio-2013 에 있는 내용 Open the solution in Visual Studio 2013(same on v2015, 솔루션 열기) Select File | Add to Source Control(파일-소스제어) Select the Microsoft Git Provider That creates a local GIT repository Surf to GitHub Create a new repository DO NOT SELECT Initialize this repository with a README That creates an empty repository with no Master branch Once created open the repository and copy the URL (it's on the right of the screen in the current version) Go back to Visual Studio Make sure you have the Microsoft Git Provider selected under Tools/Options/Source Control/Plug-in Selection Open Team Explorer Select Home | Unsynced Commits Enter the GitHub URL into the yellow box (use HTTPS URL, not the default shown SSH one) Click Publish Select Home | Changes Add a Commit comment Select Commit and Push from the drop down Your solution is now in GitHub 솔루션 열고 소스...

2016/01/30 코드그라운드 문제 : 시험공부

https://www.codeground.org/practice/practiceProbView.do?probId=3 정렬한 뒤 가장 큰 값들 k개만 더하면 된다. // 아래 기본 제공된 코드를 수정 또는 삭제하고 본인이 코드를 사용하셔도 됩니다. #include < stdio.h > #include < stdlib.h > int arr[ 200000 ]; static int compare( const void * a, const void * b) { if (( * ( int * )a - * ( int * )b) > 0 ) return - 1 ; else return 1 ; } int main( void ) { /* 아래 freopen 함수는 input.txt를 read only 형식으로 열고, 표준입력(키보드) 대신 input.txt 로 부터 읽어오겠다는 의미의 코드입니다. 만약 본인 PC 에서 테스트 할 때는, 입력값을 input.txt에 저장한 후 freopen 함수를 사용하면 그 아래에서 scanf 함수를 사용하여 표준입력 대신 input.txt 파일로 부터 입력값을 읽어 올 수 있습니다. 또한, 본인 PC에서 freopen 함수를 사용하지 않고 표준입력을 사용하여 테스트하셔도 무방합니다. 단, Codeground 시스템에서 "제출하기" 할 때에는 반드시 freopen 함수를 지우거나 주석(//) 처리 하셔야만 합니다. */ // freopen("input.txt", "r", stdin); setbuf(stdout, NULL ); int TC; int test_case; int i, n, k,count; scanf ( "%d" , & TC); for (test_case =...

2016/01/30 시사

1. 주식투자에 여윳돈이 없을 경우 신용거래보다 주식담보대출을 할 것. 신용거래는 상환기간이 6개월 내외라 본전을 못 찾을 수도 있다. 2. 소비,투자,수출은 일자리를 창출한다. 우리 경제는 수출에 의존도가 크지만 일자리 창출에 기여하는 비율로서는 소비가 가장 큰 역할을 한다. 최근 경제상황 악화로 인해 소비 심리가 위축되면서 일자리가 줄어들 것으로 보인다. 3. 반덤핑 관세란 외국 물품이 국내 시장가격 이하로 수입되서 국내 산업이 피해를 받거나 받을 위험이 있는 경우 국내 산업을 지키기 위해 외국 물품과 국내 품목의 덤핑 차액 이하를 관세로 추가 부과하는 것을 말한다. 트럼프 정부출범 이후 한국에서 수입하는 가소제(DOTP : 플라스틱 제조에 사용되는 화학물질)에 4.47% 반덤핑 관세를 부과하기로 했다. 4. 미국 트럼프 대통령이 무슬림 7개 국가에 대한 미국 입국 자체를 불허하는 행정명령을 내렸다. 테러리스트 모집에 도움이 되는 행정명령, 비 미국적인 처사 등등 반대하는 시위가 일어나고 있다.

2016/01/26 코드그라운드 문제 : 프로그래밍 경진대회

이건 시간초과로 40점밖에 안나온다. sorting에서 시간을 먹는데 학교에서 배운 O(n^2)알고리즘으로는 무리고 라이브러리 사용해야 하는 것 같다. c에서는 stdlib.h에 있는 qsort가 있다. static int compare(const void * a, const void * b) { return (*(int*)a - *(int*)b); } 이 함수 추가하고 for (i = 0; i < n; i++) { scanf("%d", &tmp); arr[i] = tmp; } qsort(arr, n, sizeof(int),compare);//sort + input 로 변경해주면 0.1초만에 해결된다. 이 문제에서 많이 헤맸는데 마지막 전 점수에서 동점자가 있을 경우를 생각해봐야 몇 점 이상이 우승후보가 될 수 있는지 알 수 있다. 5 6 7 7 7 같은 경우, 5 5 5 5 5 5 6 6 7 7 7 같이 동점자가 다수인 경우들을 생각해봐야한다. 정렬 후에 n~1까지 각 원소에 더해줘서 최대값을 구해야한다. 이 때 나오는 최대값에서 n을 뺀게 마지막 전에 우승 후보가 되기 위한 최소 점수이다. // 아래 기본 제공된 코드를 수정 또는 삭제하고 본인이 코드를 사용하셔도 됩니다. #include < stdio.h > int arr[ 300000 ]; int main( void ) { /* 아래 freopen 함수는 input.txt를 read only 형식으로 열고, 표준입력(키보드) 대신 input.txt 로 부터 읽어오겠다는 의미의 코드입니다. 만약 본인 PC 에서 테스트 할 때는, 입력값을 input.txt에 저장한 후 freopen 함수를 사용하면 그 아래에서 scanf 함수를 사용하여 표준입력 대신 input.txt 파일로 부터 입력값을 읽어 올 수 있습니다. 또한,...