nukw0n
찐이의 개발 연결구과
nukw0n
전체 방문자
오늘
어제
  • 분류 전체보기 (38)
    • 유연해지기 (21)
      • React.js (11)
      • Javascript (5)
      • webpack & babel (1)
      • etc. (4)
      • Next.js (0)
    • 단단해지기 (13)
      • Algorithm (9)
      • Computer Science (4)
    • 속닥속닥 (4)
    • 책읽는 남자 (0)

블로그 메뉴

    공지사항

    인기 글

    태그

    • Batching
    • history API
    • 백준
    • React 18
    • Error Boundary
    • sass vs postcss
    • useBuiltIns
    • javascript
    • 프로그래머스
    • bfs
    • vanilla spa
    • React
    • intersectionobserver api
    • error 안 뜸
    • fallback UI
    • 콜백 ref
    • vallia 라우터
    • Auto Batching
    • 알고리즘
    • dfs

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    nukw0n

    찐이의 개발 연결구과

    단단해지기/Algorithm

    [백준/BOJ 알고리즘] 3190 뱀 C++

    2020. 9. 2. 17:00

    > https://www.acmicpc.net/problem/3190

     

    3190번: 뱀

     'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임

    www.acmicpc.net

    문제 설명이 잘 돼 있어 재밌게 풀었던 문제이다.

     

    좌표를 나타내기 위해 pair를 사용하였다.

     

    뱀이 차지하고 있는 공간(?)의 좌표를 큐에 담도록 한다.

    기본적으로 뱀이 이동할 때 머리가 한칸 전진하고, 꼬리가 따라온다.

    사과를 먹었다면 머리만 전진한다고 생각하면 이해가 쉽다. 

     

    • 머리가 한칸 전진 : 새로운 좌표를 큐의 front에 PUSH
    • 꼬리가 따라옴 : 큐의 end 값을 POP 

    사과를 먹을 때 뱀이 길어진다. 사과의 좌표는 apple 배열에 담긴다.

    뱀의 방향 전환 시간과 방향은 move 배열에 담긴다. 

    방향 전환은 dir 배열에 상하좌우 값을 넣어놓고 나머지 연산을 통해 사용했다.

     

    #include <stdio.h>
    #include <deque>
    using namespace std;
    typedef std::pair<int, int> pr;
    int main(){
        pr dir[4] = {make_pair(0,1),make_pair(1,0),make_pair(0,-1),make_pair(-1,0)}, apple[101];
    
        int move[10001] ={0, };
        int n, num_apple, idx_apple_x,idx_apple_y, l, l_time, time=1, dir_idx=0, exitFlag=0;
        char l_dir;
        deque<pr> q;
        deque<pr>::iterator iter;
        
        scanf("%d",&n);
        scanf("%d",&num_apple);
        for(int i=0;i<num_apple;i++){
            scanf("%d %d",&idx_apple_x,&idx_apple_y);
            apple[i] = make_pair(idx_apple_x,idx_apple_y);
        } 
        scanf("%d",&l);
        for(int i=0;i<l;i++){
            scanf("%d %c",&l_time, &l_dir);
            move[l_time] = l_dir;
        }
    
        pr now = make_pair(1,1);
        q.push_back(now);
    
        while(1) {
            now.first += dir[dir_idx].first;
            now.second += dir[dir_idx].second;
    
            if(now.first <= 0 || now.second <= 0 || now.first > n || now.second > n){
                // 뱀이 벽을 만난 경우
                break;
            } else {
                for(iter = q.begin(); iter != q.end(); iter++) {
                    if( (*iter).first == now.first && (*iter).second == now.second ){
                        // 뱀이 자기 자신을 만난 경우
                        exitFlag = 1; 
                        break;
                    }
                }
                if(exitFlag) break;
            }
            int isApple = 0;
            // 이미 먹은 사과인지 판별하기 위한 변수.
            for(int i=0;i<=num_apple;i++) {
                if(now.first == apple[i].first && now.second == apple[i].second) {
                    isApple=1;
                    apple[i].first = -100;
                    apple[i].second = -100;
                    // 먹은 사과는 치워버린다.
                }     
            }
            if(!isApple) q.pop_back(); // 사과가 없으니 꼬리도 같이 전진
            
            q.push_front(now); // 머리 전진 
    
            if(move[time]){
                // 방향을 전환하는 시간인지 판별. 사용자가 입력한 인덱스 외에는 모두 0 이므로 조건문 통과 불가
                if(move[time] == 'D') dir_idx = ++dir_idx%4;
                else if(move[time] == 'L') dir_idx = (dir_idx+3)%4;
            } 
            time++;
        }
        printf("%d",time);
        return 0;
    }

     

    * 첫 포스트입니다. 하하 

    * 코드에 대한 피드백은 언제나 환영합니다.

     

     

    '단단해지기 > Algorithm' 카테고리의 다른 글

    [백준/BOJ 알고리즘] 17845 수강 과목 C++  (0) 2021.09.12
    [백준/BOJ 알고리즘] 10830 행렬 제곱 C++  (0) 2021.09.12
    [백준/BOJ 알고리즘] 16236 아기상어 C++  (0) 2020.09.17
    [백준/BOJ 알고리즘] 1039 교환 C++  (1) 2020.09.10
    [백준/BOJ 알고리즘] 2573 빙산 C++  (1) 2020.09.07
      '단단해지기/Algorithm' 카테고리의 다른 글
      • [백준/BOJ 알고리즘] 10830 행렬 제곱 C++
      • [백준/BOJ 알고리즘] 16236 아기상어 C++
      • [백준/BOJ 알고리즘] 1039 교환 C++
      • [백준/BOJ 알고리즘] 2573 빙산 C++
      nukw0n
      nukw0n
      프론트엔드 개발자 권혁진입니다.

      티스토리툴바