https://school.programmers.co.kr/learn/courses/30/lessons/131534

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

-- 코드를 입력하세요 

select a.YEAR
     , a.MONTH * 1 as MONTH
     , count(a.USER_ID) as PUCHASED_USERS
     , round(count(a.USER_ID)/(select count(u.USER_ID) from USER_INFO u where date_format(u.JOINED, '%Y') = '2021'), 1) as PUCHASED_RATIO
  from (
        SELECT distinct b.USER_ID
             , date_format(b.SALES_DATE, '%Y') YEAR
             , date_format(b.SALES_DATE, '%m') MONTH
             , date_format(b.SALES_DATE, '%Y-%m') YM
          from ONLINE_SALE b
         inner join USER_INFO u
            on b.USER_ID = u.USER_ID
           and date_format(u.JOINED, '%Y') = '2021'
       ) a
 group by a.YM
 order by YEAR, MONTH

# select a.YEAR
#      , a.MONTH * 1 as MONTH
#      , count(distinct a.USER_ID) as PUCHASED_USERS
#      , round(count(distinct a.USER_ID)/count(distinct b.USER_ID), 1) as PUCHASED_RATIO
#   from (
#         SELECT distinct b.USER_ID
#              , date_format(b.SALES_DATE, '%Y') YEAR
#              , date_format(b.SALES_DATE, '%m') MONTH
#              , date_format(b.SALES_DATE, '%Y-%m') YM
#           from ONLINE_SALE b
#        ) a
#  inner join USER_INFO b
#     on date_format(b.JOINED, '%Y-%m') <= a.YM
#    and b.GENDER is not null
#  group by a.YM
#  order by YEAR, MONTH

 

문제 제대로 안읽음;;

이게 레벨 5던데, 문제 자체가 그냥 헷갈림...내가 대충 읽은건가;;

첨에 아래 쿼리 만들었는데,,

아래 쿼리는 (매월 구매회원 / 매월 회원수)을 구하는거임...아 이정도 되니까 레벨5 구나 싶었음.

근데 아무리 돌려도 정답이 아니라길래;;

뭐 2021년 회원 중...이라는;; 이걸 읽지도 않고, 반올림 하는것도 안읽고;;

 

위 쿼리에선 스칼라서브쿼리를 사용하였다, 2021년 이라는 데이터에 대해서 반복적으로 가져올테니, 매 행마다 실행하는게 아니라,

한번 실행하고 메모리에 올려두고 재사용할테니 요게 더 빠를 거라 판단,

 

아래 쿼리의 경우 매년 매월 이라는 그나마 좀 다양한 경우의 수가 있기에, 범위가 커질수록 스칼라서브쿼리가 불리할거라 판단했고,

조인을 통해 가져오는 영역은 count(distinct b.USER_ID) 뿐일거라, 범위의 데이터를 통으로 가져오는게 아니라, 저걸 위한 데이터를 알아서 옵티마이저가 잘 연산해 주겠지 하는 막연한 믿음으로 작성한 쿼리,

동등 조인이 아니기에 일반적인 상황에선 쓰일수 없는 쿼리;

https://school.programmers.co.kr/learn/courses/30/lessons/131532

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

-- 코드를 입력하세요
SELECT date_format(b.SALES_DATE, '%Y') as YEAR
     # , cast(date_format(b.SALES_DATE, '%m') as unsigned) as MONTH
     , date_format(b.SALES_DATE, '%m')*1 as MONTH
     , a.GENDER
     , count(distinct a.USER_ID)as USERS
  from USER_INFO a
 inner join ONLINE_SALE b
    on a.USER_ID = b.USER_ID
 where a.GENDER is not null
 group by date_format(b.SALES_DATE, '%Y%m'), a.GENDER
 order by YEAR, MONTH, GENDER, USERS

 

프로그래머스 쿼리 문제가 난도가 낮은편 인거 같다

https://school.programmers.co.kr/learn/courses/30/lessons/131116

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

select r.CATEGORY
     , r.PRICE as MAX_PRICE
     , r.PRODUCT_NAME
  from (
        select @rank := if(@cate = t.CATEGORY, @rank + 1, 1) as num
             , @cate := t.CATEGORY
             , t.CATEGORY
             , t.PRICE
             , t.PRODUCT_NAME
          from (
                SELECT a.PRODUCT_ID
                     , a.PRODUCT_NAME
                     , a.PRODUCT_CD
                     , a.CATEGORY
                     , a.PRICE
                  from FOOD_PRODUCT a
                 where a.CATEGORY in ('과자', '국', '김치', '식용유')
                 order by a.CATEGORY, a.PRICE desc
               ) t
       ) r
  where r.num = 1
 order by r.PRICE desc
 
 
 select t.CATEGORY
     , t.PRICE as MAX_PRICE
     , t.PRODUCT_NAME
  from (
        SELECT a.PRODUCT_ID
             , a.PRODUCT_NAME
             , a.PRODUCT_CD
             , a.CATEGORY
             , a.PRICE
             , rank() over(partition by a.CATEGORY order by max(a.PRICE) desc) as r
          from FOOD_PRODUCT a
         where a.CATEGORY in ('과자', '국', '김치', '식용유')
         group by a.PRODUCT_ID
       ) t
 where t.r = 1
 order by t.PRICE desc

 

 

두가지 버전,

MYSQL 8부터 오라클 처럼 partition by를 지원하는 윈도우 함수가 가능하다. 핵 편함.

 

하지만, 5.7까지는 안되니깐, 여기선 변수를 사용한 처리가 가능하다.(자료구조상 사이즈 1개 짜리 큐를 이용하는 느낌?)

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/131537

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

SELECT left(SALES_DATE, 10) as SALES_DATE
     , PRODUCT_ID
     , USER_ID
     , SALES_AMOUNT
  from ONLINE_SALE A
 where left(SALES_DATE, 7) = '2022-03'
 UNION ALL
SELECT left(SALES_DATE, 10) as SALES_DATE
     , PRODUCT_ID
     , null
     , SALES_AMOUNT
  from OFFLINE_SALE A
 where left(SALES_DATE, 7) = '2022-03'
 order by SALES_DATE, PRODUCT_ID, USER_ID

SELECT date_format(SALES_DATE, '%Y-%m-%d') as SALES_DATE
     , PRODUCT_ID
     , USER_ID
     , SALES_AMOUNT
  from ONLINE_SALE A
 where SALES_DATE between date('2022-03-01') and date('2022-03-31')
 UNION ALL
SELECT date_format(SALES_DATE, '%Y-%m-%d') as SALES_DATE
     , PRODUCT_ID
     , null
     , SALES_AMOUNT
  from OFFLINE_SALE A
 where SALES_DATE between date('2022-03-01') and date('2022-03-31')
 order by SALES_DATE, PRODUCT_ID, USER_ID

 

하나는 스트링 함수로 하나는 데이트 함수로

디스크 컨트롤러

하드디스크는 한 번에 하나의 작업만 수행할 수 있습니다. 디스크 컨트롤러를 구현하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 요청이 들어온 순서대로 처리하는 것입니다.

예를들어

- 0ms 시점에 3ms가 소요되는 A작업 요청 - 1ms 시점에 9ms가 소요되는 B작업 요청 - 2ms 시점에 6ms가 소요되는 C작업 요청

와 같은 요청이 들어왔습니다. 이를 그림으로 표현하면 아래와 같습니다.

한 번에 하나의 요청만을 수행할 수 있기 때문에 각각의 작업을 요청받은 순서대로 처리하면 다음과 같이 처리 됩니다.

- A: 3ms 시점에 작업 완료 (요청에서 종료까지 : 3ms) - B: 1ms부터 대기하다가, 3ms 시점에 작업을 시작해서 12ms 시점에 작업 완료(요청에서 종료까지 : 11ms) - C: 2ms부터 대기하다가, 12ms 시점에 작업을 시작해서 18ms 시점에 작업 완료(요청에서 종료까지 : 16ms)

이 때 각 작업의 요청부터 종료까지 걸린 시간의 평균은 10ms(= (3 + 11 + 16) / 3)가 됩니다.

하지만 A → C → B 순서대로 처리하면

- A: 3ms 시점에 작업 완료(요청에서 종료까지 : 3ms) - C: 2ms부터 대기하다가, 3ms 시점에 작업을 시작해서 9ms 시점에 작업 완료(요청에서 종료까지 : 7ms) - B: 1ms부터 대기하다가, 9ms 시점에 작업을 시작해서 18ms 시점에 작업 완료(요청에서 종료까지 : 17ms)

이렇게 A → C → B의 순서로 처리하면 각 작업의 요청부터 종료까지 걸린 시간의 평균은 9ms(= (3 + 7 + 17) / 3)가 됩니다.

각 작업에 대해 [작업이 요청되는 시점, 작업의 소요시간]을 담은 2차원 배열 jobs가 매개변수로 주어질 때, 작업의 요청부터 종료까지 걸린 시간의 평균을 가장 줄이는 방법(포인트3)으로 처리하면 평균이 얼마가 되는지 return 하도록 solution 함수를 작성해주세요. (단, 소수점 이하의 수는 버립니다) 포인트1

제한 사항

  • jobs의 길이는 1 이상 500 이하입니다. 
  • jobs의 각 행은 하나의 작업에 대한 [작업이 요청되는 시점, 작업의 소요시간] 입니다.
  • 각 작업에 대해 작업이 요청되는 시간은 0 이상 1,000 이하입니다.
  • 각 작업에 대해 작업의 소요시간은 1 이상 1,000 이하입니다.
  • 하드디스크가 작업을 수행하고 있지 않을 때에는 먼저 요청이 들어온 작업부터 처리합니다. 포인트2 

 

입출력 예

jobsreturn

[[0, 3], [1, 9], [2, 6]] 9

입출력 예 설명

문제에 주어진 예와 같습니다.

  • 0ms 시점에 3ms 걸리는 작업 요청이 들어옵니다.
  • 1ms 시점에 9ms 걸리는 작업 요청이 들어옵니다.
  • 2ms 시점에 6ms 걸리는 작업 요청이 들어옵니다.

프로그래머스 힙 디스크 컨트롤러 레벨3의 문제.

저는 1년차 같은 10년차 개발자라 그런지...

이 문제 시간제한 있는 상황이라면 저는 무조건 탈락할것 같네요.

문제가 길어서 이해하기도 쉽지 않을뿐더러(책을 많이 읽다보니, 글 읽을때 대각선으로 속독하는 버릇이 있어서...ㅠㅠ)

시간제한 때문에 긴장도 해서 뇌근육이 굳을지도?!

 

일단 위는 복붙, 그 중 포인트는 '소수점 이하의 수는 버립니다'

 

포인트1 : 이 부분이 눈에 안뛰어서 코드를 짜고서 어 뭐지 왜 안대지? 될 코드인데...한참 고민한...

포인트2 : 디스크가 작업을 안하면 먼저 요청이 온 애들을 넣는다라...2초에 작업이 끝나서 5초에 작업이 1개만 들어왔으면 모를까, 3개가 들어왔다면 걔중에서도 선별을 해줘야 하겠죠?

포인트3 : 동시간 요청에 1초 간격의 작업 3개가 들어왔다고 가정!

{{0, 3}, {0, 4}, {0, 5}}

작업시간 순 정렬시 3 + 7 + 12, 역순시 5 + 9 + 17

딱 봐도 동시간 요청은 작업시간이 낮은 순으로 정렬해주는게 좋을듯.

 

요 세가지를 생각하며 코딩했지만, 의외로 놓치는 부분이 생겨서...

점프 구간 부분을 생각을 못 해서...좀 헤맨 ㅠ

(저 아래 주석 처리한 부분)

 

 

코드에 주석을 잘 하는편은 아닌데, 

저도 좀 헷갈려서 혹시 모를 보시는분을 위해 배려 차원에서 주석을 했습니다.

계산을 위해 지정해야하는 변수가 좀 헷갈릴뿐, 전체적인 난이도는 그다지 높지 않은듯 합니다.

가장 중요한건 요구사항에 맞게 정렬만 하면 되는일인데, 막상 정렬 하고서도 위 부분땜에 고생했네요.

 

 

package com.test.heap;

import java.util.Arrays;
import java.util.PriorityQueue;

public class Heap2 {

	public static void main(String[] args) {
		
		int[][] arr = {{0,3}, {1,9}, {2,6}};
//		int[][] arr = {{0,3}, {1,3}, {1,3}, {1,3}, {15,3}};
		
		int r = solution(arr);
		
		System.out.println(r);
	}
	
    public static int solution(int[][] jobs) {
        
        PriorityQueue<Total> ts = new PriorityQueue<>();
        PriorityQueue<Wait> ws = new PriorityQueue<>();
        
        // 배열을 우선순위 큐로 변환
        Arrays.stream(jobs).forEach(job -> {
        	Total t = new Total(job);
        	ts.add(t);
        });

        ws.add(new Wait(ts.poll()));
        
        // 흐른시간
        int totTime = 0;
        // sum(각 프로세스별 처리시간 = 기다린시간 + 일한시간) 
        int totProcessTime = 0;
        while(!ws.isEmpty()) {
        	Wait w = ws.poll();
        	
        	// 기다린시간
        	int waitTime = 0;
        	// 점프한시간(흐른 시간을 위해)
        	int jumptime = 0;
        	
        	
        	if(w.getInterruptTIme() > totTime) { // 요청시간이 흐른 시간보다 미래인 경우
        		waitTime = 0; // 대기는 0보다 작을 수 없으니까
        		jumptime = w.getInterruptTIme() - totTime; // 흐른시간을 계산하기 위해 미래를 현재로 만들기 위한 점프 구간
        	}else { // 대기를 0초 이상 한 경우
        		waitTime = totTime - w.getInterruptTIme();
        	}
        	
        	// 처리시간 = 기다린시간 + 일한시간 
        	int processTime = waitTime + w.getWorkingTime();
        	
        	// 흐른시간 = 기존흐른시간 + 일한시간 + 점프한시간
        	totTime += w.getWorkingTime() + jumptime;
        	
        	totProcessTime += processTime;
        	
    		while((!ts.isEmpty() && ts.peek().getInterruptTIme() <= totTime) // 총대기열이 있고, 흐른시간안에(처리하는동안 or 과거에) 요청이 온 경우가 있을때 
    				|| !ts.isEmpty() && ws.isEmpty()) { // 처리대기열이 비었는데, 총대기열이 남은 경우 (미래작업이 있는 경우)
    			
    			ws.add(new Wait(ts.poll()));
    			
    		}
        	
        }
        
//        return (int)Math.round((double)totProcessTime/jobs.length);
        return totProcessTime/jobs.length;
        
//        int answer = 0;
//        
//        PriorityQueue<Total> ts = new PriorityQueue<>();
//        
//        PriorityQueue<Wait> ws = new PriorityQueue<>();
//        
//        Arrays.stream(jobs).forEach(job -> {
//        	Total t = new Total(job);
//        	ts.add(t);
//        });
//
//        ws.add(new Wait(ts.poll()));
//        
//        
//        int totTime = 0;
//        
//        int lastEndTime = 0;
//        while(!ts.isEmpty() || !ws.isEmpty()) {
//        	Wait w = ws.peek();
//        	
//        	int waitTime = lastEndTime - w.getInterruptTIme();
//        	waitTime = waitTime < 0 ? 0 : waitTime;
//        	int processTime = waitTime + w.getWorkingTime();
//        	
//        	if(lastEndTime > totTime) {
//        		lastEndTime += w.getWorkingTime();
//        		ws.remove();
//        		answer += processTime;
//        	}
//        	
//    		while(!ts.isEmpty() && ts.peek().getInterruptTIme() <= totTime) {
//    			ws.add(new Wait(ts.poll()));
//    		}
//    		totTime++;
//        	
//        }
//        
//        
//        return answer/jobs.length;    
    }
    
}

// 전체대기열
class Total implements Comparable<Total>{

	private int interruptTIme;
	
	private int workingTime;
	
	Total (int[] job){
		this.interruptTIme = job[0];
		this.workingTime = job[1];
	}
	

	public int getInterruptTIme() {
		return interruptTIme;
	}

	public int getWorkingTime() {
		return workingTime;
	}


	// 1. 들어온시간 2. 일하는시간 
	@Override
	public int compareTo(Total o) {
		
		if(this.getInterruptTIme() == o.getInterruptTIme()) {
			return this.getWorkingTime() - o.getWorkingTime();
		}else {
			return this.getInterruptTIme() - o.getInterruptTIme();
		}
		
	}
}

// 진행대기열
class Wait implements Comparable<Wait>{

	private int interruptTIme;
	
	private int workingTime;
	
	Wait (Total t){
		this.interruptTIme = t.getInterruptTIme();
		this.workingTime = t.getWorkingTime();
	}
	
	public int getInterruptTIme() {
		return interruptTIme;
	}

	public int getWorkingTime() {
		return workingTime;
	}

	// 1. 일하는 시간
	@Override
	public int compareTo(Wait o) {
		return this.getWorkingTime() - o.getWorkingTime();
	}
}

프로그래머스 사이트를 접한지 3일째에요,

이것저것 문제 풀다보니 재미있어서...

근데 얘는 뭐길래 1일이라는 기한을 주는건지...?싶더라고요

양이 많은 건지, 적은건지?

 

2년차 개발자가 타겟인거보면 막상 쉬우려나? 

 

사이트를 보는 내내 호기심을 자극하다, 결국 눌러버렸어요.

 

뭔가 IDE는 코딩테스트 연습과 비슷...똑같겠지만;(웃음)

 

24시간의 시간이 주어지고, 뭔가 해보려는데...

 

이클립스에 익숙한 나에게 다소 생소한 IDE...ㅠㅠ

 

이걸 4월 4일 AM 01 즘 시작한게 에바인건지.

코드 몇줄 쳐봤는데...어휴....자동완성 및 import문제로 노답.

VSCODE 사용방법만 구글링 엄청!!

에이 안해도 그만이지 싶어서, 하다가 4시에 자러갔네요.

 

일요일이니까 오전에 집안일 좀 하고, 아이들이랑 잠깐 시간보내다가.

 

점심먹고 생각난게 왠지 안하면 후회할듯?? 싶더라고요. 뚜껑을 열었으니 뭔가 끝을 보고싶은;

 

급발진 시작했어요.

 

IDE때문에 한 3시간을 더 헤맸는데,

오류인건지 껏다 켜지고 시작화면이 다시 나오는데,

 

와..저기서 그냥 자바 누르면 해결되는거였다니;;ㅠㅠ

 

그리고 이것도 설치하면 단위테스트 하기 편하더라고요. 이클립스에서 JUnit탭이라 보면 될듯.

이제 속도가 붙어서 마구마구 하기 시작했죠..

상품쪽 컨트롤러 리턴 해주는건, 어제 날것의 타이핑으로 해놨고,

리뷰 요건을 확인 하며 와다다!!

 

 

로그인쪽은 이미 구현되어 있던거 같은데? 맞나?

잠결에 했나? 잘 기억은 안나지만, 왠지 되어 있던거 같았았어요;

리뷰쪽 모두 패스하고,

주문으로...

 

 

전체 테스트 패스 완료!! 

코드는 귀찮아서 이쁘게 안짜긴했지만,(원래 스타일도 이쁘지는 않지만..ㅠ)

IDE땜에 동동동 한 시간 제외하면 코딩한 시간은 실제로 3시간내외 인듯 하네요.

주문쪽이 상태 바꾸는게 작업이 간단하고 테스트케이스만 많아서;;

글구 상태값이 Enum 같은거 알면서도 안썼는데, 막상 써보니 좋기두?!

 

일단 요건에 대해 파악하고 그걸 구현해 내는거 자체의 난이도는 상당히 낮았던거 같아요!!(필자는 1년차 같은 10년차)

스프링을 주로 사용해왔다면! 2년차?정도 수준의 문제가 맞는듯 하고요.

아니라면 뭐 어렵겠죠...ㅠㅠ

 

그리고 문제 안에 답이 대부분 있어요.

복 붙으로 해결이 가능한 범위가 많고,

테스트 케이스가 너무 잘 되어 있어서, 그것만 봐도 쉽게 소화가 되더라고요.

 

 

그리고 중요한 부분은, 저는 API서버 개발 경험이 없어요.

근데 이걸보면서 느낀게 "아, 스프링을 이용한 API 프로젝트의 구성을 이렇게 하는거구나?!"

하고 느꼇지요.

사소한 부분들...ApiUtils 사용하는부분이라던가...

@ResponseBody를 사용할 경우 특정 공용 리턴 메시지 객체를 쓰긴 하지만,

success, errors, results 로 나눠서 하지는 않았는데, 이건 보통 내가 다른 restapi이용시 받던 전문 구조..

이걸 왜 적용할 생각은 안해본건지? 여튼 막상 이케 써보니 좋은듯? 깔끔하더군요.

 

경력이 낮은 분들은, 한 번쯤 이 구성을 파악만 해도 상당히 도움이 될것 같다는 생각을 하게 되었어요.

저한테도 도움이 된거 같은데, 당연하겠죠? 아니면 말구요! ㅋㅋ

 

그리고 덧 붙이자면, Util부분을 보통 따로 만들거나 하는데,

여기선 그럴 여유가 없으니, apache lang3 에서 제공되는걸 상속 받아서 사용했어요.

사용하며 느낀게 담부턴 이렇게 해야지~ 하는정도?

 

왜 항상 프로젝트 구성할때마다 쓸데없이 Util만드느라 고생하는지,

그냥 잘 만들어진거 상속받아서, 추가로 필요한거만 만들어서 쓰면 될거 같네요.

담부턴 꼭 그러길 (웃음)

 

 

전체적으로 재밌는 경험이었음.

 

 

문제 설명

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.

  • 구조대 : 119
  • 박준영 : 97 674 223
  • 지영석 : 11 9552 4421

전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.

제한 사항

  • phone_book의 길이는 1 이상 1,000,000 이하입니다.
    • 각 전화번호의 길이는 1 이상 20 이하입니다.
    • 같은 전화번호가 중복해서 들어있지 않습니다.

입출력 예제

phone_bookreturn

["119", "97674223", "1195524421"] false
["123","456","789"] true
["12","123","1235","567","88"] false

입출력 예 설명

입출력 예 #1
앞에서 설명한 예와 같습니다.

입출력 예 #2
한 번호가 다른 번호의 접두사인 경우가 없으므로, 답은 true입니다.

입출력 예 #3
첫 번째 전화번호, “12”가 두 번째 전화번호 “123”의 접두사입니다. 따라서 답은 false입니다.


알림

2021년 3월 4일, 테스트 케이스가 변경되었습니다. 이로 인해 이전에 통과하던 코드가 더 이상 통과하지 않을 수 있습니다.

 

다른게 아니라 빨간 글씨가 포인트...ㅎㄷㄷ;;

이것저것 막 해봐도 시간초과 나길래...

구글링도 해봐도 시간초과 나길래...

해시관련된걸 써야하나 싶어서...

 

import java.util.HashMap;
import java.util.HashSet;

class Solution {
    public boolean solution(String[] phone_book) {
        
        HashMap<String, String> m1 = new HashMap<>();
        HashSet<String> t = new HashSet<>();
		
        for(int i=0; i<phone_book.length; i++) {
            t.add(phone_book[i]);
        }
		
        for ( String source : phone_book) {
            for( int i=1; i<= source.length(); i++) {
				
                if(!source.substring(0,i).equals(source)) {
                    m1.put(source.substring(0,i), source);
                }
            }
        }
		
        for(String s1 : t) {
            if(m1.containsKey(s1)) {
                return false;
            }
        } 
        
        return true;
    }
}

 

루프가 많아서 수행시간은 비록 오래걸리지만,

일단 해시를 사용하기만하고 작성하자 했는데, 이게 통과되네...ㅡ_ㅡ;

+ Recent posts