2023. 9. 20. 04:44, 알고리즘/프로그래머스
https://school.programmers.co.kr/learn/courses/30/lessons/120842
#include <string>
#include <vector>
using namespace std;
vector<vector<int>> solution(vector<int> num_list, int n) {
vector<vector<int>> answer;
int col = num_list.size()/n;
int t=0;
for(int i=1; i<=col; i++ ){
vector<int> tmp;
for(int j=0; j<n; j++){
tmp.push_back(num_list[t]);
t++;
}
answer.push_back(tmp);
}
return answer;
}
추가적으로 다른 사람의 풀이를 보니까,
#include <string>
#include <vector>
using namespace std;
vector<vector<int>> solution(vector<int> num_list, int n) {
int r = num_list.size()/n;
vector<vector<int>> answer(r,vector<int>(n));
int ind = 0;
for(int i =0; i < r; ++i)
{
for(int j = 0; j < n; ++j)
{
answer[i][j] = num_list[ind++];
}
}
return answer;
}
이와같이 처음에 solution 함수에서 answer을 선언할때 vector<vector<int>> answer(r,vector<int>(n)); 처럼
사이르를 r행 n열의 사이즈로 answer 벡터를 선언해서 개별 원소에 접근할 수 있게 하는 풀이가 있는데,
만약 선언할때 저런식으로 사이즈를 선언하지 않은 상태에서 answer[i][j]에 대한 접근을 시도해보면,
#include <string>
#include <vector>
using namespace std;
vector<vector<int>> solution(vector<int> num_list, int n) {
int r = num_list.size()/n;
vector<vector<int>> answer;
int ind = 0;
for(int i =0; i < r; ++i)
{
for(int j = 0; j < n; ++j)
{
answer[i][j] = num_list[ind++];
}
}
return answer;
}
이와같은 코드를 작성했을시 실행 결과가,
signal: illegal instruction (core dumped)
테스트 결과 (~˘▾˘)~
2개 중 0개 성공
이와같이 나타나게 된다.
이에 대한 설명을 gpt에 요구해보면
"signal: illegal instruction (core dumped)" 오류는 프로그램이 실행 중에
"비법적인(instruction이 없는) 명령"을 수행하려고 할 때 발생합니다. 이 오류가 나타나는
이유는 다양할 수 있지만, 주로 다음과 같은 이유로 발생할 수 있습니다:
1. **무효한 메모리 참조**: 벡터(vector)나 배열과 같은 자료구조를 잘못된 방식으로 접근하면
메모리 오류가 발생할 수 있습니다. 코드에서 벡터 `answer`의 크기를 초기화하지 않은 상태에서 값을
할당하고 있습니다. 이로 인해 `answer`가 무효한 메모리를 가리키게 되어 오류가 발생할 수 있습니다.
2. **명령어 집합의 불일치**: 실행 중인 프로세서가 특정 명령을 지원하지 않는 경우 발생할 수 있습니다.
이것은 코드가 현재 사용 중인 하드웨어 아키텍처와 호환되지 않는 경우에 발생할 수 있습니다.
3. **소프트웨어 버그**: 코드 내부의 버그나 논리 오류로 인해 잘못된 명령을 실행하려고 시도할 때 발생할
수 있습니다.
`vector`의 크기를 초기화하지 않은 것이 주요 문제로 보입니다. `vector`를 초기화하고 필요한 공간을
할당한 다음 요소를 할당하십시오. 예를 들어, `answer`를 다음과 같이 초기화할 수 있습니다:
```cpp
vector<vector<int>> answer(r, vector<int>(n, 0));
```
이렇게 하면 `r` 행과 `n` 열의 2차원 벡터가 생성되고, 모든 요소가 0으로 초기화됩니다. 그런 다음
반복문을 사용하여 `answer`의 요소에 값을 할당할 수 있습니다. 이렇게 하면 오류가 해결될 것입니다.
이와 같은 답변을 얻을 수 있다.
그러니 다른 사람의 풀이에서 확인한 형태로 개별적인 answer의 원소에 접근하려면 처음 선언할때 사이즈를 선언해주고 접근해야하고,
그때에 사이즈는 초기화 하지만 해당 원소들에 대해서는 초기화를 하지 않더라도 값을 모두 새롭게 쓸것이기 때문에 문제는 발생하지 않는 풀이라는것을 알 수 있다. 혹시 모를 문제를 방지하기 위해서 gpt가 제시해준 형태대로,
vector<vector<int>> answer(r, vector<int>(n,0)); 형태처럼 모든 값을 0으로 초기화 한 상태로 특정한 사이즈를 가지는 vector answer을 선언하는것이 더욱 안전한 방법이라고 생각된다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
Lv 0. 배열 회전시키기 - deque를 쓸려면 <deque> 헤더를 추가하자. 시퀀스 컨테이너에서 rotate() 함수 사용법 (0) | 2023.09.20 |
---|---|
Lv 0. 공 던지기 (0) | 2023.09.20 |
Lv 0. 점의 위치 구하기 (0) | 2023.09.20 |
Lv 0. 구슬을 나누는 경우의 수 *다시 풀어보기* (0) | 2023.09.19 |
Lv 0. 가위 바위 보 (0) | 2023.09.19 |
Comments, Trackbacks