[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
Q1. mov rax, [a] 를 통해 변수 a의 값을 rax에 할당하였습니다. 디버깅 모드-레지스터창에서는 rax의 값이 0x443333...으로 나와습니다. 메모리창의 a의 값은 0x11, 0x22, ... 의 순서인데 왜 뒤집어진건지 궁금합니다! Q2. Q1과 이어집니다만, a. 16진수 상수를 레지스터에 할당하고 레지스터창을 보면 입력한 값 그대로 들어가 있는 것을 확인하였습니다. b. 16진수 상수를 변수에 넣은 경우 메모리창을 보면 입력한 값의 순서가 뒤집어져있는 것 같습니다. 어떤 원리가 있는건지 궁금합니다. ex) mov [a], byte 0xef mov [a], word 0xabcd 예상 >> ab, cd, 22, 33, ... 실제 >> cd, ab, 22, 33, ... 이 저장 방식이 이해가 되지 않습니다...! 감사합니다.
안녕하세요 강사님. "몇분 뒤에 구름이 뜰지" 라는 대목에서 거리라고 판단해서 한 방향으로 진행되는 bfs로 문제를 풀었습니다. 2차원 배열이 각각 100으로 최대 10000의 시간복잡도라 해당 문제에서는 큰 문제가 없었는데요. 만약 범위가 좀 크다면 큐를 사용한 bfs 탐색이 강사님 풀이보다 성능이 떨어질까요? http://boj.kr/a2429464a2434d418885752a322f7880
warning과 함께 return1로 나옵니다. 어떻게 function address를 출력할 수 있을까요? compiler 문제같고 stackoverflow 찾아보니 매우 코드가 복잡해지던데 그런 방법들밖에 없겠죠?ㅠㅠ warning: address of function 'func' will always evaluate to 'true' [-Wpointer-bool-conversion] #include <iostream> using namespace std; int func() { return 5; } int main() { printf("%p \n", func); // 잘나옴 cout << func << endl; // 안나옴 return 0; }
2-b질문입니다. 1.2분 29초에 y가 가로이고 x가 세로라고 하셨는데 그걸 어떻게 알아요? 2.사진에서 n이 10이고 m이 8로 받아져있는데요. 왜 y가 10까지 돌아야 하는데 왜 8에서 멈추나요? import sys sys.stdin = open('input.txt', 'r') from collections import deque testcase=int(input()) n,m,k=map(int,input().split()) # print(n,m,k) # grid=[list(map(int,input().split())) for _ in range(m)] grid2=[[0]*n for _ in range(m)] visited=[[0]*n for _ in range(m)] for _ in range(k): x,y=map(int,input().split()) grid2[y][x]=1 # for i in range(m): # print(grid2[i]) dxs=[-1,0,1,0] dys=[0,-1,0,1] Q=deque() def in_range(x,y): return 0<=x and 0<=y and x<n and y<n for y in range(n):#가로 for x in range(m):#세로 if grid2[y][x]==1: if visited[y][x]==0: Q.append((y,x)) visited[y][x] = 1 while Q: y,x=Q.popleft() for dx,dy in zip(dxs,dys): nx=dx+y ny=dy+x if not in_range(ny,nx): continue if visited[ny][nx]==1: continue if visited[ny][nx]==0 and grid2[ny][nx]==1: visited[ny][nx] =1 for i in range(m): print(visited[i])
안녕하세요. 2583번 문제에서 예제가 왜 5 7 3 0 2 4 4 1 1 2 5 4 0 6 2 이렇게 받는지 잘 모르겠습니다ㅠㅠ 그리고 for(int i = 0; i < k; i++) { cin >> x1 >> y1 >> x2 >> y2; for(int x = x1; x < x2; x++) { for(int y = y1; y < y2; y++) { a[y][x] = 1; } } } cin 으로 x1 y1 x2 y2 받는 줄 아래에 왜 x가 x2랑 엮이고 y가 y2랑 엮이는지 잘 모르겠습니다ㅠㅠ 문제 풀기전에 예제입력&예제출력이 왜 이렇게 나오나 먼저 좀 생각을 해보고 코드 작성하는데 한참을 들여다 봤는데 잘 이해가 안되니 도저히 감이 안와서 이렇게 여쭙니다.
[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
루키스님께서 해주시는 강의 귀에 쏙쏙 들어와서 항상 감사의 말을 먼저 드립니다. 루키스님의 강의 중 터미널 창이 매우 깔끔하게 촘촘히 박혀있으신데 제 터미널창은 세로로 길쭉하여 결국 코드에 TILE뒤 << " "; 이런 식으로 억지로 띄워썼습니다. 혹시 이 방법 말고도 다른 방법이 있으신지 견식을 여쭙고자 합니다. 가르쳐 주신다면 정말 감사하겠습니다.
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
class TestClass { public: void Init() { cout << "CTestClass::Init()" << endl; } int mmmi; }; int main() { TestClass* pi = nullptr; pi->Init(); // 정상 실행 pi->mmmi = 10; // 에러 } 안녕하세요. 강의 잘 듣고 있습니다. 위와 같은 경우에 객체가 생성되지 않은 상태에서 멤버변수에 접근 되지 않는 건 이해가 가는데 함수는 호출이 정상적으로 됩니다. 설명 좀 부탁드립니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. #include <iostream> int arr[10]; int main() { //freopen("input.txt.txt","rt",stdin); char num[101]; int i; int tmp; int max = 0; int Smax; scanf("%s", &num); for(i=0; num[i]!= '\0'; i++) { tmp = num[i] - 48; arr[tmp]++; } for(i=0; i<10; i++) { if(arr[i]>=max) { max = arr[i]; Smax = i; } } printf("%d\n",Smax); return 0; } 왜 빵점만 나오는 거죠? 어디가 틀린 건가요ㅠㅠ?
[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
Overlapped 방식은 비동기 + 논블로킹 이고 이전 예제 WSASelectEvent를 이용한 예제는 동기 + 논블로킹 으로 이해 했습니다. Overlapped의 로직 흐름 은 while문 진입 후 Event방식의 경우 WSARecv의 반환값이 SOCKET_ERROR일때 WSAGetLastError()가 WSA_IO_PENDING이라면 Sleep 혹은 WSAWaitForMultipleEvents으로 대기하다가 콜백방식이면 깨워서 처리, 이벤트방식이면 시그널되었으므로 이후 다음 코드 실행 Select의 로직 흐름 은 while문 진입 후 WSAWaitForMultipleEvents로 대기 후 시그널되면 인덱스정보로 세션의 위치를 알아낸 후 해당 세션의 소켓을 통해 NetworkEvent를 확인해서 Accept인지 Recv플래그를 통해 적절한 처리 이렇게 정리하고 나니 결국 Overlapped는 Recv를 먼저 실행한 후 대기하는 것이고 Select는 대기한 후 Recv하는 것이구나 라는 생각이 들었고, 처음에 보여주신 블로킹/논블로킹, 동기/비동기에 관한 그림으로 볼 때 Select와 Overlapped 모두 Sync-NonBlocking과 같이 동작하는게 아닌가 하는 생각이 들었습니다. 왜냐하면 INFINITE로 두면 반환할때까지 Blocking 방식처럼 동작할 것이라고 생각했고, INFINITE가 아닌 Timeout을 주면 주기적으로 확인한다는 것이므로 Sync-NonBloking처럼 동작한다고 생각했습니다. 제가 생각한 것이 맞는지 궁금합니다.
string bufferflush; getline(cin, bufferflush); 이 부분에서 질문이 있는데요. 이 부분을 제가 이해하기로는 cin을 수행할 때 \n부분 전까지만 입력을 받고 변수에 할당한 후 \n은 그대로 cin 입력 버퍼에 남기 때문에 저걸 없애기 위해서 string bufferflush를 선언한 후 getline(cin, bufferflush)를 수행한다고 이해가 되는데요. 제가 알기로는 cin.ignore()도 입력 버퍼를 한 개 지우는 역할을 한다고 들었는데 그냥 cin.ignore()로 대체하면 두 줄짜리 코드를 그냥 간단하게 한 줄로 끝낼 수 있는데 이게 더 효율적이지 않나 싶어서 질문을 드립니다.
같은 코드인데, 한번은 array(배열)로, 한번은 vector로 두었습니다. array로 했을 때는 4번예제에서 time_limit이 났는데 vector로 했을 때는 다 success였습니다. 같은 경우엔 array가 더 빠른거 아닌가요? 왜 이러죠 #include <iostream> #include <vector> int main(void) { int n, k, max, sum = 0; std::vector<int> tem(100001); scanf("%d %d", &n, &k); tem[0] = 0; for (int i = 1; i <= n; i++) { scanf("%d", &tem[i]); sum += tem[i]; if (i == k) max = sum; else if (i >= k) { sum -= tem[i - k]; if (sum > max) max = sum; } } printf("%d", max); return 0; } #include <iostream> int main(void) { int n, k, max, sum = 0; int tem[100001]; freopen("input.txt", "rd", stdin); scanf("%d %d", &n, &k); tem[0] = 0; for (int i = 1; i <= n; i++) { scanf("%d", &tem[i]); sum += tem[i]; if (i == k) max = sum; else if (i >= k) { sum -= tem[i - k]; if (sum > max) max = sum; } } printf("%d", max); return 0; }
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
포인터와 배열 기반 문자열과 둘의 차이에 대해, 제가 이해한 것이 맞는지 확인 해 주실 수 있으신가요? 항상 감사드립니다. [ 포인터 vs 배열 ] 포인터를 이용한 문자열 const char test1 = “Hello World”; * “Hello World”는 데이터 영역(.rodata)에 배열의 형태로 할당된다. 포인터 test1은 원본 배열 첫 번째 요소인 ‘H’의 주소를 가진다. .rodata에 존재하므로 문자열의 각 요소를 수정할 수 없다. 배열을 이용한 문자열 char test2[ ] = “Hello World”; 미리 데이터 영역에 할당된 “Hello World”의 요소를 각각 복사하여 새로운 배열이 할당된다. 배열 이름 test2는 복사된 배열 첫 번째 요소인 ‘H’의 주소를 가진다. 복사된 배열이므로 문자열의 각 요소를 수정할 수 있다. 결론, 포인터와 배열의 차이 배열과 포인터는 본질적으로 다르다. 배열의 이름이 포인터처럼 사용되지만, 포인터가 오직 어떠한 대상을 가리키는 고정 크기의 주소만 가지고 있는 반면, 배열은 이름이 포인터로 동작할 수 있을 뿐 본질은 변수의 모임이라는 여러 바구니로 이루어져 있기 때문이다. 따라서 배열의 크기는 포인터와 달리 타입과 길이에 의해 달라진다.
안녕하세요. 질문 하나가 있습니다. adj[0].push_back(1); adj[0].push_back(2); adj[0].push_back(3); 만약 위 코드 처럼 push_back 해준다고 가정했을 때 int dy[] = {-1,0,1,0}; int dx[] = {0,1,0,-1}; 위 dy dx코드를 해줄 필요가 없는건가요? 연습할 때 .push_back(i)로 하다가 dfs bfs연습문제 풀 때 dy dx가 나와서 뭐지? 했습니다. 어느 상황에서 맨위 코드블럭처럼 해줘야 하는지 아래 코드블럭처럼 하는지 잘 분간이 안되서 이렇게 질문드립니다. 감사합니다. ps. 5 5 1 1 0 0 1 0 0 1 1 0 0 1 0 0 1 이런식의 예제입력이 주어지면 push_back안 하고 dy dx만 해주면 되는걸까요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요. 강사님. 이런 느낌으로 팰린드롬 변환을 구현해봤습니다. 사실 문자열 최대길이가 50이라서 시간복잡도 문제는 없을거라 생각하는데요. 삽입을 사용안하고 풀어보려고 했는데 reverse도 결국 O(N)이라서 유의미한 차이는 없는거 같습니다. 실제로 중간 삽입, reverse도 중간부분을 뒤집는거라 같은 시간복잡도가 예상되는데 맞을까요? http://boj.kr/6889e519af6742b9a6cda67803fbf013
강사님 안녕하세요, 8주차 개념강의 중 질문입니다. [알고리즘 강의] 8주차. 펜윅트리와 최단거리.. : 네이버블로그 ( naver.com ) 강의 노트 웹페이지에 2번째 그림에서, "2~8 까지의 최소인덱스 3번째 4번째 6번째 인덱스만 비교해서 최소 인덱스를 반환" 이라는 말이 잘 이해가 안되어서요. 그림상 파란 화살표 표시한 것이 3,4,6 인덱스를 의미 하는 것인지 그리고, 3,4,6째 인덱스를 비교한다는 것이 왜 필요한 것인지 궁금합니다. 제가 이해한 것은 2~8 까지의 최소 인덱스는 Level 1 에 저장된 Index 3 만 확인하여 Index 3 에 위치한 "1" 이 최소값인 것으로 이해를 했거든요. 강의 노트 웹페이지에서 5번째 그림에서, 파랑 노드를 만들면 된다고 갑자기 설명을 하시는데, (강의 3:03 구간) 그림상 주황색 노드(3,4,10,11)의 의미, 파랑색 노드(1,2,3,4)의 의미에 대한 안내도 없고... 그림에 표시된 화살표도 어떤 연산이 수행되었고, 화살표로 연결된 두 노드의 관계에 대한 설명도 없어 이해가 되지 않습니다. 관련 내용 상세 설명 좀 다시 부탁드리겠습니다.