[커뮤러닝 - 중간 고사] 그리디/시뮬레이션

HyeJi9908·2022년 7월 19일
0

[JAVA] 커뮤러닝

목록 보기
3/6

🔎 개념

SimpleDataFormat Class( + Date + Calendar ...)

:원하는 포맷으로 날짜,시간 출력 / 날짜,시간 포맷형식에서 데이터값 추출

  • 오늘 날짜 구하기
Date today = new Date();

SimpleDateFormat format1 = new SimpleDateFormat("yyyy년 MM월 dd일 hh시 mm분 ss초");
SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
SimpleDateFormat format3 = new SimpleDateFormat("오늘 날짜 : yyyy년도 MM월, 현재 시각 : hh시 mm분");

String strFormat1 = format1.format(today);
String strFormat2 = format2.format(today);
String strFormat3 = format3.format(today);

System.out.println("날짜 형식 지정 안 한 경우 : " + today);
System.out.println("strFormat1형식 : " + strFormat1);
System.out.println("strFormat2형식 : " + strFormat2);
System.out.println("strFormat3형식 : " + strFormat3);

  • String 에서 날짜, 시간 형식으로 변환
String todayStr = "20210323";
String tomorrowStr = "2021년도 03월 24일 21시 30분 35초";

// String에서 숫자부분만 추출
SimpleDateFormat format1 = new SimpleDateFormat("yyyyMMdd");
SimpleDateFormat format2 = new SimpleDateFormat("yyyy년도 MM월 dd일 hh시 mm분 ss초");

Date todayDate = format1.parse(todayStr);
Date tomorrowDate = format2.parse(tomorrowStr);

System.out.print(todayDate);
System.out.println();
System.out.print(tomorrowDate)

  • 날짜,시간 수정
String tomorrowStr = "2021년도 03월 24일 21시 30분 35초";

SimpleDateFormat format = new SimpleDateFormat("yyyy년도 MM월 dd일 hh시 mm분 ss초");

Date tomorrowDate = format.parse(tomorrowStr);

Calendar cal = Calendar.getInstance();
cal.setTime(tomorrowDate);

System.out.println("날짜 변경 전 : "+ cal.getTime());

cal.add(Calendar.YEAR, 2);	// 연도 수정
cal.add(Calendar.MONTH, 2);	// 월 수정
cal.add(Calendar.DATE, 2);	// 날짜 수정
cal.add(Calendar.HOUR_OF_DAY , 2);	// 시 수정
cal.add(Calendar.MINUTE, 2);	// 분 수정
cal.add(Calendar.SECOND, 2);	// 초 수정

System.out.println("날짜 변경 후 : "+ cal.getTime());

  • 두 날짜의 차이 구하기
String todayStr = "20210323";
String tomorrowStr = "2021년도 03월 24일 21시 30분 35초";

SimpleDateFormat format1 = new SimpleDateFormat("yyyyMMdd");
SimpleDateFormat format2 = new SimpleDateFormat("yyyy년도 MM월 dd일 hh시 mm분 ss초");

Date todayDate = format1.parse(todayStr);
Date tomorrowDate = format2.parse(tomorrowStr);

long dateGap = tomorrowDate.getTime() - todayDate.getTime(); 

long dateGapDay = dateGap / ( 24*60*60*1000); 

dateGapDay = Math.abs(dateGapDay);      //Math.abs는 인자값을 절대값으로 반환하는 함수(음수 양수 상관없이 양수로 반환)

System.out.println("두 날짜의 날짜 차이: "+dateGapDay);

LocalTime 클래스( SimpleFotmat의 단점을 보완한 클래스 )

SimpleFormat의 단점

  • LocalDate (날짜)
// 로컬 컴퓨터의 현재 날짜 정보를 저장한 LocalDate 객체를 리턴
LocalDate currentDate = LocalDate.now();
// result : 2019-11-13

// 파라미터로 주어진 날짜 정보를 저장한 LocalDate 객체를 리턴한다.
LocalDate targetDate = LocalDate.of(2019,11,12);
 //결과 : 2019-11-12
  • LocalTime (시간)
// 로컬 컴퓨터의 현재 시간 정보를 저장한 LocalDate 객체를 리턴. 
LocalTime currentTime = LocalTime.now();   
// 결과 : 18:34:22

// 파라미터로 주어진 시간 정보를 저장한 LocalTime 객체를 리턴.
LocalTime targetTime = LocalTime.of(12,33,35,22); 
// 끝에 4번째 매개변수는 nanoSecond 인데 선택 이다 
// 결과 : 12:32:33.0000022
  • LocalDateTime (날짜 및 시간)
// 로컬 컴퓨터의 현재 날짜와 시간 정보
LocalDateTime currentDateTime = LocalDateTime.now();    
// 결과 : 2019-11-12T16:34:30.388

LocalDateTime targetDateTime = LocalDateTime.of(2019, 11, 12, 12, 32,22,3333);
// second,nanoSecond 매개변수는 선택
// 결과 : 2019-11-12T12:32:22.000003333
  • 날짜 , 시간 연산
LocalDateTime currentDateTime = LocalDateTime.now();

// 더 하기는 plus***() 빼기는 minus***()
currentDateTime.plusDays(2)
// 결과 : 2019-11-14T12:32:22.000003333

  • 그 외 활용 (isBefore,isEqual,between...)
    참고 글

📚 티셔츠 - 그리디

수정 전

import java.util.Arrays;

public class Java0713_1 {
    public int solution(int[] people, int[] tshirts) {
        int answer = 0;
        
        Arrays.sort(people);
        Arrays.sort(tshirts);

        int tIdx=0;
        LOOP1:
            for (int p : people) {
                
                LOOP2:
	                while(true){
	                    if (tIdx<tshirts.length){
	                    	if( p <= tshirts[tIdx]) {
		                        answer++;
		                        tIdx++;
		                        break LOOP2;             
	                        }      
	                    	else if(tIdx+1<tshirts.length) 
	                        tIdx++;  
	                    	
	                    	else break LOOP1;  
	                    }
	                              
	                }
                
		}

        return answer;
    }
}

수정 후

: for문을 하나만 돌리고 인덱스값만 증가

import java.util.Arrays;

class Solution {
    public int solution(int[] people, int[] tshirts) {
        int distributed = 0;
        int peopleIndex = 0;

        Arrays.sort(people);
        Arrays.sort(tshirts);
        
        for (int tshirt : tshirts) {
            if (peopleIndex >= people.length) {
                break;
            }

            if (people[peopleIndex] <= tshirt) {
                distributed++;
                peopleIndex++;
            }
        }

        return distributed;
    }
}

📚 상담예약제 - 구현

수정 전

import java.util.*;
 

public class Java0713_2 {
    public String[] solution(String[][] booked, String[][] unbooked) {
        
        boolean firstBoolean =true;		 // 첫번째 예약자 여부
        String[] recent = new String[2]; // 가장 최근의 예약 정보 {에약시간,이름}
        
        // booked 와 unbooked중에 가장 빠른 시간 먼저 꺼내기
        Queue<String[]> bq = new LinkedList<>();
        Queue<String[]> unq = new LinkedList<>();
        for(String[] b:booked) bq.offer(b);
        for(String[] ub:unbooked) unq.offer(ub);
        
        int length = booked.length+unbooked.length;
        String[] answer = new String[length];
        
        for(int i=0;i<length;i++) {
        
	        String[] bStr = (!bq.isEmpty())? bq.peek():null;
	        String[] ubStr = (!unq.isEmpty())? unq.peek():null;
	        
	        int bTime = Integer.parseInt(bStr[0].replace(":",""));
	        int ubTime = Integer.parseInt(ubStr[0].replace(":",""));
	        
	        if(firstBoolean) {
	        	if(bTime<ubTime) {
	        		recent = bStr;
	        		bq.poll();
	        	}else {
	        		recent = ubStr;
	        		unq.poll();
	        	}
	        	
	        	firstBoolean = false;
	        }
	        else {
	        	// first + 10분 숫자 변환 
	        	int firstP10 = Integer.parseInt(recent[0].replace(":",""))+10;
	
	        	if(ubTime<firstP10 && bTime>firstP10) recent = ubStr;
	        	else recent = bStr;
	        	// ubTime이 그것보다 작고 bTime이 그것보다 크면 ubStr먼저
	        	// 그 외 경우 bStr이 먼저
	        }
        	
   
	        // answer에 이름 담고
	        answer[i] = recent[1];	
        }

        return answer;
    }
}

수정 후

  • ArrayList 생성 : 예약자 리스트, 비예약자 리스트, answer에 반환할 tempAnswer
  • SimpleDataFormat,Data 클래스로 예약 시간 포맷을 쉽게 얻기
  • compareTo로 시간 순서 판별
import java.util.stream.Collectors;

class Solution {
    public String[] solution(String[][] booked, String[][] unbooked) {
        String[] answer = {};
        List<List<String>> bookedList = Arrays.stream(booked).map(Arrays::asList).collect(Collectors.toList());
        List<List<String>> unbookedList = Arrays.stream(unbooked).map(Arrays::asList).collect(Collectors.toList());

        SimpleDateFormat formatter = new SimpleDateFormat("hh:mm");

        List<String> tempAnswer = new ArrayList<>();
        Date endTime = null;
        int length = Math.max(bookedList.size(), unbookedList.size());

        int i = 0;
        int j = 0;
        Date bookedTime = null;
        Date unbookedTime = null;

        while (i < bookedList.size() || j < unbookedList.size()) {
            if (bookedList.size() > i) {
                bookedTime = formatter.parse(bookedList.get(i).get(0));
            }
            if (unbookedList.size() > j) {
                unbookedTime = formatter.parse(unbookedList.get(j).get(0));
            }

            if (i == 0 && j == 0) {
                endTime = bookedTime.compareTo(unbookedTime) >= 0 ? unbookedTime : bookedTime;
            }

            if (bookedTime.compareTo(unbookedTime) <= 0) {
                tempAnswer.add(bookedList.get(i).get(1));
                i++;
            } else {
                tempAnswer.add(unbookedList.get(j).get(1));
                j++;
            }

//            endTime = endTime.;
        }


        answer = tempAnswer.toArray(String[]::new);

        return answer;
    }
}

0개의 댓글