Level1
언어 : C++
- board 배열은 2차원 배열로 크기는 "5 x 5" 이상 "30 x 30" 이하입니다.
- board의 각 칸에는 0 이상 100 이하인 정수가 담겨있습니다.
- 0은 빈 칸을 나타냅니다.
- 1 ~ 100의 각 숫자는 각기 다른 인형의 모양을 의미하며 같은 숫자는 같은 모양의 인형을 나타냅니다.
- moves 배열의 크기는 1 이상 1,000 이하입니다.
- moves 배열 각 원소들의 값은 1 이상이며 board 배열의 가로 크기 이하인 자연수입니다.
(자세한 문제 설명은 하단 링크 참조!)
#include <string>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int solution(vector<vector<int>> board, vector<int> moves) {
int answer = 0;
int i, j, check = 0;
int m_size, b_size = 0;
vector<int> result; // 크레인으로 뽑은 인형을 놓을 공간
m_size = moves.size();
b_size = board.size();
for(i=0; i<m_size; i++)
{
for(j=0; j<b_size; j++)
{
if(board[j][moves[i]-1] != 0) // 크레인으로 뽑을 위치가 빈 곳인지 체크
{
result.push_back(board[j][moves[i]-1]); // result 벡터에 뽑은 인형 삽입
board[j][moves[i]-1] = 0; // 인형을 뽑은 위치는 0 으로 초기화
break;
}
}
}
while(1)
{
check = 0;
for(i=0; i<result.size(); i++)
{
if((i != (result.size()-1)) && (result[i] == result[i+1])) // result 벡터 안의 값들을 서로 비교
{
result[i] = 0; // 인접해있는 두 개의 값이 같으면 0 으로 초기화
result[i+1] = 0; // 인접해있는 두 개의 값이 같으면 0 으로 초기화
answer += 2; // 두 개의 인형이 사라졌으므로 카운트는 2 증가
check = 1; // 인형이 사라지는 액션이 일어났는지 체크
}
}
if(check == 1) // 인형이 사라진 이력이 있으면 result 벡터의 처음부터 끝까지 탐색하며 0 인 값 위치 삭제
{
result.erase(remove(result.begin(), result.end(), 0), result.end());
}
else // 인형이 사라진 이력이 없으면 while 문 종료
{
break;
}
}
return answer;
}
*******************************************************************************************************
스트레스를 유발했던 문제였다.

계속 테스트케이스 1개만 'segmentation fault'가 발생해서 통과를 못했다.
검색해보니 웬만하면 잘못된 메모리 참조로 인해서 발생하는 에러라고 한다.
vector 크기나.. for문을 돌리면서 잘못 참조하고 있는곳이 있나 확인해도
특별히 눈에 들어오는 곳이 없었다..
결과적으로 고려하지 못한 테스트 케이스는 입력으로 들어오는 벡터의 값이 모두 0 인 경우였다.
<< ex: [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] >>
문제 설명에도
'board의 각 칸에는 0 이상 100 이하인 정수가 담겨있습니다.'
라는 말이 있는 만큼 벡터의 요소가 모두 0일수가 있었다.
그렇게 되면 크레인으로 뽑을 수 있는 인형은 없고, 결과적으로 result 벡터의 크기는 0이 된다.
for(i=0; i<result.size()-1; i++) // result 벡터의 크기가 0 이므로 (-1)을 하면 잘못된 메모리 참조가 발생한다.
{
if(result[i] == result[i+1])
{
result[i] = 0;
result[i+1] = 0;
answer += 2;
check = 1;
}
}
for(i=0; i<result.size(); i++)
{
if((i != (result.size()-1)) && (result[i] == result[i+1]))
{
result[i] = 0;
result[i+1] = 0;
answer += 2;
check = 1;
}
}
따라서 문제가 발생하는 위 코드의 for문을 수정해서 발생할 수 있는 예외를 처리하니

통과할 수 있었다..
난 아직 갈길이 먼 듯 하다.
코드도 너무 길고.. 지저분하고..
일단은 통과하는것에 의의를..!
*******************************************************************************************************
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/64061?language=cpp
'공부' 카테고리의 다른 글
| (프로그래머스)K번째수 (0) | 2021.10.27 |
|---|---|
| (프로그래머스)내적 (0) | 2021.10.18 |
| (프로그래머스)신규 아이디 추천 (0) | 2021.10.14 |
| C++_TIL (0) | 2021.10.13 |
| (프로그래머스)음양 더하기 (0) | 2021.10.08 |
댓글