2023. 11. 2. 14:16ใ์ธํ๋ฐ/์๋ฐ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด ์ ๋ฌธ : ์ฝ๋ฉํ ์คํธ ๋๋น
https://hyejin.tistory.com/1238
-> ์ด์ ๋ฌธ์ ํ์ด
์ค๋ช
๋ฉ๋์ปฌ ๋ณ์ ์๊ธ์ค์๋ ์์ฌ๊ฐ ํ ๋ช ๋ฐ์ ์์ต๋๋ค.
์๊ธ์ค์ ํ์๊ฐ ๋์ฐฉํ ์์๋๋ก ์ง๋ฃ๋ฅผ ํฉ๋๋ค. ํ์ง๋ง ์ํ๋๊ฐ ๋์ ํ์๋ ๋นจ๋ฆฌ ์๊ธ์กฐ์น๋ฅผ ์์ฌ๊ฐ ํด์ผ ํฉ๋๋ค.
์ด๋ฐ ๋ฌธ์ ๋ฅผ ๋ณด์ํ๊ธฐ ์ํด ์๊ธ์ค์ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ํ์์ ์ง๋ฃ์์๋ฅผ ์ ํฉ๋๋ค.
• ํ์๊ฐ ์ ์ํ ์์๋๋ก์ ๋ชฉ๋ก์์ ์ ์ผ ์์ ์๋ ํ์๋ชฉ๋ก์ ๊บผ๋ ๋๋ค.
• ๋๋จธ์ง ๋๊ธฐ ๋ชฉ๋ก์์ ๊บผ๋ธ ํ์ ๋ณด๋ค ์ํ๋๊ฐ ๋์ ํ์๊ฐ ์กด์ฌํ๋ฉด ๋๊ธฐ๋ชฉ๋ก ์ ์ผ ๋ค๋ก ๋ค์ ๋ฃ์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ง๋ฃ๋ฅผ ๋ฐ์ต๋๋ค.
์ฆ ๋๊ธฐ๋ชฉ๋ก์ ์๊ธฐ ๋ณด๋ค ์ํ๋๊ฐ ๋์ ํ์๊ฐ ์์ ๋ ์์ ์ด ์ง๋ฃ๋ฅผ ๋ฐ๋ ๊ตฌ์กฐ์ ๋๋ค.
ํ์ฌ N๋ช ์ ํ์๊ฐ ๋๊ธฐ๋ชฉ๋ก์ ์์ต๋๋ค.
N๋ช ์ ๋๊ธฐ๋ชฉ๋ก ์์์ ํ์ ์ํ๋๊ฐ ์ฃผ์ด์ง๋ฉด, ๋๊ธฐ๋ชฉ๋ก์์ M๋ฒ์งธ ํ์๋ ๋ช ๋ฒ์งธ๋ก ์ง๋ฃ๋ฅผ ๋ฐ๋์ง ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์ธ์.
๋๊ธฐ๋ชฉ๋ก์์ M๋ฒ์งธ๋ ๋๊ธฐ๋ชฉ๋ก์ ์ ์ผ ์ฒ์ ํ์๋ฅผ 0๋ฒ์งธ๋ก ๊ฐ์ฃผํ์ฌ ํํํ ๊ฒ์ ๋๋ค.
์ ๋ ฅ
์ฒซ ์ค์ ์์ฐ์ N(5<=N<=100)๊ณผ M(0<=M<N) ์ฃผ์ด์ง๋๋ค.
๋ ๋ฒ์งธ ์ค์ ์ ์ํ ์์๋๋ก ํ์์ ์ํ๋(50<=์ํ๋<=100)๊ฐ ์ฃผ์ด์ง๋๋ค.
์ํ๋๋ ๊ฐ์ด ๋์ ์๋ก ๋ ์ํํ๋ค๋ ๋ป์ ๋๋ค. ๊ฐ์ ๊ฐ์ ์ํ๋๊ฐ ์กด์ฌํ ์ ์์ต๋๋ค.
์ถ๋ ฅ
M๋ฒ์งธ ํ์์ ๋ช ๋ฒ์งธ๋ก ์ง๋ฃ๋ฐ๋์ง ์ถ๋ ฅํ์ธ์.
์์ ์ ๋ ฅ 1
5 2
60 50 70 80 90
์์ ์ถ๋ ฅ 1
3
์์ ์ ๋ ฅ 2
6 3
70 60 90 60 60 60
์์ ์ถ๋ ฅ 2
4
๋ฌธ์ ํ์ด 1
public int solution(int n, int m, int[] arr)
{
int answer = 0;
Queue<Patient> queue = new LinkedList<>();
Patient mPatient = new Patient(arr[m], m);
for (int i = 0; i < arr.length; i++)
{
queue.offer(new Patient(arr[i], i));
}
int cnt = 0;
while (true)
{
int max = 0;
for (Patient patient : queue)
{
if (patient.getRisk() > max) {
max = patient.getRisk();
}
}
if (queue.peek().getRisk() >= max) {
if (queue.peek().equals(mPatient)) {
cnt++;
break;
}else
{
cnt ++;
queue.poll();
}
} else {
queue.offer(queue.poll());
}
}
return cnt;
}
class Patient
{
int risk;
int order;
public Patient()
{
}
public Patient(int risk, int order)
{
this.risk = risk;
this.order = order;
}
public int getRisk()
{
return risk;
}
public int getOrder()
{
return order;
}
@Override
public boolean equals(Object o)
{
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
Patient patient = (Patient) o;
return risk == patient.risk && order == patient.order;
}
@Override
public int hashCode()
{
return Objects.hash(risk, order);
}
}
๐ฉ๐ป : ์ฌ์ค ์ด ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํ์ง ๊ณ์ ๊ณ ๋ฏผํ๋ค๊ฐ... ๊ตฌ๊ธ๋ง์ ํ๋๋ฐ ๊ฐ์ฒด๋ฅผ ํ๋ ๋ง๋ค์ด์ Queue์ ๋ฃ๋ ๋ค๋ ํํธ๋ฅผ ๋ณด๊ณ , ๊ฑฐ๊ธฐ๊น์ง๋ง ๋ณธ ๋ค์์ ๋ด๊ฐ ์ง์ ํ์๋ค ! (๊ฐ์ฒด๋ฅผ ์์ฑํ ์๊ฐ์ ํ์ง ๋ชปํ์๋คใ ใ )
์ํผ Patient ๋ผ๋ ๊ฐ์ฒด๋ฅผ ํ๋ ๋ง๋ค๊ณ , risk๊ฐ ์ํ๋, order๋ ์ ์ํ ์์๋ฅผ ๋ด๋๋ก ํ๋ค.
๊ทธ ๋ค์ ์์ฑ์๋ฅผ ๋ง๋ค์ด์ฃผ๊ณ , ๊ฐ์ฒด ๋น๊ต๋ฅผ ์ํด์ equals๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํด์ id์ order๊ฐ ๊ฐ์ผ๋ฉด ๊ฐ์ ๊ฐ์ฒด๋ก ์ธ์ํ๋๋ก ํ๋ค.
M๋ฒ์งธ ํ์๊ฐ ์ธ์ ์ง๋ฃ๋ฐ๋์ง ์๊ธฐ ์ํด์ M ๋ฒ์งธ ํ์๋ฅผ ๋ฏธ๋ฆฌ mPatient๋ก ๋ง๋ค์ด์คฌ๋ค.
๊ทธ๋ฌ๊ณ ์ด์ ๋ฌธ์ ๋ฅผ ํธ๋๋ฐ Patient๋ฅผ ๋ด๋ Queue๋ฅผ ํ๋ ๋ง๋ค๊ณ , ๊ทธ ๋ค์ queue์ ์ํ๋์ ์์๋ฅผ ๋ด์ Patent๋ฅผ ๋ง๋ค๊ณ offer ํด์คฌ๋ค.
๊ทธ ๋ค์ while ๋ฌดํ ๋ฐ๋ณต๋ฌธ์ ๋ง๋ ๋ค์, queue๋ฅผ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๋๋ฉด์ max ๊ฐ ์ฆ, ์ํ๋๊ฐ ๊ฐ์ฅ ๋์ ๊ฐ์ ๊ตฌํ๊ณ , ๊ทธ ๋ค์, queue์์ peek ํ ๊ฐ์ด max๋ณด๋ค ํฌ๋ฉด cnt ๊ฐ์ +1 ๋ง ํด์ฃผ๊ณ , queue์์ poll ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ง์ฝ peekํ ๊ฐ์ด max ๋ณด๋ค ์์ผ๋ฉด ๋ค์ queue์ ๋ฃ์ด์ค์ผ ํ๊ธฐ ๋๋ฌธ์ queue์์ poll ํ ๊ฐ์ ๋ค์ queue์ offer ํด์คฌ๋ค.
๋ง์ง๋ง์ผ๋ก peekํ ๊ฐ์ด max ๋ ๊ฐ์ ๋, queue.peekํ Patient๊ฐ mPatient๋ ๊ฐ์์ง equals ๋น๊ต๋ฅผ ํตํด ํ์ธํ๊ณ risk์ order๊ฐ ๋ชจ๋ ๊ฐ์ ๊ฒฝ์ฐ์๋ cnt ์ ๊ฐ์ +1 ํด์ฃผ๊ณ , break ์ ํตํด while๋ฌธ์์ ๋ฒ์ด๋ ๋ค์ cnt ๊ฐ์ ๋ฆฌํดํด์ฃผ๋ฉด ๋๋ค.
๋ฌธ์ ํ์ด 2
public int solution2(int n, int m, int[] arr)
{
int answer = 0;
Queue<Person> queue = new LinkedList<>();
for (int i = 0; i < n; i++)
{
queue.offer(new Person(i, arr[i]));
}
while (!queue.isEmpty())
{
Person tmp = queue.poll();
for (Person x : queue)
{
if (x.priority > tmp.priority)
{
queue.offer(tmp);
tmp = null;
break;
}
}
if (tmp != null) { // tmp์ ์ฐ์ ์์๊ฐ ์ ์ผ ๋๋ค๋ ๋ป !
answer++;
if (tmp.id == m)
return answer;
}
}
return answer;
}
class Person
{
int id;
int priority;
public Person(int id, int priority)
{
this.id = id;
this.priority = priority;
}
}
๐พ : ๊ฐ์ฌ๋์ ์ข ๋ ๊ฐ๋จํ๊ฒ ํ์๋ค. Person ์ด๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ id๋ ์์, priority๋ ์ํ๋์ ๊ฐ์ ๋ฃ์ด์ฃผ๋๋ก ํ๋ค.
๊ทธ ๋ค์ Person์ ๋ด๋ Queue๋ฅผ ์์ฑํด์ฃผ๊ณ , queue์ offer๋ก Person ๊ฐ์ฒด๋ฅผ ์์ฑํด์ id์ priority์ ๊ฐ์ ๋ฃ์ด์คฌ๋ค.
๊ทธ๋ฆฌ๊ณ while ๋ฐ๋ณต๋ฌธ์์ queue๊ฐ ๋น์ด์์ง ์์ ๋๊น์ง ๋ฐ๋ณตํ๋๋ฐ
๋จผ์ queue์์ pollํ ๊ฐ์ ๊บผ๋ด์ tmp ๋ผ๋ Person ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ , for ๋ฐ๋ณต๋ฌธ์ ํตํด์ queue ๊ฐ์ ํ๋์ฉ ๊บผ๋ด์ tmp์ priority์ ๊ฐ๊ณผ queue์์ ๊บผ๋ธ x์ priority ๊ฐ ์ค์์ tmp์ priority๊ฐ ๋ ์์ผ๋ฉด queue์์ poll ํ ๊ฐ์ ๋ค์ queue์ offer ํด์ค๋ค. ๊ทธ๋ฆฌ๊ณ tmp ๊ฐ์ null๋ก ๋ฐ๊ฟ์ฃผ๊ณ break ํด์ฃผ๋ฉด ๋๋ค. (๋ ์ด์ ๋ฐ๋ณต๋ฌธ์ ๋ ํ์๋ ์์ผ๋!)
๊ทธ๋ฆฌ๊ณ tmp๊ฐ null์ด ์๋๋ผ๋ ๋ป์ tmp๊ฐ ์ง๊ธ ์ ์ผ ์ฐ์ ์์๊ฐ ๋์ ํ์๋ผ๋ ๋ป์ด๊ธฐ ๋๋ฌธ์ ์ฐ์ answer์ ๊ฐ์ +1 ํด์ฃผ๊ณ , ๊ทธ ๋ค์ tmp์ id ๊ฐ ์ฃผ์ด์ง ๊ฐ m ๊ณผ ๋์ผํ๋ค๋ฉด M ๋ฒ์งธ ํ์๋ผ๋ ๋ป์ด๊ธฐ ๋๋ฌธ์ answer๋ฅผ ๋ฆฌํดํด์ฃผ๋ฉด ๋๋ค.