25:10 초 쯤부터 Internal Linkage 에 대한 설명을 하십니다. int g_a = 1; 이 Internal Linkage 로 개별 cpp파일 안에서만 전역변수처럼 작용한다고 하셨습니다. 그런데 그 후에 26분 쯤에서는 static int g_a = 1; 에서 static이 이 변수가 다른 cpp파일에서 쓰이지 못하게 제한해준다고 하셨는데, 이미 제한해줄 게 없이 이거는 이미 Internal Linkage 변수가 아닌가요..? static 이 없으면 파일 안에서만 전역변수가 되는 것이 아니라, 전체 파일에서의 전역변수가 되는 것이고 static이 있어야만 파일 내의 전역변수가 되는 건가요? 이 부분을 여러번 돌려봤지만 너무 헷갈려서 질문 드립니다.
45분 31초쯤에 선생님께서, 새로운 cpp 파일 Myconstants.cpp를 만드시고 그 안에 extern const double pi(3.141592); extern const double gravity (9.8); 이렇게 external linkage 전역 변수들을 초기화시키고, header file 안에는 extern const double pi; extern const double gravity; 이런식으로 선언만 해주셨습니다. 이렇게 했더니, 헤더파일 안에 있는 pi를 가져가서 사용하는 서로 다른 cpp 파일에서의 pi의 메모리 주소가 같아졌습니다... 여기서 헷갈리는 부분이 있습니다... 물론 external 변수들은 꼭 초기화를 1번만 해주어야 한다는 사실은 이해하고 있습니다. 그런데 왜 굳이 헤더파일에서 초기화를 시켜주지 않고 다른 cpp 파일에서 초기화를 시켜준 것인가요? 제가 실험 삼아 선생님께서 하신 것과 그 반대로, 다른 cpp 파일에서는 선언을 하고 헤더 파일에서는 초기화를 해주었습니다. 그랬더니 빌드할 때 error가 발생합니다... 제가 한 방법과 선생님께서 하신 방법에 어떤 큰 차이가 있길래 한곳에서는 error 없이 잘 실행되고 나머지에서는 error가 발생하는 걸까요?ㅠㅠ
선생님께서 45분 쯤에 말씀하셨던 코드들을 좀 더 이해해보고 싶어서 이렇게 해보았습니다. <Header File constant.h> #pragma once namespace Constants { extern const double pi(3.141592); extern const double gravity(9.8); } <test.cpp> #include <iostream> #include "constant.h" void doSomething() { using namespace std; cout << "In test.cpp " << Constants::pi << endl; } <main.cpp> #include<iostream> #include "constant.h" using namespace std; void doSomething(); int main() { cout << "In main.cpp file " << Constants::pi << endl; doSomething(); return 0; } 여기서 궁금한 점이 헤더파일 안에 있는 const 변수들 앞에 extern이 없으면 아무런 문제가 없지만, extern을 붙이면 문제가 발생합니다.. 왜 extern을 붙이기만 하면 오류가 발생하는 것일까요...? extern linkage도 결국에는 전역 변수 중 하나인데 말입니다...
안녕하세요 선생님 강의를 보고 살짝 헷갈리는 부분이 있어 질문드립니다. Q1. 사진은 선생님이 설명해주실때 그려주신건데, 왼쪽 num[1] oper[1] num[2] 이 부분이 괄호를 쳐서 연산해주었다고 생각해도 되는건가요? 즉 제가 이문제를 접근할때 완전탐색으로 재귀호출시에 1. 괄호를 묶거나 2. 괄호를 묶지 않거나 이렇게 두가지로 생각을 해서 호출을 하려 했습니다. 사진의 오른쪽은 그냥 현재 인덱스와 그 다음 인덱스를 연산하는것이기 때문에 왼쪽부터 오른쪽으로 연산하는것 이기에 괄호연산을 하지 않았다고 판단했고, 왼쪽은 오른쪽에서 부터 왼쪽으로 연산을 했기 때문에 괄호 연산을 한것이라고 판단하였습니다. 근데 이번 인덱스를 먼저 계산하는 것이기 때문에 그 반대가 맞는것 같기도 하네요.. Q2. 그리고 또 질문은 만약 괄호를 추가하냐 추가하지 않느냐 이렇게 두가지로 가정한다면 재귀호출후 원복하는 부분이 필요할것 같은데 그 부분이 왜 따로 없는지도 궁금합니다. -> 이 부분 제가 생각해 보았는데, visited 등과 같은 전역변수 배열은 한번 체크하면 재귀 탈출후에도 체크가 남아있어서 따로 지우는 로직이 필요한 것이고, 이번 문제의 경우는 재귀함수에서 하나의 함수를 탈출하면 재귀의 특성때문에 자동적으로 선택하기 이전으로 돌아가기 때문에 따로 뭔가를 지우는 로직이 필요없는것인가요? 혹시 제가 생각한것이 맞는 생각인건가요? 아니면 아예 접근을 그런식으로 하면 안되는건가요?
int a = 1; void doSomething() { ++a; cout << a << endl; } int main() { int a = 10; doSomething(); doSomething(); doSomething(); doSomething(); } 선생님께서 19분 38초 쯤에 이 코드에 관해서, <이런 식으로 int a = 10을 추가해 무의식적으로 a가 doSomething() 안에서 10이 출력되길 바랄 수 있는데 전역 변수는 어디서나 값을 막 바꿔버릴 수 있다. 그럼 바뀐 값이 doSomething()에서 출력되는 것>이라고 설명하셨습니다. 그런데, 선생님께서 설명하신대로라면, 바뀐 값이니 10, 11, 12, 13이 나와야 하는데, 저 코드를 출력하면 2, 3, 4, 5가 출력됩니다...혹시 선생님께서 잘못 설명하신 걸까요?ㅠ 그래서 전역 변수는 어디서나 값을 막 바꿔버릴 수 있다는 설명도 헷갈립니다ㅠ
안녕하세요. 큰돌님 강의 잘 보고있습니다. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; public class Main { static int[][] board; static boolean[][] visited; static int[] dy = {-1, 0, 1, 0}; static int[] dx = {0, 1, 0, -1}; static int yLen; static int xLen; static int cnt; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); StringBuilder sb = new StringBuilder(); while (n-- > 0) { int[] given = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray(); if (given[2] == 1) { sb.append(1).append(System.lineSeparator()); continue; } board = new int[given[0]][given[1]]; visited = new boolean[given[0]][given[1]]; yLen = given[0]; xLen = given[1]; for (int i = 0; i < given[2]; i++) { String[] numStr = br.readLine().split(" "); int y = Integer.parseInt(numStr[0]); int x = Integer.parseInt(numStr[1]); board[y][x] = 1; } for (int i = 0; i < yLen; i++) { for (int j = 0; j < xLen; j++) { if (!visited[i][j] && board[i][j] == 1) { dfs(i, j); cnt++; } } } sb.append(cnt).append(System.lineSeparator()); } System.out.print(sb.substring(0, sb.length() - 1)); } public static void dfs(int y, int x) { visited[y][x] = true; for (int i = 0; i < 4; i++) { int ny = y + dy[i]; int nx = x + dx[i]; if (ny < 0 || ny >= yLen || nx < 0 || nx >= xLen) continue; if (visited[ny][nx] || board[ny][nx] == 0) continue; dfs(ny, nx); } } } 위 코드를 실행하면 12%, ArrayIndexOutOfBounds가 발생하는데 어떤 부분인지 알 수 있을까요?
안녕하세요 선생님. lower_bound나 upper_bound의 경우 vector의 크기가 n이면 시간복잡도가 n일 것 같은데 이 문제의 경우에 for(int i = 0; i < n; i++){ auto pos = lower_bound(v.begin()~~~) ~~~` } 이면 시간 복잡도가 n^2로 이분탐색하는 것보다 더 클 것 같은데 맞나요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. http://boj.kr/07ed32a221874496820c25211823021a 선생님 안녕하세요 강의 덕분에 많은 도움을 받고 있습니다. 제가 쓴 코드에서 1번으로 하면 정답이 안나오는데 이유를 잘 모르겠어서 질문을 드립니다. 비록 부족한 지식에 정보 공유 부탁 드리겠습니다
http://boj.kr/be44657dbfb64b30ace731e5969c0771 3-D 번 문제 질문드립니다 계속해서 84%에서 틀렸다고 해서 많은 반례들을 넣어봤는데도 해결이 되지 않아 질문드립니다. 제가 풀이한 방식은 우선 선생님처럼 사람 visited 배열, 불 visited 배열 두가지를 만들어 따로 처리해주었고, 하나의 queue를 이용하여 먼저 불을 넣고 그 다음 사람을 넣어서 while 루프를 돌려서 최단거리를 찾았습니다. 만약 사람이 이동하는 곳에 불이 이미 있으면 이동하지 않고, 불이 없고 벽도 없을경우 이동하고 만약 이동한 곳이 가장자리이면 탈출하여 최단거리를 출력하는 방식입니다. 또한 bfs이므로 가장 처음 나오는 답이 최단거리라 판단하여 곧바로 break를 걸고 출력하였습니다.
선생님 수업 잘듣고있습니다. 다름이 아니라 선생님께서 푸신 방법 말고 if(!visited[next]){ q.push(next); visited[next]=visited[now]+1; cnt[next]+=cnt[now]; v[next].push_back(now); } 이런식으로 인접 리스트를 만들어서 구현을 해보고싶은데 계속해서 에러가 발생됩니다. 도와주실 수 있으신가요? 감사합니다
안녕하세요, 전자는 에러나고 후자는 ok인데, 그 이유가 "string literal은 constant array of chars이므로, pointer 또한 const이어야 한다"라고 다른 곳에서 설명을 봤습니다.( https://stackoverflow.com/questions/61601872/why-do-string-literals-char-in-c-have-to-be-constants ) 이 설명과 "기호적 상수"개념이 어떻게 연결될 수 있는지 궁금합니다. (사실 지금 예시에서 "기호적 상수"가 어떤 의미인지 제대로 모르겠습니다.)