쌓고 쌓다
[프로그래머스] 프린터 C++ 풀이 본문
https://school.programmers.co.kr/learn/courses/30/lessons/42587
전체 코드
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int solution(vector<int> priorities, int location) {
int answer = 0;
int cnt=0; // 뽑혀 나간 문서
while(1)
{
bool flag=false;
for(int i=1;i<priorities.size();i++)
{
if(priorities[0]<priorities[i]) // 더 큰 우선순위가 있다면
{
priorities.push_back(priorities[0]); // 맨 뒤에 맨 앞의 원소를 복사해 넣고
priorities.erase(priorities.begin()); // 맨 앞의 원소 삭제
if(location==0) // 목표 문서의 위치가 0번째라면 현재의 문서이다.
location=priorities.size()-1; // 이 문서의 위치는 맨 뒤로.
else // 그게 아니라면 목표 문서의 위치는 앞으로 한칸 땡겨짐
location--;
flag=true; // 더 큰 우선순위 문서가 있음을 알리는 flag를 true로.
break;
}
}
if(flag==false) // 더 큰 우선순위 문서가 존재하지 않는다면.
{
priorities.erase(priorities.begin()); // 바로 출력을 한다.
cnt++; // 뽑힌 문서의 개수 + 1
if(location==0) // 목표 문서가 맨 앞에 있었다면
{
answer=cnt; // 그것은 내가 찾던 문서이다.
break;
}
else
location--; // 그게 아니라면 목표 문서는 앞으로 한칸 땡겨짐
}
}
return answer;
}
문제 풀이
코드에 주석으로 설명을 달아놨기에 간단히 설명하자면
location은 현재 내가 목표로 하는 문서의 위치입니다.
프린터 맨앞에 있는 문서(priorities[0])의 우선순위를 기준으로
뒤에 있는 문서들의 우선순위와 비교합니다.
1. 우선순위가 더 큰 문서가 존재한다면
맨 앞의 문서를 맨뒤로 보낸다.
그러면 변수 location의 조정이 필요하다,왜냐하면 맨 앞의 문서를 맨뒤로 보냄으로써 상대적인 위치가 변경되기 때문이다.
이때 location이 0이라면 맨 앞의 문서가 내가 원하던 문서인데 맨 뒤로 간것이므로 목표 문서의 위치 location을 vector 사이즈 -1로하여 맨 뒤에 위치하게 한다.
location이 0이 아니라면 내가 목표하던 문서의 위치가 한칸 앞으로 당겨진다. 그래서 location-- 를 해준다.
그리고 더 큰 문서가 존재함을 알리는 flag 변수를 true로 표시한다.
1. 우선순위가 더 큰 문서가 존재하지 않는다면
맨 앞의 문서를 그냥 출력한다. 이때 뽑힌 문서의 개수 + 1을 해줌.
이제 이 뽑힌 문서가 내가 목표하던 문서라면 location이 현재 0일 것이다.
그게 아니라면 맨 앞의 문서가 뽑혀 나갔으니 내 목표 문서 location의 위치는 한 칸 앞으로 당겨진다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 전화번호 목록 C++ 풀이 (0) | 2022.12.26 |
---|---|
[프로그래머스] n^2 배열 자르기 C++ 풀이 (0) | 2022.12.23 |
[프로그래머스] 위장 C++ 풀이 (1) | 2022.12.21 |
[프로그래머스] 행렬의 곱셈 C++ 풀이 (1) | 2022.11.20 |
[프로그래머스] 괄호 회전하기 C++ 풀이 (0) | 2022.11.19 |
Comments