- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요! 강의 잘 듣고 있습니다 ㅎㅎ 다름이 아니라, 게리멘더링 문제에서 comp와 visited를 memset으로 초기화하고 제출했더니 버퍼오버플로우로 런타임에러가 나더라구요,, 0으로 초기화하는 경우에는 memset 쓸 수 있는 걸로 알고 있고, 심지어 0으로 초기화할 때는 memset이 fill보다 빠르지 않나요?ㅠㅠ 그런데 버퍼오버플로우 나는 이유가 궁금합니다! 답변 미리 감사드려요!!! 항상 이른 아침에 답변해주시던데 좋은 하루 보내세요~~
안녕하세요 선생님 :) 문제풀이 중 이해가 안가는 부분이 하나있어서 질문드립니다. 선생님의 문제풀이 중 아래와 같은 부분이 있는데요, if(i >= 1 && (prev == idx) && (idx != 'e' && idx != 'o')){ flag = 1; i >= 1이라는 조건을 넣어주신 이유를 잘 모르겠습니다. 실제로 저 부분을 지워도 정답으로 인정이 되더라구요. 알려주시면 감사하겠습니다!
http://boj.kr/e94fb8e43b714794a0950505c0091594 아래의 dfs 함수에서 a[ny][nx] == 1일때 왜 continue 하는 것 인가요? int dfs(int y, int x){ visited[y][x] = 1; int ret = 1; for (int i = 0; i < 4; i++) { int ny = y + dy[i]; int nx = x + dx[i]; if (ny < 0 || nx < 0 || ny >= m || nx >= n || visited[ny][nx] == 1) { continue; } if (a[ny][nx] == 1) { continue; } ret += dfs(ny, nx); } return ret; }
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
복습하려고 제 코드를 디스어셈블리어로 분석하는 도중 위 강의에선 main함수의 a,b의 값을 전달하기위해 컴파일러가 eax,ebx 레지스터에 그 값을 복사하고 그것들을 push를 통해 스택의 공간을 더 사용하지않습니까? push를 통한 것이니 esp(스택 포인터, 저는 x64라 rsp긴 합니다.)의 값도 감소(공간이 늘어난것) 하게 되는걸로 알고있습니다. 하지만 제 코드에선 컴파일러가 push를 통해 매개변수를 할당한것이아닌 esp+1h 라는 주소에 mov를 통해 직접 값을 넣었습니다. 제 생각에는 main에서 esp를 sub를 통해 확보한 스택프레임의 크기에 공간이 남아서 그 빈공간에 매개변수를 할당한것같은데 이건 그저 컴파일러가 판단해서 한게 맞는건지 궁금합니다. int PrintNumber(int a,int b) { 00007FF6506918D0 mov dword ptr [rsp+10h],edx 00007FF6506918D4 mov dword ptr [rsp+8],ecx 00007FF6506918D8 push rbp 00007FF6506918D9 push rdi 00007FF6506918DA sub rsp,108h 00007FF6506918E1 lea rbp,[rsp+20h] 00007FF6506918E6 lea rcx,[__0D5E813E_CPP_STUDY_8@cpp (07FF6506A3066h)] 00007FF6506918ED call __CheckForDebuggerJustMyCode (07FF6506913FCh) 00007FF6506918F2 nop int c = a + b; 00007FF6506918F3 mov eax,dword ptr [b] 00007FF6506918F9 mov ecx,dword ptr [a] 00007FF6506918FF add ecx,eax 00007FF650691901 mov eax,ecx 00007FF650691903 mov dword ptr [c],eax return c; 00007FF650691906 mov eax,dword ptr [c] } 00007FF650691909 lea rsp,[rbp+0E8h] 00007FF650691910 pop rdi 00007FF650691911 pop rbp 00007FF650691912 ret 여기서 rsp+1h, rsp+8에 각각 eax,ebx에 들어있는 매개변수값을 mov를 통해 넣어주고 push를 통해 이전 스택프레임의(main함수) rbp rdi 값을 밀어넣어주고 rsp,108h 라는 공간을 printNumber의 함수의 스택프레임으로써 sub을 사용에 할당하고 여자저차 연산하고 이후 다시 lea rsp,[rbp+0E8h]를통해 rsp를 main함수의 레지스터가 저장된 스택 (위에서 rbp rdi값) 위치로 돌아가 pop을 해줌으로써 다시 rdi rbp의 값을 넣어주고 ret한다고 이해를 했습니다. 근데 이 rsp+1h , rsp+8은 사실 새로운 스택프레임 즉 printNumber의 스택프레임이 아닌 범위인데 ( main에서 잡아논 스택 공간) 이런건 컴파일러의 재량인지 궁금하고 또 위험한 기능은 아닌지 궁금합니다!.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 두번째 말씀해주신 방법에서 분기점이라는 개념이 이해가 잘 안되서 질문 남깁니다. ((()))()과 같은 예시가 설명과 동일하게 존재할 때 ret = max(ret, i - s.top ());을 수행하면 마지막 7번째 i에선 7-5를 수행하게 되어서 ret에 6이 들어가서 오답이 되는것이 아닌가라는 의문이 있습니다. 제가 잘 이해를 못한 부분이 존재하는 것 같아서 질문남깁니다. 감사합니다!
안녕하세요 선생님 수업 잘 듣고 있습니다. 제가 어떠한 grid를 인풋으로 받아 dfs 혹은 bfs를 할때 visited를 사용하는 이유는 이해를 하고있습니다. 그런데 이번 문제의 경우 어느 상황에서 visited가 사용되는지 이해가 되지 않습니다. 제 생각에는 한번 들어간 노드에는 그에 따른 하위 노드로 넘어갈뿐 똑같은 노드에 들어가는 상황이 없다고 생각됩니다. 어떠한 상황에서 visited가 사용되는지 궁금합니다. 감사합니다
안녕하세요 선생님, 8-B 문제에 대해 문의드리고 싶습니다. 저는 재귀를 들어갈 때 마다 (스텟이 바뀔 때 마다) 새로 해결한 퀘스트 수를 더하는 식으로 문제를 풀었는데 틀렸습니다. 저는 dp를 풀 때 현재값 + 재귀값으로 풀어왔는데 틀리니 이상합니다. 48번 줄: ret = max(ret, nvisit + go(STR + i, INT + (PNT - i))); 선생님 풀이를 보고, 각 재귀 마다 현재 스텟에서 성공한 횟수를 반환하는 식으로 구현하니 맞게 나옵니다. 47번 줄: ret = max(ret, go(STR + i, INT + (PNT - i))); 선생님 풀이와 로직은 동일한 것 같은데, 어떤 부분에서 틀렸는 지 모르겠습니다. 틀린 풀이 https://www.acmicpc.net/source/share/9878747de0af458ca79dde4f3555903c 맞는 풀이 https://www.acmicpc.net/source/share/e7061d5e24564ad2a773395440381ecc 항상 강의 잘 듣고 있습니다. 감사합니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 38페이지의 "char 을 초기화할 때 주의할 점"에 대해 궁금합니다. 코드에서 char a = '\0' 와 char b = 0 라고 선언한 부분이 if(a==b) cout << 1 ; 에서 1이 출력됩니다. 위 설명에선 char 변수를 초기화할 때 특정값으로 하거나, 널 문자를 사용하는 방법 두가지가 있다고 했는데 b는 숫자 0을 대입한 것인지 아니면 "0"을 대입한 건지 헷갈립니다. 당연히 전자라고 생각했는데 if 문에서 둘이 동일하다고 해서 제가 놓친 부분이 있는지 궁금합니다. 만약 후자라면 숫자 0을 대입하는 방법이 궁금합니다 감사합니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요. 좋은 강의 감사합니다. 교안 36p :void:리턴하는 값이 없다" 코드를 #include <bits/stdc++.h> using namespace std; int ret = 1; void a() { ret =2; cout<<ret<<"\n"; return; } int main(){ a(); cout<<ret<<"\n"; return 0; } 로 수정했습니다. 마지막에 cout만 추가한 것 입니다. 그러면 제 생각에는 값이 2 1 이 나와야합니다. int ret =1 이 main 함수 밖에서 선언된 전역변수이고 a()함수에서 ret = 2라고 했지만 아무것도 반환하지 않았고, a 함수 내에서만 ret =2 라는 값을 가질거라고 생각했습니다. 하지만 디버깅 결과 2 2 가 나왔는데 왜인지 모르겠습니다ㅜㅠ
안녕하세요 알고리즘 강의를 예전에 구매를 했었는데, 코딩테스트를 준비해야 할 시기가 되어 이제서야 공부하려고 합니다. 궁금한 것이 아직 제가 온라인 코딩 테스트에 대한 경험이 없는데, 온라인 코딩 테스트는 검색이나, 자신이 예전에 짜놨던 코드, 아니면 기타 서적 같은 것을 참고해서 보는 것이 가능한가요? 어떤 방향으로 코딩테스트를 준비해야 할 지 방향을 조금 더 확실히 잡고 싶어 질문 드립니다!
안녕하세요 큰돌님! 강의 잘보고 있습니다! 보물섬 문제를 푸는데 궁금한 점이 있어서 질문드립니다. 로직은 거의 동일하게 풀었습니다만, 문자가 다닥다닥붙어서 입력되는걸보고 scanf와 printf를 사용해보았는데 틀렸다고 나와서요. 큰돌님이하신 방법대로 cin과 cout으로 교체해주었더니, 맞았다고 나왔지만 어느 부분이 다른 건지(혹은 틀린건지) 잘 모르겠습니다. ㅠㅠ 아래 코드에서 주석 처리한 부분이 제가 처음에 작성했던 코드입니다. http://boj.kr/f3f04689b13c429d830e4dda8b3d9505 답변 기다리겠습니다!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.ㅇ 안녕하세요. 강의 잘 듣고있습니다. while((pos = input.find(delimiter)) != string::npos) 코드가 잘 이해가 안됩니다. input에서 delimiter를 찾는 부분이 input.find(delimiter)인데 != string::pos 부분이 이해가 안됩니다. npos는 무엇을 의미하는 건지 궁금합니다. 감사합니다!
안녕하세요 선생님. 해당 질문에 대해서 저는 for 반복문을 이용해서 풀었습니다. 선생님께서는 while문을 이용해서 푸셨는데, 이러한 상황에서 시간복잡도 , 코드 효율성 등이 for문을 사용하는게 좋은지 while문이 좋은지 궁금합니다. 또한, while문의 시간 복잡도를 구하는게 조금 헷갈리는데 간단하게라고 설명 해주시면 감사하겠습니다. #include <bits/stdc++.h> using namespace std; const int MAX_K = 2500; const int MAX_M = 50; const int MAX_N = 50; const int dy[4] = {-1, 0, 1, 0}; const int dx[4] = {0, 1, 0, -1}; int T, N, M, K; bool IsMovable(int dirY, int dirX, int visited[MAX_N][MAX_M], int Map[MAX_N][MAX_M]) { if (dirY >= N || dirX >= M || dirY < 0 || dirX < 0) return false; if (visited[dirY][dirX] != 0) // 방문한 적 있으면 return false; if (Map[dirY][dirX] != 1) // 갈 수 없는 곳이면 return false; return true; } void Go(int cy, int cx, int visited[MAX_N][MAX_M], int Map[MAX_N][MAX_M]) { visited[cy][cx] = 1; for (int i = 0; i < 4; i++) { int ny = cy + dy[i]; int nx = cx + dx[i]; if (IsMovable(ny, nx, visited, Map)) Go(ny, nx, visited, Map); } } int main() { cin >> T; for (int i = 0; i < T; i++) { int Map[MAX_N][MAX_M]{}; int visited[MAX_N][MAX_M]{}; int zoneCnt = 0; cin >> M >> N >> K; for (int j = 0; j < K; j++) { int diry = 0; int dirx = 0; cin >> diry >> dirx; Map[diry][dirx] = 1; } for (int currY = 0; currY < N; currY++) { for (int currX = 0; currX < M; currX++) { if (IsMovable(currY, currX, visited, Map)) { zoneCnt++; Go(currY, currX, visited, Map); } } } cout << zoneCnt<< endl; } }