소개
게시글
질문&답변
2022.02.16
배열 선언
라면이 먹고싶은데 신라면을 먹을지 진라면을 먹을지 고민하는 것과 같습니다. 42번과 43번은 배열로 풀어도되고 벡터로 풀어도 되고 아무런 차이가 없습니다. 배열과 벡터의 차이는 분명히 존재하나, 여기서 42번과 43번의 차이점은 42번은 애초에 main함수안에서만 풀었으므로 전역변수 설정을 하지않아도 되었던 것이고, 43번은 함수를 선언하고 그 함수에서도 배열의 정보가 필요하기 때문에 그냥 편하게 전역변수로 사용해서 main과 Count 함수에서도 사용 할 수 있게 된 것입니다. 만약 벡터든 배열이든 main에서 선언되었으면 Count 함수에서는 배열정보를 사용할수 없으니까요. 배열과 벡터의 차이가 아니라 지역변수인지 전역변수인지의 차이입니다. 보통 정적배열은 입력해야할 맥시멈값이 존재하거나, 입력되어야할 정보갯수를 이미 알고있을 때 보통 사용하고, 동적배열은 말 그대로 코드작성할때는 아직 모르고 런타임때 몇개를 입력할지 알 수 있을때 사용합니다. 프로그래밍 코드 작성에는 정답이 없습니다. 추출해야하는 답만 있을뿐, 코드작성에는 디자인패턴이라는 왕도는 존재하지만, 그렇다고 꼭 이렇게 해야한다는 정해진 것은 아무것도 없습니다. 물론 같은 답을 내놓더라도 잘 짜여진 코드와 못짠코드의 최적화 및 성능 차이는 절대적으로 차이 납니다. 코딩은 미술 시험이라고 생각하시면 됩니다. 제출해야하는 주제 및 장르만 정해져 있고, 그림은 전부 다르지만 같은 장르를 나타냅니다. 그리고 거기서 잘그린 그림만 합격하고 못그린 그림은 탈락하는 것 뿐입니다.
- 0
- 1
- 259
질문&답변
2022.02.16
포문 시작점
0부터 돌리냐 1부터 돌리냐가 중요한 것은 아니고 배열의 어디부분부터 쓸 것인가가 중요합니다. 만일 10개의 데이터를 입력하고 그 중에 n번째를 나타내야하는 문제가 있다면, arr[10] 이라는 배열이 있으면 [0]부터 [9]까지 사용가능하고 갯수는 10칸입니다. 그 중 7번째의 데이터를 출력하려면 [7]이 아니고 [6]을 해야합니다. 배열은 [0]부터 첫번째 이니까요. 그러므로 arr[n-1]이 되겠죠. 근데 보통 문제에 n번째의 위치를 가리키는 문제가 많기때문에, 애초에 arr[11]를 만들어서 [0]번째 인덱스는 버리고 [1]부터 [10]까지 10개를 사용하는 겁니다. 이러면 7번째 데이터 출력할 때 그냥 [7] 입력하면 됩니다. 이렇게 사용하면 n번째의 위치를 나타낼때, 바로 [n]를 보내면 나오니 직관성이 쉬워지는 장점이 있지만, [0]번째 라는 한 칸을 버리게 되므로 메모리가 낭비 됩니다. 하지만 이런 코딩테스트에서는 문제 없습니다. 한마디로 0부터 시작하는거나 1부터 시작하는것은 아무런 의미가없습니다 중요한건 몇 번의 포문을 돌고 올바른 답을 내는가가 중요합니다.
- 0
- 1
- 208
질문&답변
2022.01.19
이 오류는 왜 뜨는 걸까요?
C6054 | Microsoft Docs 문자열은 반드시 마지막에 널문자가 삽입 되어야합니다. char data[10]을 전부 다 사용한다면, 총 10개의 데이터칸에서 9개를 사용하고 나머지 [9]에는 널문자가 삽입 되어야합니다. 문자열을 "Hello"를 입력하셧으면 [0]~[4]까지는 문자 [5]에는 널문자 이겠네요. 그렇기때문에 컴파일러에서 경고를 합니다. strlen은 널문자가 있을때까지 읽는 함수인데, 질문자님 코드로 작성하게 되면 scanf로 입력을 받고 바로 for문으로 검사하니 사용자가 널문자 까지 알차게 잘 넣을지, 혹은 오버해서 넣진 않을지 알 수가 없고, 이걸 런타임 때 밖에 알수 밖에없는데 이때 사용자가 실수로 널문자가 있어야하는 칸을 오버해서 기입을 한다면 크래시가 나면서 프로그램이 강제로 중단 됩니다. 극단적인 예를 들어, 게임을 다운받고 캐릭터 닉네임을 길게 작성했는데, 게임에서 허용한 닉네임 배열보다 더 길게 작성해 버렸다고 게임이 그냥 오류가 나면서 강제로 꺼지는 상황이 있으면 안되기 때문에, 그런걸 미연에 방지하기위해 혹여나 하고 경고해 준다고 생각하시면 됩니다. (이해를 돕기위한 예시입니다.) 꼭 strlen을 사용하고 싶으시면 위에 if문으로 널체크 하시면됩니다. char data[10] = { 0 }; // 초기화 if(data[9] != '\0') // 널 체크 return 0; for (int i = 0; i { } 꼭 문자열이 아니더라도 포인터를 사용하시면 반드시 제일 먼저 널체크는 필수 입니다. 널체크를 안하시더라고 오류는 나지않지만, 프로그램의 안전성을 위해서 꼭 해야한다고 생각합니다.
- 0
- 1
- 5.7K
질문&답변
2022.01.13
"11번) 숫자의 총 개수(small)" 에 관해 질문있습니다! (실행시간측정관련)
틱계산을 하실거면 키보드로부터 입력받기전부터 start를 입력받으시면 안되고 계산을 시작하는 for문 위부터 측정 하시면됩니다. 컴파일 시간이 오래걸리냐 적게 걸리냐는 컴퓨터 사양에따라서 천차만별입니다. 컴 사양에따라 게임 로딩 속도가 달라지는 것처럼 생각하시면 됩니다. 요즘 컴퓨터로는 대부분 간단한 로직에서 1~2초이상 걸리면 매우 느린편입니다. 이런 경우에는 대부분 알고리즘을 다시 짜야합니다.
- 0
- 1
- 253
질문&답변
2021.12.30
질문있습니다!
마지막 else q.push(x) 를 하셨는데, 본문대로 작성하시면 위에 if문를 실행하고도 다음 if을 또 실행 하게됩니다. else if (x == 0 && q.empty()) printf("-1\n"); 를 하게되면 위의 if (x == 0 && !q.empty()) 까지 묶여서 if (x == 0 && !q.empty()) else if (x == 0 && q.empty()) printf("-1\n"); else q.push(x); 이 3개가 한세트지만 else if를 사용하지않으면 if (x == 0 && !q.empty()) 이건 따로고 if (x == 0 && q.empty()) printf("-1\n"); else q.push(x); 만 세트입니다. 그래서 0을 입력하셨을때 위에서 if (x == 0 && !q.empty())를 실행하고 바로아래의 if (x == 0 && q.empty()) printf("-1\n"); 가 실행되고, 조건이 부합하지않으니 당연히 else인 q.push가 실행되어서 q에 0이 입력되기때문에 3 0 0이 출력됩니다. 그러나 else if를 추가하면 3개가 한세트가 되기때문에 맨위의 if (x == 0 && !q.empty()) 가 실행되면 자연스럽게 아래의 else if문과 else가 무시됩니다. 그래서 0이 입력되었을 때 else q.push(x)가 실행되지않으니, q에 0이 들어가지 않습니다.
- 0
- 1
- 159