백준 3078 좋은 친구

노문택·2022년 4월 5일
0

https://www.acmicpc.net/problem/3078

골드3.. 너무어렵다..

해당 문제의 핵심은 다음과같다..

Queue에 다담고 하나씩 뽑아서 비교하자! 가아닌

Queue에있는 친구들이 나랑 몇개의 쌍을 이룰수있는지! 가 핵심이다

주요로직

  1. 값을 차례대로 입력받음
  2. 현재 큐와 몇개의 쌍이 가능한지 체크 (쌍을 이룰수있을때까지 Queue 빼내줌)
    2.5 -> why? -> 현재의 친구와 쌍을 못이룬다면 후순에 입력되있는값과도 쌍을 못이루기때문
  3. 쌍을 이룰수있는 조건이 check 된다면 Queue 사이즈만큼 값을더해주고 Queue에 지금 입력한값을담아줌
  4. 반복
import java.util.*;
import java.io.*;

public class 좋은친구 {

	public static void main(String[] args) throws Exception{
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		int N = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(st.nextToken());
	
		Queue<Integer>[] qlist = new LinkedList[21];
		
		long answer = 0;
		for(int i=0;i<21;i++) {
			qlist[i] = new LinkedList<Integer>();
		}
		for(int i=0;i<N;i++) {
			String line = br.readLine();
			int sl = line.length();
			if(qlist[sl].isEmpty()) {
				qlist[sl].add(i);
				continue;
			}

			while(!qlist[sl].isEmpty()) {
				if(i-qlist[sl].peek()<=M) {
					// 첫번째 값이 된다면 아래있는 뒷번호는 다가능하다 그래서더해줌
					answer += qlist[sl].size();
					break;
				}
				qlist[sl].poll();
			}
			qlist[sl].add(i);
		}
	System.out.println(answer);
	}

}

자료형을 answer를 long으로 해줘야된다..

스택 의경우는 스택 특성을 이용해서 난이도있는문제였는데
큐문제는 그냥 선입선출이다보니까 특성을 막 베베 꼬아서 어렵게 푸는게 없고 대부분
구현 + 큐 // 혹은 그리디 + 큐 이런느낌이라 다른 부분이 폼이안올라와서 어려운거같다..그래서..,
일단 큐는 여기까지하고 다른 파트하고 폼이올라오면 재도전!!하기..

profile
노력하는 뚠뚠이

0개의 댓글