'Tip > Life' 카테고리의 다른 글
신입 사원때 알았으면 좋았을 것들 (0) | 2020.05.11 |
---|
신입 사원때 알았으면 좋았을 것들 (0) | 2020.05.11 |
---|
AA 건전지 2개로 동작 가능 함
USB-C로 PC와 연결시 건전지 불필요
* IPAD 8세대와 연결시 동작 잘 안함
* 갤럭시 휴대폰과는 동작 잘 됨
검색 잘 하기 (0) | 2021.08.07 |
---|---|
Batch file 템플릿 (2) | 2020.12.22 |
WireShark 기초 (PCAP에서 파일 추출) (0) | 2020.11.24 |
1. Stack과 Heap 영역에 변수 생성 시간 테스트
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX_COUNT 1000000
void do_nothing_test() {
clock_t start = clock();
for (int i = 0; i < MAX_COUNT; i++)
;
printf("Empty: %f\n", ((float)(clock()-start)/CLOCKS_PER_SEC));
}
void stack_create_test() {
clock_t start = clock();
for (int i = 0; i < MAX_COUNT; i++) {
int arr[10] = { 0, };
}
printf("Stack: %f\n", ((float)(clock()-start)/CLOCKS_PER_SEC));
}
void heap_create_test() {
clock_t start = clock();
for (int i = 0; i < MAX_COUNT; i++) {
int *arr = malloc(sizeof(int)*10);
free(arr);
}
printf("Heap: %f\n", ((float)(clock()-start)/CLOCKS_PER_SEC));
}
int main(int argc, char **argv) {
do_nothing_test();
stack_create_test();
heap_create_test();
return 0;
}
결과
chobocho@Chobocho-Mint:~/github/cpp_study/src/memory$ ./a.out
Empty: 0.003636
Stack: 0.003976
Heap: 0.015938
별 그리기 (0) | 2021.06.08 |
---|---|
[C] Binary search (0) | 2020.12.06 |
Quick sort (0) | 2017.07.13 |
인터넷에서 4개의 점 이상을 지나는 휴대폰 패턴의 가지수는 모두 몇 가지인가 라는 문제롤 보고 파이썬으로 풀어 보았다.
0: 9
1: 56
2: 320
3: 1624
4: 7152
5: 26016
6: 72912
7: 140704
8: 140704
4-9 patterns count: 389112
작성코드는 아래와 같다
import time
import math
def is_valid(used_pattern, stack, max_point):
if len(stack) < max_point:
return 0
checked_point = [False] * 9
checked_point[stack[0]] = True
for i in range(1, len(stack)):
prev_x = stack[i-1] % 3
prev_y = math.floor(stack[i-1] / 3)
cur_x = stack[i] % 3
cur_y = math.floor(stack[i] / 3)
"""
0 1 2
3 4 5
6 7 8
아래와 같은 이동한 경우,
이동시 가운데 점이 기존 패턴에 포함 되지 않은 경우
유효 하지 않다.
0 <-> 2 | 0 <-> 6 | 0 <-> 8
2 <-> 8 | 6 <-> 8 | 2 <-> 6
1 <-> 7 | 3 <-> 5
예)
0 -> 1 -> 0 -> 2 : OK
0 -> 2 : Not OK
유효하지 않은 경우를 판단하기 위하여
각 버튼의 위치를 (y, x)로 나타내면 (0,0) ... (2,2) 까지이다.
0 -> 2 => (0,0) -> (0, 2)
0 -> 6 => (0,0) -> (2, 0)
여기서 문제 경우의
두 좌표의 합을 구하면 x, y가 모두 2의 배수가 된다.
그래서 아래와 같이 이동 전후의 좌표의 합이 모두 2의 배수가 되는 경우에서
Not OK 경우만 걸러 주면 된다.
0 -> 1 -> 0 -> 2 : OK
0 -> 2 : Not OK
"""
if ((prev_x + cur_x) % 2 == 0) and ((prev_y + cur_y) % 2 == 0):
mid_x = math.floor((prev_x + cur_x) / 2)
mid_y = math.floor((prev_y + cur_y) / 2)
if checked_point[mid_y * 3 + mid_x] == False:
return 0
checked_point[stack[i]] = True
return 1
def check_pattern(used_pattern, stack, max_point):
if len(stack) > max_point:
return 0
result = is_valid(used_pattern, stack, max_point)
for p in range(0, 9):
if used_pattern[p]:
continue
used_pattern[p] = True
stack.append(p)
result = result + check_pattern(used_pattern, stack, max_point)
stack.pop()
used_pattern[p] = False
return result
def main():
used_pattern = [False] * 9
stack = []
result = []
for max_point in range(1, 10):
result.append(check_pattern(used_pattern, stack, max_point))
for c in range(0, len(result)):
print ("{0}: {1}".format(c, result[c]))
print("4-9 patterns count:", sum(result[3:]))
if __name__ == '__main__':
start_time = time.time()
main()
print('\n', time.time() - start_time)
위 코드를 C로 바꾸면 아래와 같다.
#include <stdio.h>
int stack_idx;
int stack[9] = {0, };
int is_valid(int used) {
int checked = 0;
if (stack_idx < 4) {
return 0;
}
checked |= 1 << stack[0];
for (int i = 1; i < stack_idx; i++) {
int prev_x = stack[i-1] % 3;
int prev_y = stack[i-1] / 3;
int cur_x = stack[i] % 3;
int cur_y = stack[i] / 3;
if (((prev_x + cur_x) % 2 == 0) &&
((prev_y + cur_y) % 2 == 0)) {
int mid_x = (prev_x + cur_x) / 2;
int mid_y = (prev_y + cur_y) / 2;
int pos = mid_y*3 + mid_x;
if (!(checked & (1 << pos))) {
return 0;
}
}
checked |= (1 << stack[i]);
}
return 1;
}
int check_pattern(int used) {
int result = 0;
if (stack_idx == 10) {
return 0;
}
result = is_valid(used);
for (int i = 0; i < 9; i++) {
if (used & (1 << i)) {
continue;
}
stack[stack_idx++] = i;
result += check_pattern(used | (1 << i));
--stack_idx;
}
return result;
}
int main(int argc, char **argv) {
printf("%d\n", check_pattern(0));
return 0;
}
생일 문제 (0) | 2021.06.21 |
---|---|
[Python] 1^1 + 2^2 + ... + 10000^10000 의 결과 중 끝 50자리 출력하기 (0) | 2021.01.17 |
[Python] 폴더 안의 파일 이름 검색하기 (0) | 2020.10.28 |
Youtube에서 3D 프로그래밍 관련 괜찮은 자료가 있어서 정리를 해 둡니다.
"高校数学とJavaScriptだけ。FPSの作り方 #1【ゲームプログラミング】【ゲーム開発】"
라는 제목의 강의 입니다. 강의 내용을 압축해 두어서, 생략이 많네요;;;
[Javascript] 좋은 글 링크 모음 (0) | 2021.10.16 |
---|---|
[Javascript] 자바스크립트 테트리스 만들기 (Javascript Tetris 만들기) (0) | 2020.09.23 |
[Javascript] 안드로이드 테트리스 만들기 (Android Tetris 만들기) (2) | 2020.09.10 |
인터넷 커뮤티니에서 본 모대학 수학문제를 풀어 보았다.
약간 변경해서, 1^1 + 2^2 + ... + 10000^10000 의 결과 중 끝 50자리를 출력하는 형식으로 바꿔보았다.
from multiprocessing import Pool
import time
MAX_COUNT = 10**50
def mypower(num):
result = 1
for i in range(num):
result = result * num
if result < MAX_COUNT:
continue
result = result % MAX_COUNT
return result
def get_sum(num):
assert num > 0
numbers = [i for i in range(1, num+1)]
assert len(numbers) == num
pool = Pool(processes=4)
return sum(list(pool.map(mypower, numbers))) % MAX_COUNT
if __name__ == '__main__':
start_time = time.time()
print(get_sum(10000))
print(time.time() - start_time)
16026394753230301057223656223127837280816237204500
3.0160417556762695
[Python/C] 휴대폰 패턴의 가지수 (0) | 2021.02.21 |
---|---|
[Python] 폴더 안의 파일 이름 검색하기 (0) | 2020.10.28 |
[Pygame] Paper Plane Game 만들기 (0) | 2020.08.25 |
2021년 새해 연휴기간 만들어 본 지뢰 찾기 입니다.
1. 안드로이드 지뢰 찾기 소스 코드
github.com/chobocho/minesweeper
2. 동작화면
2.1 플레이 스토어 다운로드 링크
play.google.com/store/apps/details?id=com.chobocho.minesweeper
3. UML
4. 어떻게 만들었나
4.1 게임 요구 사항 정리하기
대부분 한번은 해보았을 지뢰찾기 규칙은 대부분 알기에 아래와 간단히 개발 바운더리를 정하였습니다.
1. 구현목표 2.2 게임의 구성 |
5. 설계 하기
5.1 UML
먼저 게임의 상태를 IDLE / PLAY / PAUSE / WIN / GAMEOVER 로 정의 하고,
이를 반영하여 UML를 그리면 위와 같습니다.
Play상태에서 지뢰를 모두 찾거나, 혹은 지뢰를 누른 경우,
Game State를 Win State 또는 Game over state 상태로 변경하기 위하여,
위와 같이 NotifyCallBack interface를 PLAY state가 가지도록 합니다.
package com.chobocho.minesweeper;
public interface MineSweeperNotifyCallback {
public void setWinState();
public void setGameOverState();
}
6. 구현 하기
6.1 Tile 클래스 구현
6.1.1 Tile 클래스
6.1.2 Test code 만들기
6.2 Board 클래스 수현
6.2.1 Board 클래스
6.2.2 Test code 만들기
[Android] Build error 대응 (0) | 2023.01.26 |
---|---|
[Termux] PC에서 Jupyter notebook 접속 하기 (0) | 2020.11.01 |
[Termux] SSH port forwarding (0) | 2020.10.28 |
@REM batch file script
@REM _________________________________________________________________________
@REM /
@REM | REM 주석문을 위한 명령어.
@REM +-------------------------------------------------------------------------
@REM |
@REM | @를 붙여주어야 다시 화면에 나타나지 않는다.
@REM |
@REM | ECHO 의미 그대로 화면에 명령어를 보여준다.
@REM | echo Hello, World!
@REM |
@REM | Hello, World!
@REM |
@REM +-------------------------------------------------------------------------
@REM | CLS 화면을 깨끗하게 지워준다
@REM +-------------------------------------------------------------------------
@REM | PAUSE 아무키나 누를떄 까지 잠시 실행을 중단한다.
@REM +-------------------------------------------------------------------------
@REM | IF C의 IF와 비슷하다.
@REM |
@REM | IF CONDITION == end GOTO END
@REM +-------------------------------------------------------------------------
@REM | GOTO 지정된 LABEL로 점프를 한다.
@REM |
@REM | GOTO END
@REM |
@REM | data.txt 파일이 존재하면 EXECUTE로 점프
@REM | IF EXIST data.txt GOTO EXECUTE
@REM |
@REM +-------------------------------------------------------------------------
@REM | 5초간 대기
@REM |
@REM | timeout /t 5
@REM +-------------------------------------------------------------------------
@REM | https://chobocho.tistory.com
@REM +-------------------------------------------------------------------------
@echo off
echo ######
echo # # ## ##### #### # #
echo # # # # # # # # #
echo ###### # # # # ######
echo # # ###### # # # #
echo # # # # # # # # #
echo ###### # # # #### # #
Xbox 4세대 컨트롤러 사용기 (0) | 2021.04.15 |
---|---|
WireShark 기초 (PCAP에서 파일 추출) (0) | 2020.11.24 |
대량의 파일 지우기 (0) | 2020.09.22 |
이진검색 설명:
ko.wikipedia.org/wiki/%EC%9D%B4%EC%A7%84_%EA%B2%80%EC%83%89_%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98
#include <stdio.h>
#include <assert.h>
/*
* high must be length of arr -1
* /
int binary_search(int value, int low, int high, int* arr) {
while (low <= high) {
int mid = (low+high)/2;
if (arr[mid] == value) {
return mid;
} else if (arr[mid] < value) {
low = mid+1;
} else {
high = mid-1;
}
}
return -1;
}
/*
* high must be length of arr -1
* /
int binary_search_recursive(int value, int low, int high, int *arr) {
if (low > high) return -1;
int mid = (low + high) / 2;
if (arr[mid] == value) {
return mid;
} else if (arr[mid] < value) {
return binary_search_recursive(value, mid+1, high, arr);
} else {
return binary_search_recursive(value, low, mid-1, arr);
}
}
void test() {
int number[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
int arr_size = (int) sizeof(number)/sizeof(int);
assert(binary_search(11, 0, arr_size-1, number) == 11);
assert(binary_search(2, 0, arr_size-1, number) == 2);
assert(binary_search(12, 0, arr_size-1, number) == -1);
assert(binary_search_recursive(11, 0, arr_size-1, number) == 11);
assert(binary_search_recursive(2, 0, arr_size-1, number) == 2);
assert(binary_search_recursive(12, 0, arr_size-1, number) == -1);
}
int main(int argc, char **argv) {
test();
return 0;
}
Stack과 Heap (0) | 2021.02.25 |
---|---|
Quick sort (0) | 2017.07.13 |
Bit 연산 정리 (0) | 2016.08.20 |
1. WireShark로 통신 패킷을 캡여하여, PCAP 파일로 저장한다
2. WireShark으로 저장한 파일을 연다
3. HTTP object를 추출 한다
4. 이미지 파일을 저장한다
→ left.png 를 선택한 다음 저장 버튼을 누른다
5. 저장된 파일을 확인한다
Batch file 템플릿 (2) | 2020.12.22 |
---|---|
대량의 파일 지우기 (0) | 2020.09.22 |
금주의 무료 게임 : 어쌔신 크리드 신디케이트 (~ 2020.02.28 까지) (0) | 2020.02.22 |