[C/C++] segmentation fault (core dumped) 맞는데 왜 틀려 싶다면! [프로그래머스 크레인 인형뽑기] 연산자 우선순위
카테고리 없음

[C/C++] segmentation fault (core dumped) 맞는데 왜 틀려 싶다면! [프로그래머스 크레인 인형뽑기] 연산자 우선순위

개요 : 처음으로 연산자 우선순위 때문에 데였다

너무나도 부끄럽지만,
여태 살면서 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