개요 : 처음으로 연산자 우선순위 때문에 데였다
너무나도 부끄럽지만,
여태 살면서 3년간 논리연산자의 우선순위를 전혀 고려하지 않고
문제를 풀고 있었다...;
그러다가 "프로그래머스 크레인 인형뽑기" 를 풀게 되었는데..
https://programmers.co.kr/learn/courses/30/lessons/64061
코딩테스트 연습 - 크레인 인형뽑기 게임
[[0,0,0,0,0],[0,0,1,0,3],[0,2,5,0,1],[4,2,4,4,2],[3,5,1,3,1]] [1,5,3,5,1,2,1,4] 4
programmers.co.kr
1. segmentation fault 왜뜨는건가?
대표적
1. 배열 잘못써서 (범위를 초과, 음수 인덱스 참조)
2. 포인터 잘못써서
고급지게-위키피디아 왈
세그멘테이션 결함은
프로그램이 허용되지 않은 메모리 영역에 접근을 시도하거나,
허용되지 않은 방법으로 메모리 영역에 접근을 시도할 경우 발생한다.
그럼 이 코드를 한번 보자..
논리 연산자에 들어가는 것들의 순서만 바꾼것이다..
자리만 바꿨는데 왜? 맞는데 왜틀려?
2. seg-fault 비교 연산자 우선순위 때문!
그래서 첫번째 경우에서 세그 폴트가 뜨는 이유를
차근차근 보자면!
결론 : 비교 연산중, 좌 -> 우 순서를 고려하고 인덱스가 초과되는지 아닌지 먼저 따진뒤에. 배열접근을 하자
3. 크레인 인형 뽑기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
#include <string>
#include <vector>
#include <stack>
#include <iostream>
using namespace std;
int solution(vector<vector<int>> board, vector<int> moves) {
int answer = 0;
//[y][x] moves = x;
stack<int> Q;
for(int curX : moves)
{
curX--; int curY = 0;
int boardSize = board.size();
while(curY < boardSize && board[curY][curX] == 0){curY++;}
if(curY == boardSize) continue;
cout << board[curY][curX] << '\n';
if(!Q.empty()){
if(Q.top() == board[curY][curX]){answer += 2;Q.pop(); }
else {Q.push(board[curY][curX]);}
}
else
Q.push(board[curY][curX]);
board[curY][curX] = 0;
}
return answer;
}
|
cs |