개발/알고리즘

[알고리즘] 백준 1700번: BufferedReader, StringTokenizer

윤J 2023. 5. 3. 19:01

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

 

1700번: 멀티탭 스케줄링

기숙사에서 살고 있는 준규는 한 개의 멀티탭을 이용하고 있다. 준규는 키보드, 헤어드라이기, 핸드폰 충전기, 디지털 카메라 충전기 등 여러 개의 전기용품을 사용하면서 어쩔 수 없이 각종 전

www.acmicpc.net

 

1700번은 그리디 알고리즘을 이용하는 문제인데, 그리디가 문제가 아니라 코테에 쓰이는 기본 개념들을 잘 모르겠어서 정리하면서 풀어보았다. 

 

 

- Scanner는 느려서 보통 BufferReader 을 쓰는 듯

- 근데 BufferReader는 한 줄씩 밖에 못 읽어서 한 줄을 여러 단어로 나누기 위해 StringTokenizer을 같이 사용한다

 

[1] 첫 번째 답(틀림):

 

1) 꽂으려는 기기가 코드에 이미 꽂혀 있는 경우 -> continue

2) 꽂으려는 기기가 코드에 없는 경우

  2-1) 코드 구멍이 비어있을 경우 -> 넣는다

  2-2) 코드 구멍이 차 있을 경우 -> 코드에 꽂혀있는 기기들을 이후에 몇 번 더 쓰는지 세고, 그 중에 가장 적게 나오는 값을 반환하여 코드에서 제거

 

근데,

2 9
1 2 3 1 2 3 1 2 3

답) 4 // 이 케이스에서 오류가 났다!

이유는 최솟값 나오는 값이 2개 이상인 경우에 어떻게 할지를 안 설정해줬다.

 

 

[2] 두 번째 답(틀림):

 

최솟값이 2개 이상인 경우 그 중에서 가장 나중에 써야 하는 기기를 빼주는 로직을 추가해줬다.

근데 왜 틀렸는지 모르겠다 ㅠㅠ

 

import java.util.*;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		int n = Integer.parseInt(st.nextToken());
		int k = Integer.parseInt(st.nextToken());
		
		st = new StringTokenizer(br.readLine());
		
		int order[] = new int[k];
	
		for(int i=0; i<k; i++) {
			order[i] = Integer.parseInt(st.nextToken());
		}
		
		int count = 0;
		ArrayList<Integer> code = new ArrayList();
		for(int i=0; i<k; i++) {
			if(code.contains(order[i])) {
				continue;
			}
			else { // 코드에 안 꽂혀있는 경우
				
				if(code.size()<n) { // 코드에 안 꽂혀있는데 빈 경우
					code.add(order[i]);
				}
				else { //코드에 다 꽂힌 경우
					HashMap<Integer, Integer> elecs = new HashMap<Integer, Integer>(); // 사용하는 전기용품들과 탐색 시 사용할 값
					for(int p=0; p<n; p++) {
						elecs.put(code.get(p), 0);
					}
					for(int j=i+1; j<k; j++) {
						if(elecs.containsKey(order[j])) {
								elecs.put(order[j], elecs.get(order[j])+1);
						}
					}
					//여기서부터 값이 최소인 것 골라서 key 반환
					
					int minValue = Collections.min(elecs.values());
					int minValue_key = 0;
					
					ArrayList<Integer> keys = new ArrayList();
					
					for(int key : elecs.keySet()) {
						if(elecs.get(key).equals(minValue)) {
							keys.add(key);
						}
					}
//					* 추가 ~
					if(keys.size()==1) {
						minValue_key=keys.get(0);
					}
					else {
						minValue_key=keys.get(keys.size()-1);
					}
//					~ 추가 *
					
					code.remove((Integer)minValue_key); 
					// 여기서 remove(3) 하면 index가 3인 값을 지워준다. 그래서 (Integer) 붙여줘야 값 3인 것이 삭제된다.
					code.add(order[i]);
					count++;
				}	
			}
		}
		System.out.println(count);
	}
}