본문 바로가기
일상,취미

다시 시작하는 TIL 20일차

by 진득한진드기 2024. 7. 4.

오늘 한일

 

ㅋㅋㅋㅋ..... 테스트 엔진을 몇번 터트리니까 이제는 엔진 관련 코드를 웬만하면 못짜게 하시는 것 같다 ㅋㅋㅋㅋㅋㅋㅋㅋ

 

윈도우 프로그래밍에서 페이지나 관련 화면 만드는거도 아직 익숙치는 않은데 오늘 표 데이터를 보여줄 때 데이터베이스에서 쿼리를 보내서 데이터를 가져와 표현하는 로직 하는데 정신 나갈뻔 했다.

 

왜 안되는지 너무 불친절하게 알려주고 아무것도 못해서 하루를 날린 기분이랄까......

 

생각보다 사수님이 직접적으로 붙어서 알려주지 않는 이상 회사에서 뭔가 혼자 스스로 깨닫고 알아서 성장하기는 정말 어려운거 같다.

 

이번주 까지 혼자 일해야되는데 앞이 막막하다.

 

뭔가 해내지 못해서 암울한 하루다.

 

 

퇴근 후 한일 

 

오늘은 퇴근하고 고등학교 친구들과 축구를 했다.

 

이후 퇴근하고 오랜만에 알고리즘을 한 문제 풀었는데 약 1시간 30분에 걸쳐 겨우겨우 풀었다.

 

전에는 프로그래머스 레벨 2~3을 풀 때는 1시간 안에는 풀었던거 같은데 오랜만이라서 그런지 좀 많이 버벅거렸다 ㅋㅋㅋㅋㅋ ㅠ

 

PCCP에 출시되었던 석유 시추라는 문제이다.

 

문제 링크는 다음과 같다.

 

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

 

프로그래머스

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

programmers.co.kr

 

 

문제 해결방안은 다음과 같다.

 

석유 시추는 열 단위로 하기 때문에 이중 for문에서 열단위로 먼저 검사를하고 석유 시추를한다(bfs로 시추하고 석유량 체크)

석유 시추중 한번에 시추로 가장 많이 석유를 얻을 수 있는 값은 몇인지 구하는 문제이기에 bfs를 돌렸을때 특정 석유시추가 끝나는 열 좌표와 석유 값을 리턴한다.

 

이후 석유 시추가 완료되면 석유 시추가 시작된 좌표와 끝나는 좌표 그리고 석유량 3개의 값을 배열에 넣는다.

 

마지막으로 석유시추 하듯 하나씩 열을 테스트해서 해당 열에서 시추가 가능한 석유들을 비교해서 가장 큰 값을 얻는다.

 

 

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
int dx[4] = {1,-1,0,0};
int dy[4] = {0,0,1,-1};
int n;
int m;

// 각 시추가 끝나는 좌표, 석유 량 리턴
pair<int,int> checking_oil(vector<vector<int>> &land,int x,int y){
    pair<int,int> p;
    int Y_value = 0;
    int result = 0;
    queue<pair<int,int>> q;
    q.push(make_pair(x,y));
    land[x][y] = 0;
    result++;
    
    while(!q.empty()){
        int sx = q.front().first;
        int sy = q.front().second;
        Y_value = max(sy,Y_value);
        q.pop();
        
        for(int i = 0;i<4;i++){
            int nx = sx + dx[i];
            int ny = sy + dy[i];
            if(0<=nx && nx < n && 0 <= ny && ny < m && land[nx][ny]){
                q.push(make_pair(nx,ny));
                land[nx][ny] = 0;
                result++;
            }
        }
    }
    p.first = result;
    p.second = Y_value;
    return p;
}

int solution(vector<vector<int>> land) {
    int answer = 0;
    
    n = land.size();
    m = land[0].size();
    
    pair<int,int> p;
    vector<pair<pair<int,int>,int>> vec;
    
    for(int j = 0;j<m;j++){
        int count = 0;
        
        // 시추가 시작하는 좌표
        int start = j;
        for(int i = 0;i < n;i++){
            if(land[i][j]){
                p = checking_oil(land,i,j);
                count = p.first;
                vec.push_back({{start,p.second},count});
            }
        }
    }
    
    // 한 열씩 시추해서 가장 큰 값을 가져올 함수
    for(int i = 0;i<m;i++){
        int cnt = 0;
        
        for(int j = 0;j<vec.size();j++){
            if(vec[j].first.first <= i && i <= vec[j].first.second){
                cnt += vec[j].second;
            }
        }
        answer = max(answer,cnt);
    }
    return answer;
}

 

어째 저째 풀었는데 내가 생각해도 좀 괴상하게 푼거 같다.

 

bfs에서 y좌표와 석유량을 가져오고 

 

main에서 따로 vector<pair<pair<int,int>,int> 로 선언해서 푸는것보다 그냥 구조체로 만들어서 푸는게 더 깔끔했을 거 같다.

'일상,취미' 카테고리의 다른 글

다시 시작하는 TIL 22일차  (0) 2024.07.06
다시 시작하는 TIL 21일차  (0) 2024.07.05
다시 시작하는 TIL 19일차  (1) 2024.07.03
다시 시작하는 TIL 18일차  (0) 2024.07.02
다시 시작하는 TIL 17일차  (0) 2024.06.29