hyelie
hyelie
Hyeil Jeong
       
글쓰기    관리    수식입력
  • 전체보기 (495)
    • PS (283)
      • Algorithm (28)
      • PS Log (244)
      • Contest (6)
      • Tips (5)
    • Development (52)
      • Java (14)
      • Spring (23)
      • SQL (2)
      • Node.js (2)
      • Socket.io (3)
      • Study (4)
      • Utils (4)
    • DevOps (36)
      • Git (5)
      • Docker (4)
      • Kubernetes (2)
      • GCP (3)
      • Environment Set Up (8)
      • Tutorial (12)
      • Figma (2)
    • CS (74)
      • OOP (7)
      • OS (24)
      • DB (2)
      • Network (24)
      • Architecture (0)
      • Security (2)
      • Software Design (0)
      • Parallel Computing (15)
    • Project (15)
      • Project N2T (5)
      • Project ASG (0)
      • Project Meerkat (1)
      • Model Checking (7)
      • Ideas (2)
    • 내가 하고싶은 것! (34)
      • Plan (16)
      • Software Maestro (10)
      • 취준 (8)
hELLO · Designed By 정상우.
hyelie

hyelie

PS/PS Log

22.05.17. 풀었던 문제들

1. 아이템 줍기

사각형을 바로 채워버리면 거리가 1일 때 해당 부분이 뭉개진다! 따라서 2배로 scale-up을 해야 풀 수 있었던 문제.

​

​

2. 보행자 천국

방향성을 고려해 주어야 하는 문제였다. 처음에는 회전금지 신호가 있으면 위/또는 아래에서 해당 값을 받아오는 형식으로 구현했는데 이렇게 하면 연속된 회전금지 신호일 경우 잘 나타나지 않았다. 그래서 '현 위치에서 r방향/c방향으로 갈 수 있는 경우의 수'를 만들었다. 그래서 2d vector of pii로 구현했다. dist[r][c].first는 r, c에서 r방향으로 갈 수 있는 경우의 수, .second는 c방향으로 갈 수 있는 경우의 수이다.

 

// 보행자 천국

int MOD = 20170805;

typedef pair<int, int> pii;

// 전역 변수를 정의할 경우 함수 내에 초기화 코드를 꼭 작성해주세요.
int solution(int m, int n, vector<vector<int>> city_map) {
    vector<vector<pii>> dist(m, vector<pii>(n, {0, 0})); // dist[r][c].first : r방향, .second : c방향
    for(int i = 0; i<m; i++){
        if(city_map[i][0] == 1) break;
        dist[i][0].first = 1;
        dist[i][0].second = city_map[i][0] == 2 ? 0 : 1;
    }
    for(int i = 0; i<n; i++){
        if(city_map[0][i] == 1) break;
        dist[0][i].first = city_map[0][i] == 2 ? 0 : 1;
        dist[0][i].second = 1;
    }
    
    for(int r = 1; r<m; r++){
        for(int c = 1; c<n; c++){
            if(city_map[r][c] == 1){ // 정지신호라면 다음으로 넘어가지 못함
                dist[r][c].first = dist[r][c].second = 0;
                continue;
            }
            else if(city_map[r][c] == 2){ // 회전금지 신호라면 r방향은 r-1, c의 r방향만, c방향은 r, c-1의 c방향만 가져올 수 있음.
                dist[r][c].first = dist[r-1][c].first % MOD;
                dist[r][c].second = dist[r][c-1].second % MOD;
            }
            else{ // 방향이 상관없다면 어디든 갈 수 있음. r-1, c의 r방향 + r, c-1방향의 c방향을 가져와 더하면 됨.
                dist[r][c].first = dist[r][c].second = (dist[r-1][c].first % MOD + dist[r][c-1].second % MOD) % MOD;
            }
        }
    }
    
    return dist[m-1][n-1].first;
} // 마지막 좌표의 경우 0인 것이 보장되어 있으므로 이렇게 작성했다.

 

lv 3오니까 까다롭고, 생각해서 풀어야 할 문제가 많다...

'PS > PS Log' 카테고리의 다른 글

22.05.19. 풀었던 문제들  (0) 2022.06.23
22.05.18. 풀었던 문제들  (0) 2022.06.23
22.05.16. 풀었던 문제들  (0) 2022.06.23
22.05.15. 풀었던 문제들  (0) 2022.06.23
22.05.14. 풀었던 문제들  (0) 2022.06.23
    hyelie
    hyelie

    티스토리툴바