이 문제의 경우 내가 본 코테에서 나온 문제를 임의로 각색한 문제이다. 충분히 풀 수 있는 문제였으나 배가 고파서 못풀었지만 생각하니까 매우 쉬운 문제였다.. 이래서 아침밥이 중요한가 보다.

#include <iostream>
#include <stack>
#include <vector>
using namespace std;
int arr[1001][1001];
bool visited[1001][1001];
int main() {

	int N;
	cin >> N;
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			cin >> arr[i][j];
		}
	}
	int hp=100;
	int maxhp = 100;
	int startX, startY;
	stack<pair<int, int>> bfss;
	cin >> startX >> startY;
	bfss.push(make_pair(startX, startY));

	while (!bfss.empty()) {
		startX = bfss.top().first;
		startY = bfss.top().second;
		visited[startX][startY] = true;
		if (arr[startX][startY] == 1) {

		}
		else if (arr[startX][startY == 2]) {
			hp -= 20;
			if (hp <= 0) {
				break;
			}

		}
		else if (arr[startX][startY] == 3) {
			hp += 30;
			arr[startX][startY] = 1;
		}

		if (startX + 1 < N && !visited[startX + 1][startY]&&arr[startX+1][startY]!=0) {
			bfss.push(make_pair(startX + 1, startY));
		}
		else if (startX - 1 >= 0 && !visited[startX - 1][startY]&& arr[startX - 1][startY]!=0) {
			bfss.push(make_pair(startX - 1, startY));
		}
		else if (startY - 1 >= 0 && !visited[startX][startY - 1]&& arr[startX][startY - 1]!=0) {
			bfss.push(make_pair(startX, startY - 1));
		}
		else if (startY + 1 < N && !visited[startX][startY + 1]&& arr[startX][startY + 1]!=0) {
			bfss.push(make_pair(startX, startY + 1));
		}
		else {
			bfss.pop();
		}
	}
	cout << hp;
}

문제: 플레이어는 N x N 던전 안에 있다 이때 플레이어는 자신이 갈 수 있는 모든 곳을 탐험 해야 한다. 이 던전에는 몬스터방 물약방 일반방이 있으며 몬스터방에 들어갔을 시 몬스터는 잡지 못하고 플레이어의 피가 20 감소한다 물약방에 들어가면 그 방은 일반 방으로 바뀌고 플레이어의 피가 30이 증가한다. 플레이어가 던전을 모두 돌고 나서의 플레이어의 HP를 출력하라. 플레이어의 HP가 0일시 즉시 탐험을 종료하고 0을 출력한다.

출력 예시:

3
1 3 1
0 2 0
0 2 0
0 0

정답:40

https://school.programmers.co.kr/learn/courses/30/lessons/12914?language=cpp 

 

프로그래머스

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

programmers.co.kr

이 문제의 경우 백준의 dp문제에 항상 시달리던내가 풀기에도 쉬운 문제였다 처음 이문제를 풀때는 dfs로 접근해볼까라는 생각을 하고 풀어보았다 하지만 dfs의 특징상 하나한 다해보기때문에 경우의 수가 기하급수적으로 늘어나 시간복잡도가 무지막지하게 늘어나는 현상을 보여주었기 떄문에 결국에 이전값을 사용하는 dp로 이문제를 풀었다 이문제의 경우 어떠한 발판에 도착하는  경우의 수는 총 2가지이다 내 2번째  전 발판에서 오거나 내 저에 발판에서 오거나 이다. 2번째 발판 전도 마찬가지고 전 발판들도 똑같다 즉 나까지 도착하는 경우의수는 내 2번째전 발판까지 오는 경우의수와 나의 전 발판 까지 오는 경우의 수의 합이다. 이에 점화식은 

 dp[i] = (dp[i - 1] + dp[i - 2]) 이것이다

long long dp[2001];
long long solution(int n) {
    dp[0] = 1;
    dp[1] = 1;
    dp[2] = 2;
    for (int i = 3; i <= n; i++) {
        dp[i] = (dp[i - 1] + dp[i - 2])%1234567;
    }
    long long answer = dp[n];
    return answer;
}

'프로그래머스(코테준비)' 카테고리의 다른 글

게임회사 문제 각색  (0) 2023.06.13
프로그래머스 lv2 최댓값 최솟값  (0) 2022.12.28
프로그래머스 [3차] 압축  (0) 2022.12.27

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

 

프로그래머스

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

programmers.co.kr

프로그래머스를 풀면서 느끼고 있는게 기업 코테에서 문자열 처리가 은근 많이 나오는거 같다 그래서 나도 기존에 c++로 문자열 파싱까지 했었는데 문자열 관련 구현은 c++ 로 하기에는 시간적으로 많이 부족한거 같다. 이에 기본적으로 문자열 처리에 많은 도움을 주는 파이썬을 사용해서 문자열 처리 문제는 앞으로 처리 하기로 했다 실제로 c++로 구현하면 엄청 오래걸릴 코드들도 파이썬의 문자열 인덱싱 기능만 사용하면 빠른시간안에 끝난다. 이번문제는 이러한 이유로 파이썬으로 풀었다 c++로 풀고싶지는 않다 이러한 문제를 일단 이문제는 그냥 쉽다 파이썬의 split을 이용해서 빈칸으로 각 요소들을을 분할해주고 그 list들의 요소들의 값을 서로 비교해서 최대 최솟값을 구한다이다. 아마도 코드를 보면 이해가 쉽게 될 것 이다

def solution(s):
    answer = ''
    a = []
    s = s.split(' ')
    for i in s:
        a.append(int(i))

    max=a[0]
    min=a[0]
    for i in a:
        if i >max:
            max=i
        if i<min:
            min=i
    answer=answer+str(min)
    answer=answer+" "
    answer=answer+str(max)
    return answer

'프로그래머스(코테준비)' 카테고리의 다른 글

게임회사 문제 각색  (0) 2023.06.13
프로그래머스 lv2 멀리 뛰기  (0) 2023.01.02
프로그래머스 [3차] 압축  (0) 2022.12.27

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

 

프로그래머스

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

programmers.co.kr

백준만 풀다가 프로그래머스 문제가 빡세다고 해서 풀어보았다 개어렵다 kakao의 문제는 문자열 위주로 코딩테스트?가 진행 되는건가 싶었는데 오늘 풀고 나서 kakao의 문제는 대부분 문자열 처리인 거 같다는 생각을 했다 오늘 진행한건 일단 lv2  였는데 저녁을 안먹어서 그런지 오지게 안풀렸다 일단 이문제를 푸는데 약 1시간 반정도 걸렸으니 실제로 이문제가 나왔으면 코테에서 널어졌을 거 같다. 나는 일단 이문제를 이렇게 생각했다 사전에서 일단 1개의 문자가 맞는지 탐색한다 맞으면 자신과 자신의 다음문자를 합쳐서 나 이후로 검사한다 만약 또나온다면 합친 문자열에 또 그 다음문자를 합쳐서 검색한다. 그 후 반복이 끝나면 합치기 전에 나의 index를 저장 한다. 이 index는 즉 문자들을 합쳤을때 최종적으로 벡터에 존재하는 문자열을 의미한다.

#include<iostream>
#include<vector>
#include<string>
using namespace std;
vector<int> solution(string msg) {
    vector<int> answer;
    char start = 'A';
    int k = 0;
    vector<string> dictionary;
    for (int i = 1; i <= 26; i++) {
        dictionary.push_back(string(1, start));
        start++;
    }


    for (int i = 0; i < msg.length(); i++) {
        string temp = string(1,msg[i]);
        int endnumber=0;
        for (int j = 0; j < dictionary.size(); j++) {
            if (temp == dictionary[j]) {
                temp = temp + msg[i += 1];
                endnumber = j+1;
            }
        }
        answer.push_back(endnumber);
        if ((i) == msg.length()) {
            continue;
        }
        dictionary.push_back(temp);
        if (i >= 1) {
            i = i - 1;
        }
    }
    return answer;
}
int main() {
    vector<int> answe1r;
    answe1r=solution("TOBEORNOTTOBEORTOBEORNOT");
    for (int i = 0; i < answe1r.size(); i++) {
        cout << answe1r[i] << '\n';
    }
    
}

+ Recent posts