νŠœν”Œ

πŸ“‘ λ¬Έ1) μ…€μˆ˜μžˆλŠ” μˆ˜λŸ‰μ˜ μˆœμ„œμžˆλŠ” μ—΄κ±° λ˜λŠ” μ–΄λ–€ μˆœμ„œλ₯Ό λ”°λ₯΄λŠ” μš”μ†Œλ“€μ˜ λͺ¨μŒμ„ νŠœν”Œ(tuple)이라고 ν•©λ‹ˆλ‹€. n개의 μš”μ†Œλ₯Ό κ°€μ§„ νŠœν”Œμ„ n-νŠœν”Œ(n-tuple)이라고 ν•˜λ©°, λ‹€μŒκ³Ό 같이 ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • (a1, a2, a3, ..., an)

νŠœν”Œμ€ λ‹€μŒκ³Ό 같은 μ„±μ§ˆμ„ κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€.

  1. μ€‘λ³΅λœ μ›μ†Œκ°€ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. ex : (2, 3, 1, 2)
  2. μ›μ†Œμ— μ •ν•΄μ§„ μˆœμ„œκ°€ 있으며, μ›μ†Œμ˜ μˆœμ„œκ°€ λ‹€λ₯΄λ©΄ μ„œλ‘œ λ‹€λ₯Έ νŠœν”Œμž…λ‹ˆλ‹€. ex : (1, 2, 3) β‰  (1, 3, 2)
  3. νŠœν”Œμ˜ μ›μ†Œ κ°œμˆ˜λŠ” μœ ν•œν•©λ‹ˆλ‹€.

μ›μ†Œμ˜ κ°œμˆ˜κ°€ n개이고, μ€‘λ³΅λ˜λŠ” μ›μ†Œκ°€ μ—†λŠ” νŠœν”Œ (a1, a2, a3, ..., an)이 μ£Όμ–΄μ§ˆ λ•Œ(단, a1, a2, ..., an은 μžμ—°μˆ˜), μ΄λŠ” λ‹€μŒκ³Ό 같이 μ§‘ν•© 기호 '{', '}'λ₯Ό μ΄μš©ν•΄ ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • {{a1}, {a1, a2}, {a1, a2, a3}, {a1, a2, a3, a4}, ... {a1, a2, a3, a4, ..., an}}

예λ₯Ό λ“€μ–΄ νŠœν”Œμ΄ (2, 1, 3, 4)인 경우 μ΄λŠ”

  • {{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}}

와 같이 ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ•Œ, 집합은 μ›μ†Œμ˜ μˆœμ„œκ°€ λ°”λ€Œμ–΄λ„ μƒκ΄€μ—†μœΌλ―€λ‘œ

  • {{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}}
  • {{2, 1, 3, 4}, {2}, {2, 1, 3}, {2, 1}}
  • {{1, 2, 3}, {2, 1}, {1, 2, 4, 3}, {2}}

λŠ” λͺ¨λ‘ 같은 νŠœν”Œ (2, 1, 3, 4)λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

νŠΉμ • νŠœν”Œμ„ ν‘œν˜„ν•˜λŠ” 집합이 λ‹΄κΈ΄ λ¬Έμžμ—΄ sκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, sκ°€ ν‘œν˜„ν•˜λŠ” νŠœν”Œμ„ 배열에 λ‹΄μ•„ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”.


μ œν•œμ‚¬ν•­

  • s의 κΈΈμ΄λŠ” 5 이상 1,000,000 μ΄ν•˜μž…λ‹ˆλ‹€.
  • sλŠ” μˆ«μžμ™€ '{', '}', ',' 둜만 이루어져 μžˆμŠ΅λ‹ˆλ‹€.
  • μˆ«μžκ°€ 0으둜 μ‹œμž‘ν•˜λŠ” κ²½μš°λŠ” μ—†μŠ΅λ‹ˆλ‹€.
  • sλŠ” 항상 μ€‘λ³΅λ˜λŠ” μ›μ†Œκ°€ μ—†λŠ” νŠœν”Œμ„ μ˜¬λ°”λ₯΄κ²Œ ν‘œν˜„ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
  • sκ°€ ν‘œν˜„ν•˜λŠ” νŠœν”Œμ˜ μ›μ†ŒλŠ” 1 이상 100,000 μ΄ν•˜μΈ μžμ—°μˆ˜μž…λ‹ˆλ‹€.
  • return ν•˜λŠ” λ°°μ—΄μ˜ 길이가 1 이상 500 μ΄ν•˜μΈ 경우만 μž…λ ₯으둜 μ£Όμ–΄μ§‘λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

sresult
{{2},{2,1},{2,1,3},{2,1,3,4}}[2,1,3,4]
{{1,2,3},{2,1},{1,2,4,3},{2}}[2,1,3,4]
{{20,111},{111}}[111,20]
{{123}}[123]
{{4,2,3},{3},{2,3,4,1},{2,3}}[3,2,4,1]

λ‚˜μ˜ 풀이

package programmers;

import java.util.Arrays;
import java.util.Comparator;
import java.util.HashSet;

public class Tuple {
	
	
	public static int[] solution(String s) {
     
      
       s = s.substring(2,s.length() - 2);
       
       String[] group = s.split("\\},\\{"); 
       
       int[][] NTuple = new int[group.length][];
       
       for(int i = 0; i < group.length; i++) {
    	   String[] nums = group[i].split(",");
    	   NTuple[i] = new int[nums.length];
    	   
    	   for(int j = 0; j < nums.length; j++) {
    		   NTuple[i][j] = Integer.parseInt(nums[j]);
    	   }
    	  
       }
        
       Arrays.sort(NTuple, Comparator.comparingInt(a -> a.length));
       
       HashSet<Integer> set = new HashSet<>();
       int[] answer = new int[NTuple.length];
       
       int index = 0;
       
       for(int[] arr : NTuple) {
    	   for(int num : arr) {
    		   if(!set.contains(num)) {
    			   set.add(num);
    			   answer[index++] = num;
    		   }
    	   }
       }
        System.out.println(Arrays.toString(answer));
        return answer;
    }
	
	
	public static void main(String[] args) {
		solution("{{20,111},{111}}");
	}

}

λ‚˜μ˜ 생각

λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§€λŠ” String sλ₯Ό λ¬Έμ œμ—μ„œ μ›ν•˜λŠ” ν˜•μ‹μœΌλ‘œ 처리λ₯Ό ν•˜κΈ°μœ„ν•œ μ „μ²˜λ¦¬ 과정이 ν•„μš”ν•˜λ‹€. 문자둜 μ£Όμ–΄μ§€λŠ” {{20,111},{111}} ν˜•μ‹μ—μ„œ {20,111},{111} 을 λΆ„λ¦¬ν•΄μ•Όν•˜λŠ”λ° 처음 {{ κ³Ό 끝 }}λ₯Ό μ œκ±°ν•˜λ©΄ 20,111 }, {111 이 λœλ‹€.

μœ„ μ „μ²˜λ¦¬ 과정을 거치고 λ‚œ λ’€ μƒμ„±λœ 20,111},{111λ₯Ό 20,111, 111둜 λ‚˜λˆ„λ €λ©΄ μ •κ·œμ‹μ„ μ‚¬μš©ν•˜μ—¬ ν•œλ²ˆ 더 μ „μ²˜λ¦¬κ³Όμ •μ΄ ν•„μš”ν•˜λ‹€.

String[] group = s.split("\\},\\{");

  1. \\}: } 문자λ₯Ό μ˜λ―Έν•œλ‹€. Java λ¬Έμžμ—΄μ—μ„œ λ°±μŠ¬λž˜μ‹œ \λŠ” 특수 문자둜 μΈμ‹λ˜κΈ° λ•Œλ¬Έμ— μ •κ·œμ‹μ—μ„œ λ¦¬ν„°λŸ΄ } 문자λ₯Ό μ˜λ―Έν•˜λ €λ©΄ \}둜 ν‘œκΈ°ν•΄μ•Ό ν•œλ‹€.

  2. ,: μ‰Όν‘œλ₯Ό 의미

  3. \\{: { 문자λ₯Ό μ˜λ―Έν•œλ‹€. λ§ˆμ°¬κ°€μ§€λ‘œ Java λ¬Έμžμ—΄μ—μ„œ λ°±μŠ¬λž˜μ‹œ \λŠ” 특수 문자둜 μΈμ‹λ˜κΈ° λ•Œλ¬Έμ— μ •κ·œμ‹μ—μ„œ λ¦¬ν„°λŸ΄ { 문자λ₯Ό μ˜λ―Έν•˜λ €λ©΄ \{둜 ν‘œκΈ°ν•΄μ•Ό ν•œλ‹€

λ”°λΌμ„œ, μ£Όμ–΄μ§„ μ •κ·œμ‹ \},\{λŠ” λ¬Έμžμ—΄μ—μ„œ },{ νŒ¨ν„΄μ„ μ°ΎλŠ” 것을 의미

ν˜„μž¬ [20,111, 111]λŠ” 문자둜 μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— λ‚΄κ°€ μ›ν•˜λŠ” κ°’μœΌλ‘œ μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” intν˜•μœΌλ‘œ λ³€ν™˜ 및 int[][] λ°°μ—΄λ‘œ μ„ μ–Έν•˜μ—¬

  • NTuple[0] = {20,111}
  • NTuple[1] = {111}

ν˜•νƒœλ‘œ μ‘΄μž¬ν•΄μ•Όν•œλ‹€. 이λ₯Ό μœ„ν•΄ λ‹€μŒκ³Ό 같은 λ‘œμ§μ„ κ΅¬μ„±ν•œλ‹€.

int[][] NTuple = new int[group.length][];
       
for(int i = 0; i < group.length; i++) {
	String[] nums = group[i].split(",");
    NTuple[i] = new int[nums.length];
    	   
    for(int j = 0; j < nums.length; j++) {
    	NTuple[i][j] = Integer.parseInt(nums[j]);
    }
    	  
}

NTuple 은 2차원 배열을 μ°Έμ‘°ν•˜λŠ” λ³€μˆ˜μ΄κ³ , 첫 번째 μ°¨μ›μ˜ ν¬κΈ°λŠ” group.length둜 μ •ν•΄μ Έ μžˆμ§€λ§Œ, 두 번째 μ°¨μ›μ˜ ν¬κΈ°λŠ” 아직 μ§€μ •λ˜μ§€ μ•ŠμŒ

μ΄λ ‡κ²Œ 두 번째 μ°¨μ›μ˜ 크기λ₯Ό 미리 μ§€μ •ν•˜μ§€ μ•Šμ€ μ±„λ‘œ 배열을 μƒμ„±ν•˜λ©΄, λ‚˜μ€‘μ— 각 μ„œλΈŒλ°°μ—΄μ˜ 크기λ₯Ό λ‹€λ₯΄κ²Œ μ§€μ •ν•  수 있음. 이것을 λΉ„μ •μ§μ‚¬κ°ν˜• λ°°μ—΄ λ˜λŠ” 비균일 2차원 λ°°μ—΄ 이라고 함

NTuple[i] = new int[nums.length]; // 각 μ„œλΈŒλ°°μ—΄ NTuple[i]의 크기λ₯Ό μ§€μ •
// μ—¬κΈ°μ„œ nums.lengthλŠ” 각 그룹의 μ›μ†Œ κ°œμˆ˜μ— 따라 λ‹€λ₯Ό 수 있기 λ•Œλ¬Έμ—, μ„œλΈŒ λ°°μ—΄μ˜ 크기λ₯Ό λ™μ μœΌλ‘œ ν• λ‹Ήν•  수 있음

μœ„ κ³Όμ • κΉŒμ§€κ°€ λ‚΄κ°€ μƒκ°ν•œ 방법을 μ‚¬μš©ν•˜κΈ° μœ„ν•œ μ „μ²˜λ¦¬ κ³Όμ •μ΄μ˜€κ³ , μœ„ 값을 ν•œλ²ˆλ” μ •λ ¬ν•˜μ—¬

NTuple[0]: [111]
NTuple[1]: [20, 111]

ν•΄λ‹Ή λ‚΄μš©μ²˜λŸΌ λ°°μ—΄μ˜ 크기가 μž‘μ€κ²ƒλΆ€ν„° 큰 μˆœμ„œλŒ€λ‘œ μ°¨λ‘€λ‘œ μ •λ ¬μ‹œμΌœ 첫 λ²ˆμ§Έμ—μ„œ 111을 μ €μž₯ν•˜λ©΄ λ‹€μŒ λ²ˆμ—” 111을 μ œμ™Έν•œ 20을 μ„ νƒν•˜κ²Œ ν•˜λŠ”κ²ƒμ΄ μ΅œμ’… λͺ©ν‘œμ΄λ‹€.

Arrays.sort(NTuple, Comparator.comparingInt(a -> a.length));

  • Comparator λŠ” 객체의 μˆœμ„œλ‚˜ μš°μ„ μˆœμœ„λ₯Ό κ²°μ •ν•˜λŠ” 데 μ‚¬μš©ν•˜λ˜λŠ” μΈν„°νŽ˜μ΄μŠ€

  • Comparator.comparingIntλŠ” μ£Όμ–΄μ§„ ν•¨μˆ˜μ— 따라 μ •μˆ˜ 값을 λ°˜ν™˜ν•˜λŠ” Comparator객체λ₯Ό μƒμ„±ν•˜λŠ” 정적 λ©”μ„œλ“œ

  • a -> a.lengthλŠ” int[] νƒ€μž…μ˜ λ°°μ—΄ aλ₯Ό μž…λ ₯λ°›μ•„ a.lengthλ₯Ό λ°˜ν™˜

  • 즉, NTuple λ°°μ—΄μ˜ μ„œλΈŒ 배열듀을 각각의 길이λ₯Ό κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœ μ •λ ¬

μœ„ 과정을 톡해 μ •λ ¬λœ 값을 μ–΄λ–»κ²Œ μ€‘λ³΅μ œκ±° ν•  것인가?

HashSet<Integer> set = new HashSet<>();
int[] answer = new int[NTuple.length];
       
int index = 0;
       
for(int[] arr : NTuple) {
	for(int num : arr) {
    	if(!set.contains(num)) {
        	set.add(num);
            answer[index++] = num;
        }
    }
}

set은 μ€‘λ³΅λœ 값을 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ” 자료ꡬ쑰둜 μ€‘λ³΅λœ 값을 μΆ”μ ν•˜κΈ° μœ„ν•΄ μ‚¬μš©

if(!set.contains(num))

  • ν˜„μž¬ 숫자 num이set에 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우 (즉, μ€‘λ³΅λ˜μ§€ μ•ŠλŠ” 경우)만 λ‘œμ§μ„ μ‹€ν–‰

set.add(num)

  • ν˜„μž¬ 숫자 num을 set에 μΆ”κ°€, μˆ«μžκ°€ 이후에 λ‹€μ‹œ λ‚˜νƒ€λ‚˜λ”λΌλ„ μ€‘λ³΅μœΌλ‘œ νŒλ‹¨λ  수있게 함

이 전체 둜직의 결과둜, answer 배열은 NTupleμ—μ„œ 발견된 μ€‘λ³΅λ˜μ§€ μ•ŠλŠ” μˆ«μžλ“€λ§Œμ„ μˆœμ„œλŒ€λ‘œ ν¬ν•¨ν•˜κ²Œ λœλ‹€.


κΈ°λŠ₯개발

πŸ“‘ λ¬Έ2) ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ νŒ€μ—μ„œλŠ” κΈ°λŠ₯ κ°œμ„  μž‘μ—…μ„ μˆ˜ν–‰ μ€‘μž…λ‹ˆλ‹€. 각 κΈ°λŠ₯은 진도가 100%일 λ•Œ μ„œλΉ„μŠ€μ— λ°˜μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

또, 각 κΈ°λŠ₯의 κ°œλ°œμ†λ„λŠ” λͺ¨λ‘ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— 뒀에 μžˆλŠ” κΈ°λŠ₯이 μ•žμ— μžˆλŠ” κΈ°λŠ₯보닀 λ¨Όμ € 개발될 수 있고, μ΄λ•Œ 뒀에 μžˆλŠ” κΈ°λŠ₯은 μ•žμ— μžˆλŠ” κΈ°λŠ₯이 배포될 λ•Œ ν•¨κ»˜ λ°°ν¬λ©λ‹ˆλ‹€.

λ¨Όμ € λ°°ν¬λ˜μ–΄μ•Ό ν•˜λŠ” μˆœμ„œλŒ€λ‘œ μž‘μ—…μ˜ 진도가 적힌 μ •μˆ˜ λ°°μ—΄ progresses와 각 μž‘μ—…μ˜ 개발 속도가 적힌 μ •μˆ˜ λ°°μ—΄ speedsκ°€ μ£Όμ–΄μ§ˆ λ•Œ 각 λ°°ν¬λ§ˆλ‹€ λͺ‡ 개의 κΈ°λŠ₯이 λ°°ν¬λ˜λŠ”μ§€λ₯Ό return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•˜μ„Έμš”.


μ œν•œμ‚¬ν•­

  • μž‘μ—…μ˜ 개수(progresses, speedsλ°°μ—΄μ˜ 길이)λŠ” 100개 μ΄ν•˜μž…λ‹ˆλ‹€.
  • μž‘μ—… μ§„λ„λŠ” 100 미만의 μžμ—°μˆ˜μž…λ‹ˆλ‹€.
  • μž‘μ—… μ†λ„λŠ” 100 μ΄ν•˜μ˜ μžμ—°μˆ˜μž…λ‹ˆλ‹€.
  • λ°°ν¬λŠ” ν•˜λ£¨μ— ν•œ 번만 ν•  수 있으며, ν•˜λ£¨μ˜ 끝에 이루어진닀고 κ°€μ •ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ μ§„λ„μœ¨μ΄ 95%인 μž‘μ—…μ˜ 개발 속도가 ν•˜λ£¨μ— 4%라면 λ°°ν¬λŠ” 2일 뒀에 μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

progressesspeedsreturn
[93,30,55][1,30,5][2,1]
[95,90,99,99,80,99][1,1,1,1,1,1][1,3,2]

μž…μΆœλ ₯ 예 μ„€λͺ…

μž…μΆœλ ₯ 예 #1

첫 번째 κΈ°λŠ₯은 93% μ™„λ£Œλ˜μ–΄ 있고 ν•˜λ£¨μ— 1%μ”© μž‘μ—…μ΄ κ°€λŠ₯ν•˜λ―€λ‘œ 7일간 μž‘μ—… ν›„ 배포가 κ°€λŠ₯ν•©λ‹ˆλ‹€.
두 번째 κΈ°λŠ₯은 30%κ°€ μ™„λ£Œλ˜μ–΄ 있고 ν•˜λ£¨μ— 30%μ”© μž‘μ—…μ΄ κ°€λŠ₯ν•˜λ―€λ‘œ 3일간 μž‘μ—… ν›„ 배포가 κ°€λŠ₯ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ 이전 첫 번째 κΈ°λŠ₯이 아직 μ™„μ„±λœ μƒνƒœκ°€ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— 첫 번째 κΈ°λŠ₯이 λ°°ν¬λ˜λŠ” 7일째 λ°°ν¬λ©λ‹ˆλ‹€.
μ„Έ 번째 κΈ°λŠ₯은 55%κ°€ μ™„λ£Œλ˜μ–΄ 있고 ν•˜λ£¨μ— 5%μ”© μž‘μ—…μ΄ κ°€λŠ₯ν•˜λ―€λ‘œ 9일간 μž‘μ—… ν›„ 배포가 κ°€λŠ₯ν•©λ‹ˆλ‹€.

λ”°λΌμ„œ 7일째에 2개의 κΈ°λŠ₯, 9일째에 1개의 κΈ°λŠ₯이 λ°°ν¬λ©λ‹ˆλ‹€.

μž…μΆœλ ₯ 예 #2

λͺ¨λ“  κΈ°λŠ₯이 ν•˜λ£¨μ— 1%μ”© μž‘μ—…μ΄ κ°€λŠ₯ν•˜λ―€λ‘œ, μž‘μ—…μ΄ λλ‚˜κΈ°κΉŒμ§€ 남은 μΌμˆ˜λŠ” 각각 5일, 10일, 1일, 1일, 20일, 1μΌμž…λ‹ˆλ‹€. μ–΄λ–€ κΈ°λŠ₯이 λ¨Όμ € μ™„μ„±λ˜μ—ˆλ”λΌλ„ μ•žμ— μžˆλŠ” λͺ¨λ“  κΈ°λŠ₯이 μ™„μ„±λ˜μ§€ μ•ŠμœΌλ©΄ 배포가 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

λ”°λΌμ„œ 5일째에 1개의 κΈ°λŠ₯, 10일째에 3개의 κΈ°λŠ₯, 20일째에 2개의 κΈ°λŠ₯이 λ°°ν¬λ©λ‹ˆλ‹€.


λ‚˜μ˜ 풀이

#1

package programmers;

import java.util.ArrayList;

public class Distribution {
	
	public static int[] solution(int[] progresses, int[] speeds) {
   
        ArrayList<Integer> list = new ArrayList<>();
        for(int i = 0; i < progresses.length; i++) {
        	int cnt = 0;
        	
        	int temp = 100 - progresses[i];
        	
        	int day = temp % speeds[i] == 0 ? temp / speeds[i] : (temp /speeds[i]) + 1;
        	
        	list.add(day);
        	
        }
        
        System.out.println(list);
        
        ArrayList<Integer> answerList  = new ArrayList<>();
        
        int prevDay = list.get(0);
        int count = 1;
        
        for(int i = 1; i < list.size(); i++) {
        	if(list.get(i) <= prevDay) {
        		count++;
        	}else {
        		answerList.add(count);
        		count = 1;
        		prevDay = list.get(i);
        	}
        }
        
        answerList.add(count);
        
        int[] answer = new int[answerList.size()];
        for (int i = 0; i < answerList.size(); i++) {
            answer[i] = answerList.get(i);
        }
        
        
        return answer;
    }
	
	
	public static void main(String[] args) {
		
		int[] progresses = new int[] {95,90,99,99,80,99};
		int[] speeds = new int[] {1,1,1,1,1,1};
		
		solution(progresses, speeds);
	}

}

#2(queue)λ₯Ό μ΄μš©ν•œ 방법

package programmers;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;

public class Distribution {
	
	public static int[] solution(int[] progresses, int[] speeds) {
   
		ArrayList<Integer> answerList  = new ArrayList<>();
        Queue<Integer> queue = new LinkedList<>();
        
        for(int i = 0; i < progresses.length; i++) {
        	int cnt = 0;
        	
        	int temp = 100 - progresses[i];
        	
        	int day = temp % speeds[i] == 0 ? temp / speeds[i] : (temp /speeds[i]) + 1;
        	
        	queue.add(day);
        	
        }
        
        System.out.println(queue);
        
        
        while(!queue.isEmpty()) {
        	int current = queue.poll();
        	
        	int count = 1;
        	
        	while(!queue.isEmpty() && queue.peek() <= current) {
        		count++;
        		queue.poll();
        	}
        	
        	answerList.add(count);
        }
        
        
        System.out.println(answerList);
        
        int[] answer = new int[answerList.size()];
        for (int i = 0; i < answerList.size(); i++) {
            answer[i] = answerList.get(i);
        }
        
        
        return answer;
    }
	
	
	public static void main(String[] args) {
		
		int[] progresses = new int[] {95,90,99,99,80,99};
		int[] speeds = new int[] {1,1,1,1,1,1};
		
		solution(progresses, speeds);
	}

}

λ‚˜μ˜ 생각

progresses: `[95,90,99,99,80,99]`	
speeds: `[1,1,1,1,1,1]`

λ₯Ό λ¨Όμ € μ‚΄νŽ΄λ³΄μž.

progresses[0] = 95 // speed : 1
progresses[1] = 90 // speed : 1
progresses[2] = 99 // speed : 1
progresses[3] = 99 // speed : 1
progresses[4] = 80 // speed : 1
progresses[5] = 99 // speed : 1

첫 번째 과정을 λλ‚΄λŠ”λ° 5일이 μ†Œμš”, 두 번째 과정을 λλ‚΄λŠ”λ° 10일 μ†Œμš”, μ„Έ 번째 과정을 λλ‚΄λŠ”λ° 1일, λ„€ 번째 과정을 λλ‚΄λŠ”λ° 1일, λ‹€μ„― 번째 과정을 λλ‚΄λŠ”λ° 20일 μ†Œμš”, λ§ˆμ§€λ§‰ 과정을 λλ‚΄λŠ”λ° 1일 μ†Œμš”λœλ‹€. (각 κΈ°λŠ₯의 κ°œλ°œμ†λ„λŠ” λͺ¨λ‘ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— 뒀에 μžˆλŠ” κΈ°λŠ₯이 μ•žμ— μžˆλŠ” κΈ°λŠ₯보닀 λ¨Όμ € 개발될 수 있고, μ΄λ•Œ 뒀에 μžˆλŠ” κΈ°λŠ₯은 μ•žμ— μžˆλŠ” κΈ°λŠ₯이 배포될 λ•Œ ν•¨κ»˜ 배포 λœλ‹€λŠ” 점을 κΈ°μ–΅ν•˜μž)

Queue<Integer> queue = new LinkedList<>();
        
for(int i = 0; i < progresses.length; i++) {
    int temp = 100 - progresses[i];
    int day = temp % speeds[i] == 0 ? temp / speeds[i] : (temp /speeds[i]) + 1;
    queue.add(day);
        	
}

QueueλŠ” μΈν„°νŽ˜μ΄μŠ€λ‘œ 큐(Queue) μžλ£Œκ΅¬μ‘°λŠ” First-In-First-Out(FIFO) 원칙을 λ”°λ₯΄λ©°, λ¨Όμ € λ“€μ–΄κ°„ μ›μ†Œκ°€ λ¨Όμ € λ‚˜μ˜€κ²Œ λœλ‹€. μœ„μ˜ λ‘œμ§μ„ μ‚΄νŽ΄λ³΄λ©΄ progresses과정을 μˆœνšŒν•˜λ©° μž‘μ—…μ™„λ£ŒμΌ = 100 - progresses[i] 은 남아 μžˆλŠ” 과정을 μ˜λ―Έν•˜λ©°, 남은 과정을 speed둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€κ°€ 0 이면 temp / sppeds[i] κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ (temp / speeds[i]) + 1을 ν•˜λŠ”λ°, 이λ₯Ό κ°„λ‹¨ν•œ 예둜 보면, 30% 배포가 μ™„λ£Œλœ μž‘μ—…μ΄ μžˆμ„λ•Œ, speedκ°€ 30이라면, λͺ¨λ“  μž‘μ—…μ΄ μ™„λ£Œλ λ•ŒκΉŒμ§€ κ±Έλ¦¬λŠ” μ‹œκ°„μ€ 3일이 μ†Œμš”λœλ‹€.

1일차 : 30 + 30
2일차 : 30 + 30 + 30
3일차 : 100%

// 이λ₯Ό 둜직으둜 κ΅¬ν˜„ν•˜λ©΄

100 - 30 // 남은 κ³Όμ • 70
70 / 30 을 μ§„ν–‰ν•˜λ©΄ λͺ«μ€ 2κ°€ λ‚˜μ˜€κ²Œ λ˜λŠ”λ° 
//μ‹€μ œλ‘œ κ±Έλ¦¬λŠ” μ‹œκ°„μ€ 3일 μ΄λ―€λ‘œ ν•΄λ‹Ή κ·œμΉ™μ„ λ‘œμ§ν™”ν•˜λ©΄

 int day = temp % speeds[i] == 0 ? temp / speeds[i] : (temp /speeds[i]) + 1;
 
 이 λœλ‹€. μœ„ 과정을 거치면 `queue`μ—λŠ” 각 μž‘μ—…μ΄ μ™„λ£Œλ˜κΈ°κΉŒμ§€ ν•„μš”ν•œ μΌμˆ˜κ°€ μ €μž₯λœλ‹€.
while(!queue.isEmpty()) {
	int current = queue.poll();
    int count = 1;
        	
    while(!queue.isEmpty() && queue.peek() <= current) {
    	count++;
        queue.poll();
    }
        	
    answerList.add(count);
}

ν•΄λ‹Ή loopλ₯Ό 보면,

  1. 첫 번째둜 queueμ—μ„œ poll() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 첫 번째 μž‘μ—…μ˜ μ™„λ£ŒμΌμΈ 5λ₯Ό κ°€μ Έμ˜΄, 이λ₯Ό current둜 μ§€μ •ν•˜κ³ , κ·Έ 날에 μ™„λ£Œλ  μž‘μ—… 수λ₯Ό κ³„μ‚°ν•œλ‹€.
  • current = 5

queue에 λ‚¨μ•„μžˆλŠ” μž‘μ—… μ™„λ£ŒμΌλ“€μ„ ν™•μΈν•˜λ©° current보닀 μž‘κ±°λ‚˜ 같은 μ™„λ£ŒμΌμ„ κ°–λŠ” μž‘μ—…λ“€μ„ λͺ¨λ‘ ν•΄λ‹Ή λ‚ μ§œμ— ν•¨κ»˜ 배포될 것. κ·ΈλŸ¬λ‚˜, 10은 5보닀 ν¬λ―€λ‘œ 이 μ‹œμ μ—μ„œ countλŠ” 1에 그치고 , 첫 번째 answerList에 μΆ”κ°€

  • answerList: [1]
  1. μ΄λ²ˆμ—λŠ” 10을 current둜 κ°€μ Έμ˜΄
  • current = 10
    queue에 λ‚¨μ•„μžˆλŠ” κ°’λ“€ 쀑 10보닀 μž‘κ±°λ‚˜ 같은 μ™„λ£ŒμΌμ„ κ°–λŠ” μž‘μ—…λ“€μ€ 1,1이고 이 두 μž‘μ—…κ³Ό ν˜„μž¬ μž‘μ—…κΉŒμ§€ 총 3개의 μž‘μ—…μ΄ ν•΄λ‹Ή 날에 배포될 κ²ƒμ΄λ―€λ‘œ countλŠ” 3

  • answerList: [1,3]

  1. λ§ˆμ§€λ§‰μœΌλ‘œ 20을 current둜 κ°€μ Έμ˜΄
  • current = 20
    queue에 λ‚¨μ•„μžˆλŠ” κ°’λ“€ 쀑 20보닀 μž‘κ±°λ‚˜ 같은 μ™„λ£ŒμΌμ„ κ°–λŠ” μž‘μ—…μ€ 1 이고, ν˜„μž¬ μž‘μ—… 포함 총 2개의 μž‘μ—…μ΄ ν•΄λ‹Ή 날에 배포됨 countλŠ” 2

    • answerList: [1,3,2]

ν”„λ‘œμ„ΈμŠ€

πŸ“‘ λ¬Έ3) 운영체제의 μ—­ν•  쀑 ν•˜λ‚˜λŠ” 컴퓨터 μ‹œμŠ€ν…œμ˜ μžμ›μ„ 효율적으둜 κ΄€λ¦¬ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 이 λ¬Έμ œμ—μ„œλŠ” μš΄μ˜μ²΄μ œκ°€ λ‹€μŒ κ·œμΉ™μ— 따라 ν”„λ‘œμ„ΈμŠ€λ₯Ό 관리할 경우 νŠΉμ • ν”„λ‘œμ„ΈμŠ€κ°€ λͺ‡ 번째둜 μ‹€ν–‰λ˜λŠ”μ§€ μ•Œμ•„λ‚΄λ©΄ λ©λ‹ˆλ‹€.

1. μ‹€ν–‰ λŒ€κΈ° 큐(Queue)μ—μ„œ λŒ€κΈ°μ€‘μΈ ν”„λ‘œμ„ΈμŠ€ ν•˜λ‚˜λ₯Ό κΊΌλƒ…λ‹ˆλ‹€.
2. 큐에 λŒ€κΈ°μ€‘μΈ ν”„λ‘œμ„ΈμŠ€ 쀑 μš°μ„ μˆœμœ„κ°€ 더 높은 ν”„λ‘œμ„ΈμŠ€κ°€ μžˆλ‹€λ©΄ 방금 κΊΌλ‚Έ ν”„λ‘œμ„ΈμŠ€λ₯Ό λ‹€μ‹œ 큐에 λ„£μŠ΅λ‹ˆλ‹€.
3. λ§Œμ•½ 그런 ν”„λ‘œμ„ΈμŠ€κ°€ μ—†λ‹€λ©΄ 방금 κΊΌλ‚Έ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€.
  3.1 ν•œ 번 μ‹€ν–‰ν•œ ν”„λ‘œμ„ΈμŠ€λŠ” λ‹€μ‹œ 큐에 λ„£μ§€ μ•Šκ³  κ·ΈλŒ€λ‘œ μ’…λ£Œλ©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ ν”„λ‘œμ„ΈμŠ€ 4개 [A, B, C, D]κ°€ μˆœμ„œλŒ€λ‘œ μ‹€ν–‰ λŒ€κΈ° 큐에 λ“€μ–΄μžˆκ³ , μš°μ„ μˆœμœ„κ°€ [2, 1, 3, 2]라면 [C, D, A, B] 순으둜 μ‹€ν–‰ν•˜κ²Œ λ©λ‹ˆλ‹€.

ν˜„μž¬ μ‹€ν–‰ λŒ€κΈ° 큐(Queue)에 μžˆλŠ” ν”„λ‘œμ„ΈμŠ€μ˜ μ€‘μš”λ„κ°€ μˆœμ„œλŒ€λ‘œ λ‹΄κΈ΄ λ°°μ—΄ priorities와, λͺ‡ 번째둜 μ‹€ν–‰λ˜λŠ”μ§€ μ•Œκ³ μ‹Άμ€ ν”„λ‘œμ„ΈμŠ€μ˜ μœ„μΉ˜λ₯Ό μ•Œλ €μ£ΌλŠ” location이 λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, ν•΄λ‹Ή ν”„λ‘œμ„ΈμŠ€κ°€ λͺ‡ 번째둜 μ‹€ν–‰λ˜λŠ”μ§€ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μž‘μ„±ν•΄μ£Όμ„Έμš”.


μ œν•œμ‚¬ν•­

  • priorities의 κΈΈμ΄λŠ” 1 이상 100 μ΄ν•˜μž…λ‹ˆλ‹€.
    • priorities의 μ›μ†ŒλŠ” 1 이상 9 μ΄ν•˜μ˜ μ •μˆ˜μž…λ‹ˆλ‹€.
    • priorities의 μ›μ†ŒλŠ” μš°μ„ μˆœμœ„λ₯Ό λ‚˜νƒ€λ‚΄λ©° μˆ«μžκ°€ 클 수둝 μš°μ„ μˆœμœ„κ°€ λ†’μŠ΅λ‹ˆλ‹€.
  • location은 0 이상 (λŒ€κΈ° 큐에 μžˆλŠ” ν”„λ‘œμ„ΈμŠ€ 수 - 1) μ΄ν•˜μ˜ 값을 κ°€μ§‘λ‹ˆλ‹€.
    • priorities의 κ°€μž₯ μ•žμ— 있으면 0, 두 λ²ˆμ§Έμ— 있으면 1 … κ³Ό 같이 ν‘œν˜„ν•©λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

prioritieslocationreturn
[2,1,3,2]21
[1,1,9,1,1,1]05

μž…μΆœλ ₯ 예 μ„€λͺ…

예제 #2

  • 6개의 ν”„λ‘œμ„ΈμŠ€ [A, B, C, D, E, F]κ°€ λŒ€κΈ° 큐에 있고 μ€‘μš”λ„κ°€ [1, 1, 9, 1, 1, 1] μ΄λ―€λ‘œ [C, D, E, F, A, B] 순으둜 μ‹€ν–‰λ©λ‹ˆλ‹€. λ”°λΌμ„œ AλŠ” 5번째둜 μ‹€ν–‰λ©λ‹ˆλ‹€.

λ‚˜μ˜ 풀이

#1

package programmers;

import java.util.LinkedList;
import java.util.Queue;

public class Process {
	
	public static int solution(int[] priorities, int location) {
        int answer = 0;
        
        Queue<Integer> priorityQueue = new LinkedList<>();
        Queue<Integer> locationQueue = new LinkedList<>();
        
        for(int i = 0; i < priorities.length; i++) {
        	priorityQueue.add(priorities[i]);
        	locationQueue.add(i);
        }
        
        while(! priorityQueue.isEmpty()) {
        	int currentPriority = priorityQueue.poll();
        	int currentLocation = locationQueue.poll();
        	boolean hasHigherPriority = false;
        	
        	
        	for (int priority : priorityQueue) {
                if (priority > currentPriority) {
                    hasHigherPriority = true;
                    break;
                }
            }
        	
        	if(hasHigherPriority) {
        		priorityQueue.add(currentPriority);
        		locationQueue.add(currentLocation);
        	}else {
        		System.out.println("currentLocation: "+currentLocation);
        		answer++;
        		if(currentLocation == location) {
        			System.out.println(answer);
        			return answer;
        		}
        	}
        }
        
        return -1;
    }
	
	public static void main(String[] args) {
		
		int[] priorities = new int[] {1,1,9,1,1,1};
		
		solution(priorities, 0);
	}

}



λ‚˜μ˜ 생각

두 개의 큐 (priorityQueue,locationQueue)λ₯Ό 생성

  • priorityQueueλŠ” ν”„λ‘œμ„ΈμŠ€μ˜ μš°μ„ μˆœμœ„λ₯Ό μ €μž₯
  • locationQueueλŠ” ν”„λ‘œμ„ΈμŠ€μ˜ μœ„μΉ˜λ₯Ό μ €μž₯

λͺ¨λ“  μš°μ„ μˆœμœ„μ™€ μœ„μΉ˜λ₯Ό ν•΄λ‹Ή 큐에 μΆ”κ°€

priorityQueueκ°€ 빌 λ•ŒκΉŒμ§€ μ•„λž˜μ˜ λ™μž‘μ„ 반볡

  • ν˜„μž¬ 큐의 맨 μ•ž ν”„λ‘œμ„ΈμŠ€μ˜ μš°μ„ μˆœμœ„μ™€ μœ„μΉ˜λ₯Ό 꺼냄
  • λ§Œμ•½ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€κ°€ ν˜„μž¬ ν”„λ‘œμ„ΈμŠ€λ³΄λ‹€ 더 높은 μš°μ„ μˆœμœ„λ₯Ό κ°€μ§€κ³  μžˆλ‹€λ©΄, ν˜„μž¬ ν”„λ‘œμ„ΈμŠ€μ˜ μš°μ„ μˆœμœ„μ™€ μœ„μΉ˜λ₯Ό 큐의 맨 λ’€λ‘œ λ‹€μ‹œ λ„£μŒ
  • κ·Έλ ‡μ§€μ•ŠμœΌλ©΄, ν˜„μž¬ ν”„λ‘œμ„ΈμŠ€λŠ” 처리되며, 처리 μˆœμ„œλ₯Ό λ‚˜νƒ€λ‚΄λŠ” answer 값을 1 μ¦κ°€μ‹œν‚€κ³ , ν˜„μž¬ ν”„λ‘œμ„ΈμŠ€μ˜ μœ„μΉ˜κ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§„ locationκ³Ό μΌμΉ˜ν•˜λ©΄ answer을 λ°˜ν™˜
priorities = {1,1,9,1,1,1}
priorityQueue = {1,1,9,1,1,1}
locationQueue = {0,1,2,3,4,5}
location = 0
answer = 0

1. 첫 번째 반볡 : 
- ν˜„μž¬ ν”„λ‘œμ„ΈμŠ€ μš°μ„ μˆœμœ„λŠ” 1, μœ„μΉ˜λŠ” 0
- 큐 내에 μš°μ„ μˆœμœ„ 9κ°€ μžˆμœΌλ―€λ‘œ ν˜„μž¬ ν”„λ‘œμ„ΈμŠ€λ₯Ό 큐의 맨 λ’€λ‘œ λ‹€μ‹œ λ„£μŒ

priorityQueue = {1,9,1,1,1,1}
locationQueue = {1,2,3,4,5,0}

2. 두 번째 반볡 : 
- ν˜„μž¬ ν”„λ‘œμ„ΈμŠ€ μš°μ„ μˆœμœ„λŠ” 1, μœ„μΉ˜λŠ” 1
- μš°μ„ μˆœμœ„ 9κ°€ μžˆμœΌλ―€λ‘œ ν˜„μž¬ ν”„λ‘œμ„ΈμŠ€λ₯Ό 큐의 맨 λ’€λ‘œ λ‹€μ‹œ λ„£μŒ

priorityQueue = {9,1,1,1,1,1}
locationQueue = {2,3,4,5,0,1}

3. μ„Έ 번째 반볡 : 
- ν˜„μž¬ ν”„λ‘œμ„ΈμŠ€ μš°μ„ μˆœμœ„λŠ” 9, μœ„μΉ˜λŠ” 2
- 이것은 κ°€μž₯ 높은 μš°μ„ μˆœμœ„λ₯Ό κ°€μ§„ ν”„λ‘œμ„ΈμŠ€μ΄λ―€λ‘œ answer을 1 μ¦κ°€μ‹œν‚΄

priorityQueue = {1,1,1,1,1}
locationQueue = {3,4,5,0,1}

4. λ„€ 번째 반볡 : 
- ν˜„μž¬ ν”„λ‘œμ„ΈμŠ€ μš°μ„ μˆœμœ„λŠ” 1, μœ„μΉ˜λŠ” 3
- μš°μ„ μˆœμœ„ 1은 ν˜„μž¬ κ°€μž₯ 높은 μš°μ„ μˆœμœ„μ΄λ―€λ‘œ 처리됨 (answer = 2)

priorityQueue = {1,1,1,1}
locationQueue = {4,5,0,1}

5. λ‹€μ„― 번째 반볡 : 
- ν˜„μž¬ ν”„λ‘œμ„ΈμŠ€ μš°μ„ μˆœμœ„λŠ” 1, μœ„μΉ˜λŠ” 4
- μš°μ„ μˆœμœ„ 1은 ν˜„μž¬ κ°€μž₯ 높은 μš°μ„ μˆœμœ„μ΄λ―€λ‘œ 처리됨 (answer = 3)

priorityQueue = {1,1,1}
locationQueue = {5,0,1}

6. μ—¬μ„― 번째 반볡 : 
- ν˜„μž¬ ν”„λ‘œμ„ΈμŠ€ μš°μ„ μˆœμœ„λŠ” 1, μœ„μΉ˜λŠ” 5
- μš°μ„ μˆœμœ„ 1은 ν˜„μž¬ κ°€μž₯ 높은 μš°μ„ μˆœμœ„μ΄λ―€λ‘œ 처리됨 (answer = 4)

priorityQueue = {1,1}
locationQueue = {0,1}

7. 일곱 번째 반볡 : 

- ν˜„μž¬ ν”„λ‘œμ„ΈμŠ€ μš°μ„ μˆœμœ„λŠ” 1, μœ„μΉ˜λŠ” 0 ← (location = 0 κ³Ό 일치)
- μš°μ„ μˆœμœ„ 1은 ν˜„μž¬ κ°€μž₯ 높은 μš°μ„ μˆœμœ„μ΄λ―€λ‘œ 처리됨 (answer = 5)

priorityQueue = {1}
locationQueue = {1}

8. μ—¬λŸ 번째 반볡 : 

- ν˜„μž¬ ν”„λ‘œμ„ΈμŠ€ μš°μ„ μˆœμœ„λŠ” 1, μœ„μΉ˜λŠ” 1
- μš°μ„ μˆœμœ„ 1은 ν˜„μž¬ κ°€μž₯ 높은 μš°μ„ μˆœμœ„μ΄λ―€λ‘œ 처리됨
- priorityQueueλŠ” λΉ„μ–΄μžˆμŒ




λ‰΄μŠ€ ν΄λŸ¬μŠ€ν„°λ§

πŸ“‘ λ¬Έ4) μ—¬λŸ¬ μ–Έλ‘ μ‚¬μ—μ„œ μŸμ•„μ§€λŠ” λ‰΄μŠ€, 특히 속보성 λ‰΄μŠ€λ₯Ό 보면 λΉ„μŠ·λΉ„μŠ·ν•œ 제λͺ©μ˜ 기사가 λ§Žμ•„ μ •μž‘ ν•„μš”ν•œ 기사λ₯Ό μ°ΎκΈ°κ°€ μ–΄λ ΅λ‹€. Daum λ‰΄μŠ€μ˜ 개발 업무λ₯Ό 맑게 된 μ‹ μž…μ‚¬μ› νŠœλΈŒλŠ” μ‚¬μš©μžλ“€μ΄ νŽΈλ¦¬ν•˜κ²Œ λ‹€μ–‘ν•œ λ‰΄μŠ€λ₯Ό μ°Ύμ•„λ³Ό 수 μžˆλ„λ‘ λ¬Έμ œμ μ„ κ°œμ„ ν•˜λŠ” 업무λ₯Ό 맑게 λ˜μ—ˆλ‹€.

개발의 λ°©ν–₯을 작기 μœ„ν•΄ νŠœλΈŒλŠ” μš°μ„  졜근 ν™”μ œκ°€ 되고 μžˆλŠ” "카카였 μ‹ μž… 개발자 곡채" κ΄€λ ¨ 기사λ₯Ό κ²€μƒ‰ν•΄λ³΄μ•˜λ‹€.

  • 카카였 첫 곡채..'λΈ”λΌμΈλ“œ' 방식 μ±„μš©
  • 카카였, 합병 ν›„ 첫 곡채.. λΈ”λΌμΈλ“œ μ „ν˜•μœΌλ‘œ 개발자 μ±„μš©
  • 카카였, λΈ”λΌμΈλ“œ μ „ν˜•μœΌλ‘œ μ‹ μž… 개발자 곡채
  • 카카였 곡채, μ‹ μž… 개발자 μ½”λ”© λŠ₯λ ₯만 λ³Έλ‹€
  • 카카였, μ‹ μž… 곡채.. "μ½”λ”© μ‹€λ ₯만 λ³Έλ‹€"
  • 카카였 "μ½”λ”© λŠ₯λ ₯만으둜 2018 μ‹ μž… 개발자 λ½‘λŠ”λ‹€"

κΈ°μ‚¬μ˜ 제λͺ©μ„ κΈ°μ€€μœΌλ‘œ "λΈ”λΌμΈλ“œ μ „ν˜•"에 μ£Όλͺ©ν•˜λŠ” 기사와 "μ½”λ”© ν…ŒμŠ€νŠΈ"에 μ£Όλͺ©ν•˜λŠ” κΈ°μ‚¬λ‘œ λ‚˜λ‰˜λŠ” κ±Έ λ°œκ²¬ν–ˆλ‹€. νŠœλΈŒλŠ” 이듀을 각각 λ¬Άμ–΄μ„œ 보여주면 카카였 곡채 κ΄€λ ¨ 기사λ₯Ό μ°Ύμ•„λ³΄λŠ” μ‚¬μš©μžμ—κ²Œ μœ μš©ν•  λ“―μ‹Άμ—ˆλ‹€.

μœ μ‚¬ν•œ 기사λ₯Ό λ¬ΆλŠ” 기쀀을 μ •ν•˜κΈ° μœ„ν•΄μ„œ λ…Όλ¬Έκ³Ό 자료λ₯Ό μ‘°μ‚¬ν•˜λ˜ νŠœλΈŒλŠ” "μžμΉ΄λ“œ μœ μ‚¬λ„"λΌλŠ” 방법을 μ°Ύμ•„λƒˆλ‹€.

μžμΉ΄λ“œ μœ μ‚¬λ„λŠ” μ§‘ν•© κ°„μ˜ μœ μ‚¬λ„λ₯Ό κ²€μ‚¬ν•˜λŠ” μ—¬λŸ¬ 방법 μ€‘μ˜ ν•˜λ‚˜λ‘œ μ•Œλ €μ Έ μžˆλ‹€. 두 μ§‘ν•© A, B μ‚¬μ΄μ˜ μžμΉ΄λ“œ μœ μ‚¬λ„ J(A, B)λŠ” 두 μ§‘ν•©μ˜ ꡐ집합 크기λ₯Ό 두 μ§‘ν•©μ˜ ν•©μ§‘ν•© 크기둜 λ‚˜λˆˆ κ°’μœΌλ‘œ μ •μ˜λœλ‹€.

예λ₯Ό λ“€μ–΄ μ§‘ν•© A = {1, 2, 3}, μ§‘ν•© B = {2, 3, 4}라고 ν•  λ•Œ, ꡐ집합 A ∩ B = {2, 3}, ν•©μ§‘ν•© A βˆͺ B = {1, 2, 3, 4}이 λ˜λ―€λ‘œ, μ§‘ν•© A, B μ‚¬μ΄μ˜ μžμΉ΄λ“œ μœ μ‚¬λ„ J(A, B) = 2/4 = 0.5κ°€ λœλ‹€. μ§‘ν•© A와 μ§‘ν•© Bκ°€ λͺ¨λ‘ 곡집합일 κ²½μš°μ—λŠ” λ‚˜λˆ—μ…ˆμ΄ μ •μ˜λ˜μ§€ μ•ŠμœΌλ‹ˆ λ”°λ‘œ J(A, B) = 1둜 μ •μ˜ν•œλ‹€.

μžμΉ΄λ“œ μœ μ‚¬λ„λŠ” μ›μ†Œμ˜ 쀑볡을 ν—ˆμš©ν•˜λŠ” 닀쀑집합에 λŒ€ν•΄μ„œ ν™•μž₯ν•  수 μžˆλ‹€. 닀쀑집합 AλŠ” μ›μ†Œ "1"을 3개 κ°€μ§€κ³  있고, 닀쀑집합 BλŠ” μ›μ†Œ "1"을 5개 κ°€μ§€κ³  μžˆλ‹€κ³  ν•˜μž. 이 λ‹€μ€‘μ§‘ν•©μ˜ ꡐ집합 A ∩ BλŠ” μ›μ†Œ "1"을 min(3, 5)인 3개, ν•©μ§‘ν•© A βˆͺ BλŠ” μ›μ†Œ "1"을 max(3, 5)인 5개 κ°€μ§€κ²Œ λœλ‹€. 닀쀑집합 A = {1, 1, 2, 2, 3}, 닀쀑집합 B = {1, 2, 2, 4, 5}라고 ν•˜λ©΄, ꡐ집합 A ∩ B = {1, 2, 2}, ν•©μ§‘ν•© A βˆͺ B = {1, 1, 2, 2, 3, 4, 5}κ°€ λ˜λ―€λ‘œ, μžμΉ΄λ“œ μœ μ‚¬λ„ J(A, B) = 3/7, μ•½ 0.42κ°€ λœλ‹€.

이λ₯Ό μ΄μš©ν•˜μ—¬ λ¬Έμžμ—΄ μ‚¬μ΄μ˜ μœ μ‚¬λ„λ₯Ό κ³„μ‚°ν•˜λŠ”λ° μ΄μš©ν•  수 μžˆλ‹€. λ¬Έμžμ—΄ "FRANCE"와 "FRENCH"κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, 이λ₯Ό 두 κΈ€μžμ”© λŠμ–΄μ„œ 닀쀑집합을 λ§Œλ“€ 수 μžˆλ‹€. 각각 {FR, RA, AN, NC, CE}, {FR, RE, EN, NC, CH}κ°€ 되며, ꡐ집합은 {FR, NC}, 합집합은 {FR, RA, AN, NC, CE, RE, EN, CH}κ°€ λ˜λ―€λ‘œ, 두 λ¬Έμžμ—΄ μ‚¬μ΄μ˜ μžμΉ΄λ“œ μœ μ‚¬λ„ J("FRANCE", "FRENCH") = 2/8 = 0.25κ°€ λœλ‹€.


μž…λ ₯ ν˜•μ‹

  • μž…λ ₯μœΌλ‘œλŠ” str1κ³Ό str2의 두 λ¬Έμžμ—΄μ΄ λ“€μ–΄μ˜¨λ‹€. 각 λ¬Έμžμ—΄μ˜ κΈΈμ΄λŠ” 2 이상, 1,000 μ΄ν•˜μ΄λ‹€.
  • μž…λ ₯으둜 λ“€μ–΄μ˜¨ λ¬Έμžμ—΄μ€ 두 κΈ€μžμ”© λŠμ–΄μ„œ λ‹€μ€‘μ§‘ν•©μ˜ μ›μ†Œλ‘œ λ§Œλ“ λ‹€. μ΄λ•Œ 영문자둜 된 κΈ€μž 쌍만 μœ νš¨ν•˜κ³ , 기타 κ³΅λ°±μ΄λ‚˜ 숫자, 특수 λ¬Έμžκ°€ λ“€μ–΄μžˆλŠ” κ²½μš°λŠ” κ·Έ κΈ€μž μŒμ„ 버린닀. 예λ₯Ό λ“€μ–΄ "ab+"κ°€ μž…λ ₯으둜 λ“€μ–΄μ˜€λ©΄, "ab"만 λ‹€μ€‘μ§‘ν•©μ˜ μ›μ†Œλ‘œ μ‚Όκ³ , "b+"λŠ” 버린닀.
  • 닀쀑집합 μ›μ†Œ 사이λ₯Ό 비ꡐ할 λ•Œ, λŒ€λ¬Έμžμ™€ μ†Œλ¬Έμžμ˜ μ°¨μ΄λŠ” λ¬΄μ‹œν•œλ‹€. "AB"와 "Ab", "ab"λŠ” 같은 μ›μ†Œλ‘œ μ·¨κΈ‰ν•œλ‹€.

좜λ ₯ ν˜•μ‹

  • μž…λ ₯으둜 λ“€μ–΄μ˜¨ 두 λ¬Έμžμ—΄μ˜ μžμΉ΄λ“œ μœ μ‚¬λ„λ₯Ό 좜λ ₯ν•œλ‹€. μœ μ‚¬λ„ 값은 0μ—μ„œ 1 μ‚¬μ΄μ˜ μ‹€μˆ˜μ΄λ―€λ‘œ, 이λ₯Ό 닀루기 쉽도둝 65536을 κ³±ν•œ 후에 μ†Œμˆ˜μ  μ•„λž˜λ₯Ό 버리고 μ •μˆ˜λΆ€λ§Œ 좜λ ₯ν•œλ‹€.

예제 μž…μΆœλ ₯

str1str2answer
FRANCEfrench16384
handshakeshake hands65536
aa1+aa2AAAA1243690
E=M*C^2e=m*c^265536

λ‚˜μ˜ 풀이

package programmers;

import java.util.ArrayList;

public class Clustering {
	
	public static int solution(String str1, String str2) {
		int answer = 1;
        
        str1 = str1.toLowerCase();
        str2 = str2.toLowerCase();
        
        ArrayList<String> set1 = new ArrayList<>();
        ArrayList<String> set2 = new ArrayList<>();
        
        int legnthA = str1.length();
        int legnthB = str2.length();
        
        for(int i = 0; i < legnthA - 1; i++) {
        	
        	String subString = str1.substring(i, i+2);
        	
        	if(subString.matches("[a-z]{2}")) {
        		set1.add(subString);        		
        	}
        	
        	
        }
        
        for(int i = 0; i < legnthB - 1; i++) {
        	
        	String subString = str2.substring(i, i+2);
        	
        	if(subString.matches("[a-z]{2}")) {
        		set2.add(subString);        		
        	}
        	
        }
        
       
        
        double union = set1.size() + set2.size();
        double intersection = 0;
        
        
        
        if(!set1.isEmpty() || !set2.isEmpty()) {
        	for(String s : set1) {
        		if(set2.contains(s)) {
        			intersection++;
        			set2.remove(s);
        		}
        	}
        	
        	union -= intersection;        	
        }
        
        
        
        
        if(set1.isEmpty() && set2.isEmpty()) {
        	answer *= 65536;
        }else {
        	double a = (intersection / union ) ; 
        	answer = (int) (a * 65536);        	
        }
        
        
        
        return answer;
    }
	
	
	public static void main(String[] args) {
		
		solution("E=M*C^2", "e=m*c^2");
	}

}

λ‚˜μ˜ 생각

문제λ₯Ό νŒŒμ•…ν•΄λ³΄λ©΄

String str1 = "FRANCE";
String str2 = "french";

μΌλ•Œ 

[fr, ra, an, nc, ce]
[fr, re, en, nc, ch]

μ΄λ ‡κ²Œ λ‚˜λˆ„μ–΄ μ§€κ³ , str1 & str2의 ν•©μ§‘ν•© : [fr,ra,re,an,en,nc,ce,ch]
str1 & str2의 ꡐ집합 : [fr, nc] κ°€ λ˜μ–΄ μ΄λ•Œμ˜ μœ μ‚¬λ„λ₯Ό 2/8 = 0.25κ°€ λœλ‹€. 

μ—¬κΈ°μ„œ 특수문자, 숫자, 곡백을 ν¬ν•¨ν•œ 문자이면 λ¬Έμžμ—΄μ— μΆ”κ°€ν•˜μ§€ μ•ŠλŠ”λ‹€.

λ‚΄κ°€ κ΅¬μ„±ν•œ λ‘œμ§μ„ μ‚΄νŽ΄λ³΄λ©΄ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§€λŠ” str1, str2λ₯Ό λŒ€λ¬Έμžλ“  μ†Œλ¬Έμžλ“  λͺ¨λ“  문자λ₯Ό μ†Œλ¬Έμžλ‘œ λ³€ν™˜ν•œλ‹€.

str1 = str1.toLowerCase();
str2 = str2.toLowerCase();

그리고 이 문자λ₯Ό λ¦¬μŠ€νŠΈμ— μ‰½κ²Œ μ €μž₯ν•˜κ³ , μ œκ±°ν•˜κΈ° μœ„ν•œ ArrayListκ°€ ν•„μš”ν•˜λ‹€. 핡심 λ‘œμ§μ„ μ‚΄νŽ΄λ³΄λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

for(int i = 0; i < legnthA - 1; i++) {
        	
	String subString = str1.substring(i, i+2);
        	
    if(subString.matches("[a-z]{2}")) {
    	set1.add(subString);        		
    }
        	
        	
}

String subString = str.substring(i, i+2); λŠ” forλ¬Έ 순회λ₯Ό 톡해 문자λ₯Ό λ‘κΈ€μžμ”© 자λ₯΄κ³ , matches()λŠ” ν™•μΈν•˜λ €λŠ” νŒ¨ν„΄μ˜ μ •κ·œ ν‘œν˜„μ‹κ³Ό μΌμΉ˜ν•˜λŠ”μ§€ νŒλ³„ν•˜λŠ” λ©”μ„œλ“œλ‘œ
"[a-z]{2}"λ₯Ό λΆ„μ„ν•˜λ©΄

[a-z] : μ†Œλ¬Έμž μ•ŒνŒŒλ²³ 쀑 ν•˜λ‚˜μ™€ μΌμΉ˜ν•¨
{2} : λ°”λ‘œ μ•žμ˜ νŒ¨ν„΄μ΄ μ •ν™•νžˆ 2번 λ°˜λ³΅λ¨μ„ 의미 
즉, μ†Œλ¬Έμž μ•ŒνŒŒλ²³μ΄ 2번 λ°˜λ³΅λ˜μ–΄μ•Ό 함을 의미

"ab" -> true
"aB" -> false
"abc" -> false
"1a" -> false

그리고 μ΄λ ‡κ²Œ νŒ¨ν„΄μ„ ν†΅κ³Όν•œ 문자만이 List에 μ €μž₯λœλ‹€. λ‚˜λ¨Έμ§€ λ‘œμ§μ„ 보면

double union = set1.size() + set2.size();
double intersection = 0;
        
if(!set1.isEmpty() || !set2.isEmpty()) {
	for(String s : set1) {
    	if(set2.contains(s)) {
        	intersection++;
            set2.remove(s);
        }
    }
        	
    union -= intersection;        	
}
        
        
        
        
if(set1.isEmpty() && set2.isEmpty()) {
	answer *= 65536;
}else {
	double a = (intersection / union ) ; 
    answer = (int) (a * 65536);        	
}

합집합은 set1, set2 의 ν•©μ—μ„œ ꡐ집합을 λΊ€ 값이고, ꡐ집합은 set1,set2의 κ³΅ν†΅λœ 값을 μ˜λ―Έν•œλ‹€.

if(!set1.isEmpty() || !set2.isEmpty()) 쑰건이 ν•„μš”ν•œ μ΄μœ λŠ” λ‘˜ 쀑 ν•˜λ‚˜λΌλ„ 곡집합이 μ•„λ‹Œ 경우λ₯Ό κ²€μ‚¬ν•˜λŠ” κ²ƒμœΌλ‘œ 두 λ¬Έμžμ—΄μ—μ„œ λͺ¨λ‘ 영문자의 μ—°μ†λœ 두 κΈ€μž μŒμ„ ν•˜λ‚˜ 이상 λ°œκ²¬ν•œ κ²½μš°μ΄λ‹€.

  1. ꡐ집합을 κ³„μ‚°ν•˜λŠ” 경우 : set1에 μžˆλŠ” 각 μ›μ†Œκ°€ set2에도 μžˆλŠ”μ§€ ν™•μΈν•˜λ €λ©΄, 두 μ§‘ν•© 쀑 적어도 ν•˜λ‚˜κ°€ λΉ„μ–΄ μžˆμ§€ μ•Šμ•„μ•Όν•œλ‹€. λΉ„μ–΄μžˆλŠ” 경우 ꡐ집합은 항상 κ³΅μ§‘ν•©μ΄λ―€λ‘œ, ꡐ집합을 계산할 ν•„μš”κ°€ μ—†μŒ
  2. 합집합을 κ³„μ‚°ν•˜λŠ” 경우 : 두 집합이 λͺ¨λ‘ λΉ„μ–΄μžˆλŠ” 경우, 합집합도 곡집합이 λœλ‹€. λ”°λΌμ„œ ν•©μ§‘ν•©μ˜ 크기(union)μ—μ„œ κ΅μ§‘ν•©μ˜ 크기(intersection)λ₯Ό λΉΌλŠ” 연산은 두 μ§‘ν•© 쀑 ν•˜λ‚˜λΌλ„ λΉ„μ–΄ μžˆμ§€ μ•Šμ€ κ²½μš°μ—λ§Œ μ˜λ―Έκ°€ 있음

ν”Όλ‘œλ„

πŸ“‘ λ¬Έ5) XXκ²Œμž„μ—λŠ” ν”Όλ‘œλ„ μ‹œμŠ€ν…œ(0 μ΄μƒμ˜ μ •μˆ˜λ‘œ ν‘œν˜„ν•©λ‹ˆλ‹€)이 있으며, 일정 ν”Όλ‘œλ„λ₯Ό μ‚¬μš©ν•΄μ„œ λ˜μ „μ„ νƒν—˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ•Œ, 각 λ˜μ „λ§ˆλ‹€ νƒν—˜μ„ μ‹œμž‘ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„"와 λ˜μ „ νƒν—˜μ„ λ§ˆμ³€μ„ λ•Œ μ†Œλͺ¨λ˜λŠ” "μ†Œλͺ¨ ν”Όλ‘œλ„"κ°€ μžˆμŠ΅λ‹ˆλ‹€. "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„"λŠ” ν•΄λ‹Ή λ˜μ „μ„ νƒν—˜ν•˜κΈ° μœ„ν•΄ κ°€μ§€κ³  μžˆμ–΄μ•Ό ν•˜λŠ” μ΅œμ†Œν•œμ˜ ν”Όλ‘œλ„λ₯Ό λ‚˜νƒ€λ‚΄λ©°, "μ†Œλͺ¨ ν”Όλ‘œλ„"λŠ” λ˜μ „μ„ νƒν—˜ν•œ ν›„ μ†Œλͺ¨λ˜λŠ” ν”Όλ‘œλ„λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„"κ°€ 80, "μ†Œλͺ¨ ν”Όλ‘œλ„"κ°€ 20인 λ˜μ „μ„ νƒν—˜ν•˜κΈ° μœ„ν•΄μ„œλŠ” μœ μ €μ˜ ν˜„μž¬ 남은 ν”Όλ‘œλ„λŠ” 80 이상 이어야 ν•˜λ©°, λ˜μ „μ„ νƒν—˜ν•œ ν›„μ—λŠ” ν”Όλ‘œλ„ 20이 μ†Œλͺ¨λ©λ‹ˆλ‹€.

이 κ²Œμž„μ—λŠ” ν•˜λ£¨μ— ν•œ λ²ˆμ”© νƒν—˜ν•  수 μžˆλŠ” λ˜μ „μ΄ μ—¬λŸ¬κ°œ μžˆλŠ”λ°, ν•œ μœ μ €κ°€ 였늘 이 λ˜μ „λ“€μ„ μ΅œλŒ€ν•œ 많이 νƒν—˜ν•˜λ € ν•©λ‹ˆλ‹€. μœ μ €μ˜ ν˜„μž¬ ν”Όλ‘œλ„ k와 각 λ˜μ „λ³„ "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„", "μ†Œλͺ¨ ν”Όλ‘œλ„"κ°€ λ‹΄κΈ΄ 2차원 λ°°μ—΄ dungeons κ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, μœ μ €κ°€ νƒν—˜ν• μˆ˜ μžˆλŠ” μ΅œλŒ€ λ˜μ „ 수λ₯Ό return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”.


μ œν•œμ‚¬ν•­

  • kλŠ” 1 이상 5,000 μ΄ν•˜μΈ μžμ—°μˆ˜μž…λ‹ˆλ‹€.
  • dungeons의 μ„Έλ‘œ(ν–‰) 길이(즉, λ˜μ „μ˜ 개수)λŠ” 1 이상 8 μ΄ν•˜μž…λ‹ˆλ‹€.
    • dungeons의 κ°€λ‘œ(μ—΄) κΈΈμ΄λŠ” 2 μž…λ‹ˆλ‹€.
    • dungeons의 각 행은 각 λ˜μ „μ˜ ["μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„", "μ†Œλͺ¨ ν”Όλ‘œλ„"] μž…λ‹ˆλ‹€.
    • "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„"λŠ” 항상 "μ†Œλͺ¨ ν”Όλ‘œλ„"보닀 ν¬κ±°λ‚˜ κ°™μŠ΅λ‹ˆλ‹€.
    • "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„"와 "μ†Œλͺ¨ ν”Όλ‘œλ„"λŠ” 1 이상 1,000 μ΄ν•˜μΈ μžμ—°μˆ˜μž…λ‹ˆλ‹€.
    • μ„œλ‘œ λ‹€λ₯Έ λ˜μ „μ˜ ["μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„", "μ†Œλͺ¨ ν”Όλ‘œλ„"]κ°€ μ„œλ‘œ 같을 수 μžˆμŠ΅λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

kdungeonsresult
80[[80,20],[50,40],[30,10]]3

μž…μΆœλ ₯ 예 μ„€λͺ…

ν˜„μž¬ ν”Όλ‘œλ„λŠ” 80μž…λ‹ˆλ‹€.

λ§Œμ•½, 첫 번째 β†’ 두 번째 β†’ μ„Έ 번째 λ˜μ „ μˆœμ„œλ‘œ νƒν—˜ν•œλ‹€λ©΄

  • ν˜„μž¬ ν”Όλ‘œλ„λŠ” 80이며, 첫 번째 λ˜μ „μ„ λŒκΈ°μœ„ν•΄ ν•„μš”ν•œ "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„" λ˜ν•œ 80μ΄λ―€λ‘œ, 첫 번째 λ˜μ „μ„ νƒν—˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 첫 번째 λ˜μ „μ˜ "μ†Œλͺ¨ ν”Όλ‘œλ„"λŠ” 20μ΄λ―€λ‘œ, λ˜μ „μ„ νƒν—˜ν•œ ν›„ 남은 ν”Όλ‘œλ„λŠ” 60μž…λ‹ˆλ‹€.
  • 남은 ν”Όλ‘œλ„λŠ” 60이며, 두 번째 λ˜μ „μ„ λŒκΈ°μœ„ν•΄ ν•„μš”ν•œ "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„"λŠ” 50μ΄λ―€λ‘œ, 두 번째 λ˜μ „μ„ νƒν—˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 두 번째 λ˜μ „μ˜ "μ†Œλͺ¨ ν”Όλ‘œλ„"λŠ” 40μ΄λ―€λ‘œ, λ˜μ „μ„ νƒν—˜ν•œ ν›„ 남은 ν”Όλ‘œλ„λŠ” 20μž…λ‹ˆλ‹€.
  • 남은 ν”Όλ‘œλ„λŠ” 20이며, μ„Έ 번째 λ˜μ „μ„ λŒκΈ°μœ„ν•΄ ν•„μš”ν•œ "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„"λŠ” 30μž…λ‹ˆλ‹€. λ”°λΌμ„œ μ„Έ 번째 λ˜μ „μ€ νƒν—˜ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

λ§Œμ•½, 첫 번째 β†’ μ„Έ 번째 β†’ 두 번째 λ˜μ „ μˆœμ„œλ‘œ νƒν—˜ν•œλ‹€λ©΄

  • ν˜„μž¬ ν”Όλ‘œλ„λŠ” 80이며, 첫 번째 λ˜μ „μ„ λŒκΈ°μœ„ν•΄ ν•„μš”ν•œ "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„" λ˜ν•œ 80μ΄λ―€λ‘œ, 첫 번째 λ˜μ „μ„ νƒν—˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 첫 번째 λ˜μ „μ˜ "μ†Œλͺ¨ ν”Όλ‘œλ„"λŠ” 20μ΄λ―€λ‘œ, λ˜μ „μ„ νƒν—˜ν•œ ν›„ 남은 ν”Όλ‘œλ„λŠ” 60μž…λ‹ˆλ‹€.
  • 남은 ν”Όλ‘œλ„λŠ” 60이며, μ„Έ 번째 λ˜μ „μ„ λŒκΈ°μœ„ν•΄ ν•„μš”ν•œ "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„"λŠ” 30μ΄λ―€λ‘œ, μ„Έ 번째 λ˜μ „μ„ νƒν—˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ„Έ 번째 λ˜μ „μ˜ "μ†Œλͺ¨ ν”Όλ‘œλ„"λŠ” 10μ΄λ―€λ‘œ, λ˜μ „μ„ νƒν—˜ν•œ ν›„ 남은 ν”Όλ‘œλ„λŠ” 50μž…λ‹ˆλ‹€.
  • 남은 ν”Όλ‘œλ„λŠ” 50이며, 두 번째 λ˜μ „μ„ λŒκΈ°μœ„ν•΄ ν•„μš”ν•œ "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„"λŠ” 50μ΄λ―€λ‘œ, 두 번째 λ˜μ „μ„ νƒν—˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 두 번째 λ˜μ „μ˜ "μ†Œλͺ¨ ν”Όλ‘œλ„"λŠ” 40μ΄λ―€λ‘œ, λ˜μ „μ„ νƒν—˜ν•œ ν›„ 남은 ν”Όλ‘œλ„λŠ” 10μž…λ‹ˆλ‹€.

λ”°λΌμ„œ 이 경우 μ„Έ λ˜μ „μ„ λͺ¨λ‘ νƒν—˜ν•  수 있으며, μœ μ €κ°€ νƒν—˜ν•  수 μžˆλŠ” μ΅œλŒ€ λ˜μ „ μˆ˜λŠ” 3μž…λ‹ˆλ‹€.


λ‚˜μ˜ 풀이

package programmers;

public class FatiqueLevel {
	
	
	 public static int solution(int k, int[][] dungeons) {
		 boolean[] visited = new boolean[dungeons.length];
		
         return dfs(0, k, dungeons, visited);
     }
	 
	 public static int dfs(int depth, int fatigue, int[][] dungeons, boolean[] visited) {
		 
		 int maxDepth = depth;
	
		 for(int i = 0; i < dungeons.length; i++) {
			 if(!visited[i] && dungeons[i][0] <= fatigue) {
				 visited[i] = true;
				 maxDepth = Math.max(maxDepth, dfs(depth + 1, fatigue - dungeons[i][1], dungeons, visited));
				 visited[i] = false;
	
			 }
		 }
		 return maxDepth;
		 
	 }

	   
	 
	 
	 public static void main(String[] args) {
		 
		 int[][] dungeons = {{80,20},{50,40},{30,10}};
		 
		solution(80, dungeons);
		
	}

}



DFS(Depth First Search) 풀이

1. μ΄ˆκΈ°μƒνƒœ 
- fatigue = 80
- dungeons = {{80,20},{50,40},{30,10}}
- visited = {false,false,false} (λ°©λ¬Έμ „ μƒνƒœ)
2. 첫 번째 λ˜μ „μ— λŒ€ν•œ DFS
- 첫번째 λ˜μ „μ˜ μš”κ΅¬ ν”Όλ‘œλ„ : 80, ν˜„μž¬ ν”Όλ‘œλ„ 80  (νƒν—˜ κ°€λŠ₯)
- depthκ°€ 1증가, fatigueλŠ” 20 κ°μ†Œν•΄μ„œ 60
- 이제 두 번째 λ˜μ „μ„ λ°©λ¬Έν•˜κΈ° μœ„ν•΄ λ‹€μ‹œ dfs ν•¨μˆ˜λ₯Ό 호좜
3. 두 번째 λ˜μ „μ— λŒ€ν•œ DFS
- 두 번쨰 λ˜μ „μ˜ μš”κ΅¬ ν”Όλ‘œλ„: 50, ν˜„μž¬ ν”Όλ‘œλ„ 60 (νƒν—˜ κ°€λŠ₯)
- depthκ°€ 1 μ¦κ°€ν•΄μ„œ 2가됨, fatigueλŠ” 40κ°μ†Œν•΄μ„œ 20
- 이제 μ„Έ 번째 λ˜μ „μ„ λ°©λ¬Έν•˜κΈ° μœ„ν•΄ λ‹€μ‹œ dfs ν•¨μˆ˜λ₯Ό 호좜
4. μ„Έ 번째 λ˜μ „μ— λŒ€ν•œ DFS
- μ„Έ 번째 λ˜μ „μ˜ μš”κ΅¬ ν”Όλ‘œλ„: 30, ν˜„μž¬ ν”Όλ‘œλ„ 20 (νƒν—˜ λΆˆκ°€λŠ₯)
- μ„Έ 번째 λ˜μ „μ„ νƒν—˜ν•  수 μ—†μœΌλ―€λ‘œ, 이전 μƒνƒœλ‘œ λŒμ•„κ°€μ•Όν•¨
- λ”°λΌμ„œ visited λ°°μ—΄μ—μ„œ 두 번째 λ˜μ „μ— λŒ€ν•œ λ°©λ¬Έ μƒνƒœλ₯Ό ν•΄μ œ
5. λ‹€μ‹œ 두 번째 λ˜μ „μ— λŒ€ν•œ DFS
- μ΄λ²ˆμ—λŠ” μ„Έ 번째 λ˜μ „μ„ λ°©λ¬Έν•˜κΈ° μœ„ν•΄ dfs ν•¨μˆ˜λ₯Ό 호좜
- ν•˜μ§€λ§Œ μ•žμ„œμ„œ μ„Έ 번째 λ˜μ „μ„ νƒν—˜ν•  수 μ—†μŒμ„ μ•Œκ³  있기 λ•Œλ¬Έμ—, μ΄λ²ˆμ—λ„ μ„Έ 번째 λ˜μ „μ„ νƒν—˜ν•  수 μ—†μŒ
- λ”°λΌμ„œ visited λ°°μ—΄μ—μ„œ 첫 번째 λ˜μ „μ— λŒ€ν•œ λ°©λ¬Έ μƒνƒœλ₯Ό ν•΄μ œ
6. 첫 번째 λ˜μ „μ— λŒ€ν•œ DFS
- μ΄λ²ˆμ—λŠ” 두 번째 λ˜μ „μ„ κ±΄λ„ˆλ›°κ³  λ°”λ‘œ μ„Έ 번째 λ˜μ „μ„ λ°©λ¬Έν•˜κΈ° μœ„ν•΄ dfs ν•¨μˆ˜λ₯Ό 호좜
- κ·ΈλŸ¬λ‚˜, ν˜„μž¬μ˜ ν”Όλ‘œλ„λŠ” 60인데, μ„Έ 번쨰 λ˜μ „μ˜ μš”κ΅¬ ν”Όλ‘œλ„λŠ” 30이기 λ•Œλ¬Έμ— νƒν—˜ν•  수 있음
- λ”°λΌμ„œ, depthλ₯Ό 1μ¦κ°€μ‹œν‚€κ³ , fatigueλ₯Ό 10 κ°μ†Œμ‹œν‚΄


0개의 λŒ“κΈ€

Powered by GraphCDN, the GraphQL CDN