묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
스택 관련 어셈블리어에서
스택 관련 어셈블리어에서 mov와 push가 컴파일러에 따라 다르게 나올 뿐 동일한 기능을 하는 것이라면main 함수 스택프레임의 지역변수 a,b에 대한 mov 어셈블리어를 실행했을 때에는 esp에 변화가 없었지만MultiplyBy 함수 스택프레임의 매개변수 a, b에 대한 push 어셈블리어를 실행했을 때에는 esp에 변화가 생겼었는데 왜 그런지 궁금합니다;; 그리고 1개 함수의 스택프레임에는 매개변수 + 반환 주소값 + 이전 함수 ebp + 지역변수가 들어가는 것으로 알고 있습니다그런데 막상 sub esp, ...을 통해서 해당 함수가 사용할 스택프레임의 영역을 정할 때에는 이미 4개 요소 중 3개가 이미 저장된 상태 같은데 왜 이렇게 되는 것인지 모르겠습니다(매개변수와 반환 주소값은 이전 함수에서 세팅을 해준다고 하더라도 일단은 해당 함수의 스택 프레임에 속할 텐데)
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
5-P 질문 있습니다.
95%에서 틀렸습니다가 나옵니다.. 시뮬레이션인데 예외가 있는지 궁금합니다..확인하는 함수까지 첨부합니다..#include <bits/stdc++.h> using namespace std; // #define FIO ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0); int T, K, cnt; int gears[1001]; int rotRight(int gear) { int temp = gear & 1; int res = (gear >> 1) | (temp << 7); return res; } int rotLeft(int gear) { int temp = gear & (1 << 7); int res = (gear << 1) | (temp >> 7); return res; } void rotate(int idx, int dir) { int low = 1, high = T; for (int i = idx; i > 1; i--) { int rightGear = (gears[i] & (1 << 1)) << 4; int LeftGear = gears[i - 1] & (1 << 5); int dif = rightGear ^ LeftGear; if (!dif) { low = i; break; } } for (int i = idx; i < T; i++) { int LeftGear = (gears[i] & (1 << 5)); int rightGear = (gears[i + 1] & (1 << 1)) << 4; int dif = rightGear ^ LeftGear; if (!dif) { high = i; break; } } if (dir == 1) { for (int i = low; i <= high; i++) { if ((i & 1) == (idx & 1)) { gears[i] = rotRight(gears[i]); } else { gears[i] = rotLeft(gears[i]); } } } else if (dir == -1) { for (int i = low; i <= high; i++) { if ((i & 1) == (idx & 1)) { gears[i] = rotLeft(gears[i]); } else { gears[i] = rotRight(gears[i]); } } } } void printGear(int n) { for (int i = 7; i >= 0; i--) { cout << ((n & (1 << i)) ? 1 : 0); } cout << '\n'; } void printAll() { for (int i = 1; i <= T; i++) { printGear(gears[i]); } cout << '\n'; } int main() { freopen("input.txt", "r", stdin); scanf("%d", &T); for (int i = 1; i <= T; i++) { int gear = 0; for (int j = 0, temp; j < 8; j++) { gear = gear << 1; scanf("%1d", &temp); gear += temp; } gears[i] = gear; } // printAll(); scanf("%d", &K); for (int i = 0, a, b; i < K; i++) { scanf("%d %d", &a, &b); rotate(a, b); // printAll(); } for (int i = 1; i <= T; i++) { if (gears[i] & (1 << 7)) cnt++; } printf("%d", cnt); return 0; }
-
미해결홍정모의 따라하며 배우는 C++
[4:00]static 멤버 변수의 초기화에서 문득 궁금해진 점
class Some {public: static int _val;};int Some::_val = 1; 마지막 줄인 int Some::_val = 1; 에서 앞에 int가 붙는 이유는 무엇인가요?Some이라는 클래스 안의 _val이라는 int형 멤버 변수라는 것으로 충분히 의미가 전달될 수 있는데, 앞에 int를 붙여서 변수 선언 과정처럼 초기화해야 하는 이유가 뭘지 궁금합니다.
-
미해결홍정모의 따라하며 배우는 C++
casting 원리 질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. casting 에 대해서 궁금한게 생겼습니다. 모든 date 는 메모리에 1과0으로 저장이 되는데 date type 의 차이는 저장된 메모리를 어떤 방식으로 출력하냐의 차이인가요? 예를들면 65라는 수는 char type, int type 모두 0000 0000 0100 0001 로 저장이 되지만 이를 출력할때 char type 으로 선언하면 아스키테이블을 거쳐서 A로 출력되는거고 int type 으로 선언하면 이진수계산을 통해 65로 출력되는 그런 형식인지 생각이 되서 casting 이라는게 강제로 메모리출력방식을 바꿔주는건가 궁금합니다. *1 00001011 000 1010 1011 0100 0000 0000 이렇게 저장된 long type 의 변수가 이진수로 저장이되던게 double type 으로 casting 하면 부호,지수,가수부분을 계산한 부동소수점수로 표현이되는지..?
-
미해결홍정모의 따라하며 배우는 C++
float 형 데이터가 메모리에 저장될때
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 첫번째 질문 float 형 데이터가 메모리에 저장될때 이진수를 정규화(?)시켜서 저장이 된다고 하는데(구글링했습니다) 쉽게 말하면 부동소수점수와 근사하는 이진수데이터를 메모리에 저장한다는 뜻인가요? set precision(17)로 float d=0.1 를 출력하면 강의에서와 같이 마지막소수점이 1로 나왔다는건 메모리에 저장되어있는수가 실제 0.1이 아닌 소수점 18번째 자리부터 반올림했을때 올라가는 0.1에 근사한수 인지입니다. 두번째 질문 구글링해보니 setprecision 은 정수부,소수부를 포함하여 고정된 n 의 너비를 가지게끔 입출력을 조작하는 함수라고 나와있습니다. 그런데 0.1 과 3.14159 를 비교하여 출력해보니 너비가 다르게 나옵니다. 정수부나 소수부가 0인경우 너비를 고려하지 않는건가요? 세번째 질문 double d = 0.1 을 선언하고나면 메모리에 0.1 에 근사하게끔 0과1로 메모리가 저장된다고 한다면 setprecision 을 적지않고 d 를 출력했을때 왜 0.1 이 출력되는건가요? 메모리에 저장되어있는 수를 꺼내는 원리가 아니라 내가 초기화시킨 값의 형식(적은 수의 모양 자체) 를 출력해주는 건가요?
-
미해결홍정모의 따라하며 배우는 C++
numeric_limit 함수 질문드립니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를ㅇ 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. cout 으로 int 의 표현되는 최대정수를 구하기위해 numeric_limits<>::max() 를 출력할때 ()를 넣으면 정수가 출력되고 ()를 넣지않으면 다른게 출력됩니다. min, lowest 도 마찬가지인데 어떤 차이가 있는건가요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
5-H 13144
예시 답안으로 주신 코드와 해설강의가 전혀 이해가 안 되서 질문 드립니다. 예시 답안의 Line 19와 Line 24에 대해서 입력이 5 / 1 2 3 1 2 로 주어졌을 때 어떤 경우의 수가 19,24 번째 줄에서 카운팅이 되는지 실제 예시를 들어 답변해주시면 감사하겠습니다. (ex. s=0, e=3일 때 a,b,c의 경우가 카운팅 된다. )
-
미해결홍정모의 따라하며 배우는 C++
안녕하세요 교수님 이번 강의에 대한 문의를 드리려고 합니다.
안녕하세요~ 일단 질문하기에 앞서 교수님의 강의 정말 감사하며 잘 보고 있습니다. 제가 이번 강의를 들으면서 강의 내용에 의문점이 생겼습니다. 그래서 제가 생각한 방식을 말씀드리고 의견을 한번 여쭤보고 싶었습니다. 일단 5분 21초경에 복사생성자가 1번만 호출이 됩니다. 저는 여기서 dosomething이란 함수에서 class타입인 temp를 return해줄때는 왜 복사가 일어나지 않는지 궁금했습니다. 제가 생각한대로라면 복사생성자가 두번 호출되어야 하니까요. 그래서 디버거모드로 한번 돌려보았습니다. 그 결과 return을 해줄때 복사생성자가 호출된다는 것을 알게되었습니다. 그럼 왜 return값을 대입해줄때는 복사생성자가 호출되지 않았을까요? 생각해보았더니 return값이 rvalue라서 그런거 같다는 생각이 들었습니다. 그래서 만약 return값이 lvalue이면 해답을 알 수 있을 것 같아서 dosomething함수의 return 타입을 클래스 참조로 바꾸고 같은 조건으로 디버거 모드를 실행해보았습니다. 그 결과 함수 안에서 return할때는 복사가 일어나지 않았고(참조이기 때문에 당연하다 생각했습니다.) , result객체를 생성할 때(lvalue를 대입할 때) 복사 일어났습니다. 그래서 제 결론은 lvalue를 대입 할 때는 복사 생성자가 호출되지만 rvlaue를 대입 할 때는 함수의 return에서 이미 복사가 일어나고 변수에 그냥 대입 된다고 보았습니다. 여러번 생각해보았으나 이 과정 중에 제가 잘못 생각한 부분이 있는지 여쭤보고 싶습니다. 아직 부족한 점이 많아서 제 생각의 흐름에서 어디가 빵꾸났는지 알고 싶습니다. 긴 글 읽어주셔서 감사합니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
생성자 질문(타입 변환 생성자)
opertor를 공부하면서 생성자 부분이 궁금해서 테스트를 해보았는데 class Player{public : int m_iHp; int m_iAttack; int m_iDefense; public: Player() : m_iHp(100), m_iAttack(20), m_iDefense(5) { cout << "Player 기본 생성자!" << endl; } Player(int id) : m_iHp(200), m_iAttack(40), m_iDefense(10) { cout << "Player ID 받는 버젼 생성자!" << endl; } ~Player() { cout << "Player 소멸자!" << endl; }}; class Knight : public Player{public: int m_iStat; public: Knight() : m_iStat(10) { cout << "Knight 기본 생성자!" << endl; } Knight(int id) : Player(id), m_iStat(20) { cout << "Knight id 받는 버젼 생성자!" << endl; } ~Knight() { cout << "Knight 소멸자!" << endl; } }; int main(){ Knight k1; k1 = 3; return 0;} 현재 Knight k1을 만들게 되면은 콘솔창에 출력문이 이렇게 찍혀 햇갈리는 부분이 있어서 질문드립니다. 메모리를 확인해보니 k1의 주소(0x000000718D0FF688)는 이런값으로 안에 데이터들이 스택에 자리를 차지하게되어있었습니다. 이후 k1 = 3; 를 하게되면 Knight k1의 스택에 있는 주소가 가르키는 값들이 변경이 되는데 이는, 타입 변환 생성자(기타 생성자)를 통해 만들어진 객체를 만들어서 "암시적 형변환"으로 만들어진 객체를 대입연산자로 k1의 주소에 멤버 변수 하나하나를 다 덮어 쓴 형태인거같더라구요 즉, 정리하자면 1) Knight k1; 을 하는 순간은 스택에 기본 생성자를 호출 한 상태로 올라간다. 2) k1 = 3 하였을 경우, 컴파일러가 암시적 형변환으로 인자를 하나를 받는 Knight의 타입 변환 생성자(기타 생성자)를 호출한뒤 k1의 주소에 '=' 연산자를 통해 멤버 변수 하나하나를 덮어쓴다. (얕은 복사) 여기서 궁금한점이 소멸자를 출력하는 문장이 두줄에 걸쳐서 나오는게 아니라 이런식으로 4줄에 걸쳐서 나오는데 이게 분명히 암시적 형변환으로 생성한 객체를 생성하고 기본생성자로 만든 k1에 멤버 변수들을 덮어썻다고 생각해서 스택에는 Knight의 객체가 하나밖에 없는 상태로 봤는데 콘솔창을 확인하면 k1뿐만 아니라 k1 = 3을 하였을 때의 3에 해당하는 객체도 어딘가에 존재를 하는거 같은데 3이라는 정수를 컴파일러가 타입변환 생성자로 받아들여서 인자를 하나만 받는 Knight객체를 만들어서 '=' 연산자를 통해 k1에다가 멤버 변수를 다 덮어 씌우는데 정수 3을통해서 만들어진 객체도 스택에 올라간 다음에 값만 k1이라는 객체에 덮어 씌우는건가요..?? 맞는말인가요..???
-
미해결홍정모의 따라하며 배우는 C++
&의 쓰임
*의 쓰임이 2가지(1. 포인터 선언 시 포인터임을 나타내는 표시, 2. de-referencing)로 나뉘어지는 것처럼, &의 쓰임도 2가지(1. reference선언 시 reference임을 나타내는 표시, 2. 주소)로 나뉘어진다고 생각해도 될까요? 예를 들어 void addOne(int &y) { cout << &y << endl;} 란 코드가 있을 때, int &y는 reference선언할 때와 같은 쓰임이어서 인자가 reference에 의해 들어오는 거라고 해석하는 것이고, cout 출력할때의 &y는 주소의 쓰임으로 해석하는 것이라고 해도 될까요?
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
이다솜 문제 시간초과.. ㄷㄷ
안녕하세요 강사님~! 강의 잘 보고 있습니다. 다름이 아니라 강사님 코드와 거의 흡사한데, 시간초과가 떠서 뭐가 빠졌나 하고 보니까 ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); 이걸 넣으니 맞았다고 하는데.. 이 코드가 시간초과에 영향이 큰지 여쭤보려고 합니다.. 아래는 시간초과한 코드이고 여기에 상단의 코드를 넣으니 답으로 인정해줬습니다! #include <bits/stdc++.h> using namespace std; int n, m; string buf; map<string, int> mp; map<int, string> rmp; int main() { cin >> n; cin >> m; for (int i = 0; i < n; ++i) { cin >> buf; mp[buf] = i + 1; rmp[i + 1] = buf; } for (int i = 0; i < m; ++i) { cin >> buf; if (atoi(buf.c_str()) != 0) { cout << rmp[atoi(buf.c_str())] << "\n"; continue; } cout << mp[buf] << "\n"; } return 0; }
-
해결됨it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
재귀함수 복귀주소
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 호출되는 라인9의 재귀 함수의 복귀주소가 전부다 같은건가요? 그러니까 함수가 호출되거나 할때마다 고정된 영역이라 호출주소는 전부다 같은건지 아니면 함수가 호출될때마다 복귀하는 주소는 서로 유일하게 저장되어 저장 위치가 달라져 서로 복귀주소는 다른 주소값을 갖게되는지 궁금합니다 명령코드로서 읽고가는거라면 복귀주소가 같을거같은데.. 함수가 생성될때마다 서로 복귀주소를 구분되게 해서 저장하는건지 모르겠네요
-
미해결홍정모의 따라하며 배우는 C++
9:05 변수 count에 대해
변수 my_var과 count 모두 namespace a에 선언했는데 왜 count만 namespace std에 존재해서 오류가 나나요 ? 명확히 이해하지 못해 질문 드립니다 !
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
함수객체론 해결을 하지 못하고 함수 포인터를 사용해야만 하는 상황이 있을까요?
함수 포인터와 함수 객체에 대해서 강의를 들었습니다. 강사님께서 함수 포인터에겐 진행상황을 저장할수 없다는 단점이 있어, 클래스를 이용해 함수 객체를 이용하면 단점이 보완가능하다고 설명해주시고, 함수 객체 또한 매게 변수로 사용이 가능한걸로 아는데, 그렇다면 함수포인터는 함수 객체로 대체해서 쓰면 가능하지 않나요? 아니라면 함수 객체로만 해결이 가능한 그런 상황이 있을까요?
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
안녕하세요. 강사님 교안 관련 질문 드려봅니다.
최근에 수강을 결심하고 결제한 수강생입니다. 지금 교안을 다 들여다 보고 있는데 메소드 / 함수 구분 없이 전부 다 함수로 표기되어 있어 보는데 혼동이 올 때가 가끔씩 있습니다. 혹시 메소드 / 함수 구분을 추후에 표기하실 생각이 있으신가요? PS. 그리고 14페이지에 추구 -> 추후 오타입니다.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
4-C 게리맨더링 모든 경우의 수 질문
https://www.acmicpc.net/source/share/13099fe68b2a4674aa92e2b5ca5aa0dd (n은 6이라고 가정) 해설 코드 34번째 줄모든 경우의 수를 for(int i=1; i < (1 << n) - 1; i++)로 설정한 이유가 궁금합니다. 한 구역으로만 이루어진 111111인 경우를 제외하기 위해서 n이 6인 경우 i는 1부터 111110 (62) 까지 경우를 확인하는 건가요 ?
-
미해결[하루 10분|C++] 누구나 쉽게 배우는 C++ 프로그래밍 입문
sizeof arr에서
3분 50초 쯤에서 sumArr함수 내에서 전달받은 arr의 size를 구할 때 , 제 코드상에선 전달받은 arr의 size가 8이 나오는데 이유가 무엇인지 궁금합니다 ㅠㅠ
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-J 질문있습니다.
pair<int,int> 를 쓰지않고 1000*y + x를 쓰는데에 특별한 이유가 있나요 ? 로직은 거의 비슷한데 pair를 썼을때 실행시간이 170ms 정도 되는데 강사님의 풀이는 4ms 밖에 안돼서 퍼포먼스에 지대한 영향이 있는건지 궁금합니다
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
부동소수점의 지수 부분
안녕하세요 실수를 표현하는 방법 중 지수 부분이 조금 관심이 가서 인터넷을 찾아봤는데 00000000과 11111111은 사용이 안되어서 00000001 ~ 11111110까지 활용이 가능하다고 하더군요.. 여기까지는 그렇구나 했는데 이게 10진수로는 -126 ~ 127이라고 해서 많이 헷갈립니다... 1바이트인 char의 경우에는 -128 ~ 127까지가 표현범위인 것으로 알고 있고 00000001 ~ 11111110이면 -127 ~ 126이 되어야된다고 생각하고 있었거든요 중요한 부분인지는 잘 모르겠지만 순수하게 궁금합니다... p.s. 새로운 내용들을 공부할 때마다 예전에 배웠던 내용들 중 잘 사용하지 않는 부분들은 자꾸만 잊어버리는데(ex - bitflag) 좋은 방법이 있을까요?;;
-
미해결홍정모의 따라하며 배우는 C++
하위 네임스페이스에서 상위 네임스페이스의 함수에 접근할 수 있는 이유?
MySpace1안의 InnerSpace라는 하위 네임스페이스에서MySpace1의 함수인 doSomething(int a, int b)을 호출해보았습니다.InnerSpace에서 MySpace1의 함수에 접근할 수 있는 이유가 뭔가요?main에서 함수를 호출하는 원리와 같은가요? namespace MySpace1{ int doSomething(int a, int b); namespace InnerSpace { int my_function() { cout << doSomething(3, 4) << endl; return 0; } } int doSomething(int a, int b) { return a + b; }}