‡ CODING TEST STUDY ‡/º 프로그래머스

프로그래머스 [Lv1] | 크레인 인형뽑기 게임

Trudy | 송연 2023. 7. 27. 15:39

 

2019 카카오 개발자 겨울 인턴십
 
 
 

 

향상된 for문

벡터, 2차원 벡터

vector 클래쓰에서 사용할 수 있는 함수에 대해 공부합시다!

C++ STL> Vector Container 에 대해 알아보자.(2차원 vector 사용) (tistory.com)

vector<int> v;

v.at(index); // index 번째 원소를 리턴한다. v[index] 보다는 느리지만 범위를 점검한다.

v.front(); //첫 번째 원소를 리턴한다

v.back(); // 마지막 원소를 리턴한다.

v.clear(); // 모든 원소를 제거한다. 그러나 원소만 제거하고 메모리에 vector는 그대로 있다.

벡터의 삽입/삭제

v.push_back(1); // 마지막 원소 뒤에 원소 1을 삽입한다.

v.insert(2, 3); // 2번째 위치에서 3의 값을 삽입하고 삽입한 곳의 iterator를 반환한다.

v.pop_back(); // 마지막 원소를 제거한다.


이 정도만 처음에 구현하고 돌려보니 error가 발생함. 내가 요놈 잘 알지. 저저번 문제인가에서 인덱스 범위 잘못 설정했다고 날 괴롭혔던 놈

그래서 코드를 이렇게만 cout문을 적절히 넣어놓고 몇개 주석처리를 한 후 다시 돌리니 이렇게 됨

뭐지..아무리 생각해도 잘 됐는데 moves의 첫번째 원소가 돌아갈때 왜 0 - 0 - 4 - 4 로 찍히는 걸까.. board[0][1], board[1][1], board[2][1], board[3][1]로 while문을 돌아서 1: 0 - 0 - 0 - 4 가 찍히길 기대했는데 1: 0 - 0 - 4 - 4 다.

와 바보. j++ 한 후에 출력문 작성했어 아놔.. 오키 이런

와 혹시나해서

이렇게 바꿨더니 에러 안뜸ㅠㅠ 접근을 할 수 없었구나... 오키..

와 근데 또 실행하니까 또 같은 에러가 뜸. 그래서 저것도 아니라면 내가 벡터를 사용하는 방법이 틀렸구나 싶어서 포스팅들을 찾아봤는데 진짜 뭔지 모르겠다. 뭐지?

[C++] Vector (벡터) : 네이버 블로그 (naver.com)

[C++ STL] 2차원 vector 선언 및 사용법 :: 코오오오딩 (tistory.com)

 

b[j][i-1]을 bucket[] 에 push_back을 해줬으니 인형을 뽑아간 자리가 비게 해줘야하잖아 그래서 b[j][i-1] = 0을 해주려던 건데 이것만 하면 위 segmentation fault(core dumped) error가 뜬다는 것임.

그래서 j와 i-1을 확인하려고 cout문을 써줬고, 인형뽑기 2차원 배열까지 출력해줌.

이렇게 문제의 b[j][i-1] = 0 을 주석처리 해주고, 첫번째 뽑기에서 b[3][0] = 0 을 직접 하드코딩을 해줬더니 저건 실행이 잘됨.

따라서 인덱스 범위를 잘못 접근하게 한게 아니고

j=3, i-1=0인데

b[3][0]] = 0 은 실행이 잘되고,

b[j][i-1] = 0은 core dumped 문제가 발생하는 것임

(ㅋㅋㅋㅋ)

 

[오류] signal: segmentation fault (core dumped) — JOFTWARE

내가 아는...내용이였구요. 잘못된 메모리 참조 때문에 발생. 즉, 건드리지 말아야할 곳을 건드려서 발생

근데 찾아보니까 죄다 이 내용밖에 없어서 다른 원인은 아닐 것 같다는 생각이 듦

그러다가 혹시 저기서 에러가 난게 아니라 for문을 돌다가 어느 순간에 이상한 곳을 참조한 것은 아닐까...............?

그래서 이번에는 bucket에 원소를 추가하고 잘들어갔겠거니 하고 출력은 안해봤었는데 출력해봤더니 잘 들어가고 있었음 이게 아닌데..

 
 

그렇다면 이것도 아니고.. 다시 한번 에러에 대해 찾아봄

아무리 생각해도 잘 j와 i에 들어갔는데 왜 안됐을까....하다가 발견됨 진짜 이거구나..... 바..바카야로

진짜 내 자신 바카,,,야로

1을 3번 접근해서 인형이 다 비었는데 그 뒤에까지 접근을 해서 쓰레기를 읽었던 것. 쓰레기를 읽고 또 0을 대입하려고 했으니 core dumped라고 컴퓨터가 성을 내신거였음. 안된다고 여기는. ㅋㅋㅋㅋㅋ 재밌다 진짜

역시 컴퓨터는 거짓말 안해......^__ㅠ

2차원 벡터의 열/행 크기 구하는 법

size() 이용

2차원 "벡터"의 열/행의 크기를 구하려면

arr.size()를 이용하면 됨!

을 구하기 위해선 arr.size()를 하면 되고

을 구하기 위해선 arr[0].size()를 하면된다.

C++ vector<vector<int> > 2차원 벡터의 크기 (tistory.com)


그렇게 고민고민고민을 하다가 벡터를 잘못사용한것도 아니고, core dumped도 이제 안뜨는데 출력문이 너무 길단다. b[j][i-1] = 0 만 넣으려고 하면 돌아가지 않는..

그래서 다 아니고 일단 while문을 한번 바꿔볼까하고 for문으로 바꿔봄. 그랬더니 되는거;;;;;;;;;;;;;;; 일주일 동안 똥 싸다가 쌌는데 염소똥처럼 손톱만한 똥 싼 기분이였음 왜냐면 원래 코드에서 왜 그랬는지 해결이 안됐어.. while문 잘 안쓰는데 랜만에 써봤는데 뭐가 문제였을까 아직도 모르겠다. 사람은 역시 한결같아야해

그래서 제 문제의 코드를 올립니다^^

#include <string> #include <vector> #include <iostream> using namespace std; int solution(vector<vector<int>> board, vector<int> moves) { int answer = 0; vector<int> bucket; vector<vector<int>> b = board; for(int i : moves){ int j = 0; while(b[j][i-1] == 0 ){ if(j < (b.size()-1)) j++; } if(b[j][i-1] != 0) { bucket.push_back(b[j][i-1]); //문제의 코드. 이거 주석처리 한 것과 안 한 것의 결과가 아래와 같음 b[j][i-1] = 0; } } return answer; }
 
 

왼 : 주석처리 x / 오 : 주석 처리 o

 

그리고 저 while문을 for문으로 바꾼 것은

for(int j = 0; j < b.size(); j++){ if(b[j][i-1] == 0) cout << b[j][i-1] << " - "; else{ bucket.push_back(b[j][i-1]); b[j][i-1] = 0; break; } }

 

 이제 다시 문제로 돌아가서 bucket에서 동일한 원소를 지워주고 answer++ 시켜주는 코드만 완성시켜볼게요..

그렇게 마무리시킨 나의 코드는.. for문안에 if문 하나만 추가해줌

#include <string> #include <vector> #include <iostream> using namespace std; int solution(vector<vector<int>> board, vector<int> moves) { int answer = 0; vector<int> bucket; vector<vector<int>> b = board; for(int i : moves){ int j = 0; for(int j = 0; j < b.size(); j++){ if(b[j][i-1] != 0){ bucket.push_back(b[j][i-1]); if((bucket.size() > 1) && (bucket[bucket.size()-1] == bucket[bucket.size()-2])){ bucket.pop_back(); bucket.pop_back(); answer += 2; } b[j][i-1] = 0; break; } } } return answer; }


다른 사람의 풀이 한개만 살펴볼게유

#include <stack> 해서 스택 함수들을 이용하심.


네.. 그렇게 역대급 블랙홀에 걸려서 역대급 힘들었던 문제가 드디어 끝이 났네요

난 문제를 읽으면 생각을 거의 안하고 일단 코드를 써내려가면서 생각함. 이걸 고쳐야할거같다.. 일단 완전 꼼꼼히 문제를 읽고, 적어도 1분은 어케어케 할지 생각하고 풀기!!! 이걸 담부턴 해볼게요. 넴. 안녕히 계세요..