되면한다

프로그래머스 - 경주로 건설 본문

코딩테스트준비

프로그래머스 - 경주로 건설

haeullee 2023. 10. 8. 23:05

https://school.programmers.co.kr/learn/courses/30/lessons/67259

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 특징

  • bfs

 

2. 구현 방법

  • 기본적인 bfs의 이차원 dist[][]를 3차원 cost[][][] (x, y, 방향)으로 나타냄
  • cost를 INT_MAX로 초기화
  • bfs를 돌면서, 다음(nx, ny)으로의 방향과 현재(curx, cury3)로의 방향을 비교하면서 cost 배열을 갱신함

3. 코드

#include <bits/stdc++.h>

using namespace std;

int cost[27][27][3]; //cost(x, y, 방향) = 가격
int dx[4] = {0, 0, -1, 1}; 
int dy[4] = {-1, 1, 0, 0};

int solution(vector<vector<int>> board) {
    int answer = 0;
    int n = board.size();
    
    fill(&cost[0][0][0], &cost[26][26][2], INT_MAX);
    
    queue<tuple<int, int, int>> q; // x y 방향(수평: 0, 수직: 1)
    q.push(make_tuple(0, 0, -1));  //맨처음에는 방향이 없기 때문에 방향을 -1로 설정
    cost[0][0][0] = 0; cost[0][0][1] = 0; 
    
    while(!q.empty())
    {
        
        int curx, cury, curdir;
        tie(curx, cury, curdir) = q.front(); 
        q.pop();
        
        for(int dir = 0; dir < 4; dir++) //좌, 우, 위, 아래
        {
            int nx = curx + dx[dir];
            int ny = cury + dy[dir];
            int ndir = -1;
            if(dir == 0 || dir == 1) ndir = 0; //ndir = 1
            if(dir == 2 || dir == 3) ndir = 1;
            
            
            if(nx < 0 || nx > n-1 || ny < 0 || ny > n-1) continue;
            if(board[nx][ny] == 1) continue;
            int newcost = -1;
            //다음으로 갈 곳의 방향과 이전 방향이 같으면 혹은 맨처음 시작이면(curx == 0 && cury == 0)
            if((ndir == 0 && curdir == 0) || (ndir == 1 && curdir == 1) || curdir == -1) 
            {
                newcost = cost[curx][cury][ndir] + 100;
            }
            //다음으로 갈 곳의 방향과 이전 방향이 다르면
            if((ndir == 0 && curdir == 1) || (ndir == 1 && curdir == 0))
            {
                newcost = cost[curx][cury][curdir] + 100 + 500;
            }
            //새로운 곳으로 가는 가격이 그곳에 있던 기존 값보다 크면 continue;
            if(newcost > cost[nx][ny][ndir]) continue;
            cost[nx][ny][ndir] = newcost;
            q.push(make_tuple(nx, ny, ndir));
         }
        
    }
    
    // for(int i = 0; i < n; i++)
    // {
    //     for(int j = 0; j < n; j++)
    //     {
    //         cout << min(cost[i][j][0], cost[i][j][1]) << ' ';
    //     }
    //     cout << endl;
    // }
    answer = min(cost[n-1][n-1][0], cost[n-1][n-1][1]);
    
    return answer;
}

'코딩테스트준비' 카테고리의 다른 글

프로그래머스 SQL  (0) 2023.10.26
프로그래머스 - 광물 캐기  (0) 2023.10.15
2020 카카오 블라인드 채용  (0) 2023.09.09
백준 - 숨바꼭질 시리즈  (0) 2023.09.06
2019 카카오 개발자 겨울 인턴십  (0) 2023.09.04
Comments