Programmers #38

μ΄κ°•μš©Β·2023λ…„ 9μ›” 19일
0

Programmers

λͺ©λ‘ 보기
37/58

νƒ€κ²Ÿ λ„˜λ²„

πŸ“‘ λ¬Έ1) n개의 음이 μ•„λ‹Œ μ •μˆ˜λ“€μ΄ μžˆμŠ΅λ‹ˆλ‹€. 이 μ •μˆ˜λ“€μ„ μˆœμ„œλ₯Ό λ°”κΎΈμ§€ μ•Šκ³  적절히 λ”ν•˜κ±°λ‚˜ λΉΌμ„œ νƒ€κ²Ÿ λ„˜λ²„λ₯Ό λ§Œλ“€λ €κ³  ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ [1, 1, 1, 1, 1]둜 숫자 3을 λ§Œλ“€λ €λ©΄ λ‹€μŒ λ‹€μ„― 방법을 μ“Έ 수 μžˆμŠ΅λ‹ˆλ‹€.

-1+1+1+1+1 = 3
+1-1+1+1+1 = 3
+1+1-1+1+1 = 3
+1+1+1-1+1 = 3
+1+1+1+1-1 = 3

μ‚¬μš©ν•  수 μžˆλŠ” μˆ«μžκ°€ λ‹΄κΈ΄ λ°°μ—΄ numbers, νƒ€κ²Ÿ λ„˜λ²„ target이 λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ 숫자λ₯Ό 적절히 λ”ν•˜κ³  λΉΌμ„œ νƒ€κ²Ÿ λ„˜λ²„λ₯Ό λ§Œλ“œλŠ” λ°©λ²•μ˜ 수λ₯Ό return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μž‘μ„±ν•΄μ£Όμ„Έμš”.


μ œν•œμ‚¬ν•­

  • μ£Όμ–΄μ§€λŠ” 숫자의 κ°œμˆ˜λŠ” 2개 이상 20개 μ΄ν•˜μž…λ‹ˆλ‹€.
  • 각 μˆ«μžλŠ” 1 이상 50 μ΄ν•˜μΈ μžμ—°μˆ˜μž…λ‹ˆλ‹€.
  • νƒ€κ²Ÿ λ„˜λ²„λŠ” 1 이상 1000 μ΄ν•˜μΈ μžμ—°μˆ˜μž…λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

numberstargetreturn
[1,1,1,1,1]35
[4,1,2,1]42

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

μž…μΆœλ ₯ 예 #2

+4+1-2+1 = 4
+4-1+2-1 = 4
  • 총 2κ°€μ§€ 방법이 μžˆμœΌλ―€λ‘œ, 2λ₯Ό return ν•©λ‹ˆλ‹€.

λ‚˜μ˜ 풀이

package programmers;

import java.util.Arrays;

public class TargetNumber {
	
	private static int answer = 0;
	
	public static int solution(int[] numbers, int target) {
        answer = 0;
        char[] signs = new char[numbers.length];
        dfs(numbers, signs, 0, target);
        
        
        return answer;
    }
	
	public static void dfs(int[] numbers, char[] signs, int index, int target) {
		
		
		if (index == numbers.length) {
            int sum = 0;
            for (int i = 0; i < numbers.length; i++) {
            	
                if (signs[i] == '+') {
                    sum += numbers[i];
                } else {
                    sum -= numbers[i];
                }
            }

            if (sum == target) {
                answer++;  
            }
            
            return;
        }

        
        signs[index] = '+';
        dfs(numbers, signs, index + 1,target);

        signs[index] = '-';
        dfs(numbers, signs, index + 1,target);
       
	}
	
	
	
	
	public static void main(String[] args) {
		
		int[] numbers = {1,1,1,1,1};
		solution(numbers, 3);
	}
	
	

}

DFSλ₯Ό μ‚¬μš©ν•œ λ‹€λ₯Έ 풀이

package programmers;

public class TargetNumber {
	
	private static int answer = 0;
	
	public static int solution(int[] numbers, int target) {
        answer = 0;
        
        dfs(numbers, target, 0, 0);
        
        return answer;
    }
	
	public static void dfs(int[] numbers, int target, int index, int sum) {
       
        if (index == numbers.length) {
           if(sum == target) {
        	   answer++;
           }
           return;
        }
		
        dfs(numbers, target, index + 1, sum + numbers[index]);
        dfs(numbers, target, index + 1, sum - numbers[index]);
       
    }
	
	
	
	
	public static void main(String[] args) {
		
		int[] numbers = {1,1,1,1,1};
		solution(numbers, 3);
	}
	
	

}


μ „ν™”λ²ˆν˜Έ λͺ©λ‘

πŸ“‘ λ¬Έ2) μ „ν™”λ²ˆν˜ΈλΆ€μ— 적힌 μ „ν™”λ²ˆν˜Έ 쀑, ν•œ λ²ˆν˜Έκ°€ λ‹€λ₯Έ 번호의 접두어인 κ²½μš°κ°€ μžˆλŠ”μ§€ ν™•μΈν•˜λ € ν•©λ‹ˆλ‹€.
μ „ν™”λ²ˆν˜Έκ°€ λ‹€μŒκ³Ό 같을 경우, κ΅¬μ‘°λŒ€ μ „ν™”λ²ˆν˜ΈλŠ” μ˜μ„μ΄μ˜ μ „ν™”λ²ˆν˜Έμ˜ μ ‘λ‘μ‚¬μž…λ‹ˆλ‹€.

  • κ΅¬μ‘°λŒ€ : 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

λ‚˜μ˜ 풀이

νš¨μœ¨μ„± μ‹œκ°„ 초과 둜직

class Solution {
    public boolean solution(String[] phone_book) {
       boolean answer = true;
        
        for(int i = 0; i < phone_book.length - 1; i++) {
        	String phoneNumber = phone_book[i];
        	for (int j = i + 1; j < phone_book.length; j++) {
                if (phoneNumber.length() <= phone_book[j].length() 
                    && phone_book[j].substring(0, phoneNumber.length()).equals(phoneNumber)) {
                    answer = false;
                    
                }
                
                
                if (phoneNumber.length() > phone_book[j].length() 
                    && phoneNumber.substring(0, phone_book[j].length()).equals(phone_book[j])) {
                    answer = false;
                  
                }
            }
        	
        }
        
        return answer;
    }
}

package programmers;

import java.util.Arrays;

public class NumberList {
	
	public static boolean solution(String[] phone_book) {
        boolean answer = true;
        
        Arrays.sort(phone_book);
        
        for(int i = 0; i < phone_book.length - 1; i++) {
        	
            if(phone_book[i+1].startsWith(phone_book[i])) {
                answer = false;
            }
        }
        
 
        return answer;
    }
	
	
	public static void main(String[] args) {
		String[] phone_book = {"12", "88", "123", "567", "1235"};
		solution(phone_book);
	}

}

kμ§„μˆ˜μ—μ„œ μ†Œμˆ˜ 개수 κ΅¬ν•˜κΈ°

πŸ“‘ λ¬Έ3) μ–‘μ˜ μ •μˆ˜ n이 μ£Όμ–΄μ§‘λ‹ˆλ‹€. 이 숫자λ₯Ό kμ§„μˆ˜λ‘œ 바꿨을 λ•Œ, λ³€ν™˜λœ 수 μ•ˆμ— μ•„λž˜ 쑰건에 λ§žλŠ” μ†Œμˆ˜(Prime number)κ°€ λͺ‡ κ°œμΈμ§€ μ•Œμ•„λ³΄λ € ν•©λ‹ˆλ‹€.

  • 0P0처럼 μ†Œμˆ˜ μ–‘μͺ½μ— 0이 μžˆλŠ” 경우
  • P0처럼 μ†Œμˆ˜ 였λ₯Έμͺ½μ—λ§Œ 0이 있고 μ™Όμͺ½μ—λŠ” 아무것도 μ—†λŠ” 경우
  • 0P처럼 μ†Œμˆ˜ μ™Όμͺ½μ—λ§Œ 0이 있고 였λ₯Έμͺ½μ—λŠ” 아무것도 μ—†λŠ” 경우
  • P처럼 μ†Œμˆ˜ μ–‘μͺ½μ— 아무것도 μ—†λŠ” 경우
  • 단, PλŠ” 각 μžλ¦Ώμˆ˜μ— 0을 ν¬ν•¨ν•˜μ§€ μ•ŠλŠ” μ†Œμˆ˜μž…λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, 101은 Pκ°€ 될 수 μ—†μŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, 437674을 3μ§„μˆ˜λ‘œ λ°”κΎΈλ©΄ 211020101011μž…λ‹ˆλ‹€. μ—¬κΈ°μ„œ 찾을 수 μžˆλŠ” 쑰건에 λ§žλŠ” μ†Œμˆ˜λŠ” μ™Όμͺ½λΆ€ν„° μˆœμ„œλŒ€λ‘œ 211, 2, 11이 있으며, 총 3κ°œμž…λ‹ˆλ‹€. (211, 2, 11을 kμ§„λ²•μœΌλ‘œ λ³΄μ•˜μ„ λ•Œκ°€ μ•„λ‹Œ, 10μ§„λ²•μœΌλ‘œ λ³΄μ•˜μ„ λ•Œ μ†Œμˆ˜μ—¬μ•Ό ν•œλ‹€λŠ” 점에 μ£Όμ˜ν•©λ‹ˆλ‹€.) 211은 P0 ν˜•νƒœμ—μ„œ 찾을 수 있으며, 2λŠ” 0P0μ—μ„œ, 11은 0Pμ—μ„œ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.

μ •μˆ˜ nκ³Ό kκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§‘λ‹ˆλ‹€. n을 kμ§„μˆ˜λ‘œ 바꿨을 λ•Œ, λ³€ν™˜λœ 수 μ•ˆμ—μ„œ 찾을 수 μžˆλŠ” μœ„ 쑰건에 λ§žλŠ” μ†Œμˆ˜μ˜ 개수λ₯Ό return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄ μ£Όμ„Έμš”.


μ œν•œμ‚¬ν•­

  • 1 ≀ n ≀ 1,000,000
  • 3 ≀ k ≀ 10

μž…μΆœλ ₯ 예

nkresult
43767433
110011102

λ‚˜μ˜ 풀이

package programmers;

public class KPrimeNumber {
	
	public static int solution(int n, int k) {
        int answer = 0;
        
        
        StringBuilder nPrimeNumber = new StringBuilder();
        
        while(n > 0) {
        	int remainder = n % k ;
        	nPrimeNumber.insert(0, remainder);
        	n /= k;
        }
        
        
    	String[] str = nPrimeNumber.toString().split("0");
    	
    	
    	
    	for(String s : str) {
    		if(s.isEmpty() || s.equals("1")) {
    			continue;
    		}
    		long primeNumber = Long.parseLong(s);
    		boolean isPrime = true;
    		for(long j = 2; j*j <= primeNumber; j++) {
    			if(primeNumber % j == 0) {
    				isPrime = false;
    				break;
    			}
    		}
    		if(isPrime) {
    			answer++;
    		}
    		
    	}
    	
        
        return answer;
    }
	
	
	public static void main(String[] args) {
		
		
		solution(110011, 10);
	}

}

λ‚˜μ˜ 생각

λ§€κ°œλ³€μˆ˜ n을 λ¨Όμ € nμ§„μˆ˜λ‘œ λ³€ν™˜ν•˜λŠ” μž‘μ—…μ΄ λ¨Όμ € ν•„μš”ν•˜λ‹€.

StringBuilder nPrimeNumber = new StringBuilder();
        
while(n > 0) {
	int remainder = n % k ;
    nPrimeNumber.insert(0, remainder);
    n /= k;
}
λ¬Έμ œμ—μ„œ μ£Όμ–΄μ§„ 쑰건을 μ‚΄νŽ΄λ³΄λ©΄

0P0
P0
0P
P

즉 0을 κΈ°μ€€μœΌλ‘œ 자λ₯΄λ©΄λœλ‹€.

μ—¬κΈ°μ„œ 00 μ΄λ ‡κ²Œ λ‘κ°œκ°€ μ—°μ†μœΌλ‘œ λ‚˜μ˜€λ©΄ λ¬Έμžμ—΄μ— λΉˆκ°’μœΌλ‘œ λ“€μ–΄κ°€κΈ°λ•Œλ¬Έμ— 이λ₯Ό λ‚˜μ€‘μ— μ²΄ν¬ν•΄μ£Όλ©΄λœλ‹€.

λ‚΄κ°€ μƒκ°ν–ˆμ„λ•ŒλŠ”, λΉˆκ°’μœΌλ‘œ λ‚˜μ˜¨ 뢀뢄은 μ–΄μ°¨ν”Ό 0으둜 μͺΌκ°œμ–΄ λ‚˜μ˜¨ κ°’μ΄κΈ°λ•Œλ¬Έμ— 이λ₯Ό κ·Έλƒ₯ continue문으둜 보내버리면 λœλ‹€κ³  μƒκ°ν–ˆλ‹€.

for(String s : str) {
	if(s.isEmpty() || s.equals("1")) {
    	continue;
    }
    long primeNumber = Long.parseLong(s);
    boolean isPrime = true;
    for(long j = 2; j*j <= primeNumber; j++) {
    	if(primeNumber % j == 0) {
        	isPrime = false;
            break;
        }
    }
    if(isPrime) {
    	answer++;
    }
    		
 }

for문을 μˆœνšŒν•˜λ©° s.isEmpty() λ˜λŠ” s의 값이 "1"κ³Ό κ°™μœΌλ©΄ continue 정상적인 값이 λ‚˜μ˜€λ©΄ 이λ₯Ό Long νƒ€μž…μœΌλ‘œ λ³€ν™˜ λ’€ μ†Œμˆ˜ νŒλ³„ λ‘œμ§μ„ 톡해 μ†Œμˆ˜λ₯Ό νŒλ³„ν•œλ‹€.


μ••μΆ•

πŸ“‘ λ¬Έ4) μ‹ μž…μ‚¬μ› μ–΄ν”ΌμΉ˜λŠ” μΉ΄μΉ΄μ˜€ν†‘μœΌλ‘œ μ „μ†‘λ˜λŠ” λ©”μ‹œμ§€λ₯Ό μ••μΆ•ν•˜μ—¬ 전솑 νš¨μœ¨μ„ λ†’μ΄λŠ” 업무λ₯Ό 맑게 λ˜μ—ˆλ‹€. λ©”μ‹œμ§€λ₯Ό μ••μΆ•ν•˜λ”λΌλ„ μ „λ‹¬λ˜λŠ” 정보가 λ°”λ€Œμ–΄μ„œλŠ” μ•ˆ λ˜λ―€λ‘œ, μ••μΆ• μ „μ˜ 정보λ₯Ό μ™„λ²½ν•˜κ²Œ 볡원 κ°€λŠ₯ν•œ 무손싀 μ••μΆ• μ•Œκ³ λ¦¬μ¦˜μ„ κ΅¬ν˜„ν•˜κΈ°λ‘œ ν–ˆλ‹€.

μ–΄ν”ΌμΉ˜λŠ” μ—¬λŸ¬ μ••μΆ• μ•Œκ³ λ¦¬μ¦˜ μ€‘μ—μ„œ μ„±λŠ₯이 μ’‹κ³  κ΅¬ν˜„μ΄ κ°„λ‹¨ν•œ LZW(Lempel–Ziv–Welch) 압좕을 κ΅¬ν˜„ν•˜κΈ°λ‘œ ν–ˆλ‹€. LZW 압좕은 1983λ…„ λ°œν‘œλœ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ, 이미지 파일 포맷인 GIF λ“± λ‹€μ–‘ν•œ μ‘μš©μ—μ„œ μ‚¬μš©λ˜μ—ˆλ‹€.

LZW 압좕은 λ‹€μŒ 과정을 κ±°μΉœλ‹€.

  1. 길이가 1인 λͺ¨λ“  단어λ₯Ό ν¬ν•¨ν•˜λ„λ‘ 사전을 μ΄ˆκΈ°ν™”ν•œλ‹€.
  2. μ‚¬μ „μ—μ„œ ν˜„μž¬ μž…λ ₯κ³Ό μΌμΉ˜ν•˜λŠ” κ°€μž₯ κΈ΄ λ¬Έμžμ—΄ wλ₯Ό μ°ΎλŠ”λ‹€.
  3. w에 ν•΄λ‹Ήν•˜λŠ” μ‚¬μ „μ˜ 색인 번호λ₯Ό 좜λ ₯ν•˜κ³ , μž…λ ₯μ—μ„œ wλ₯Ό μ œκ±°ν•œλ‹€.
  4. μž…λ ₯μ—μ„œ μ²˜λ¦¬λ˜μ§€ μ•Šμ€ λ‹€μŒ κΈ€μžκ°€ λ‚¨μ•„μžˆλ‹€λ©΄(c), w+c에 ν•΄λ‹Ήν•˜λŠ” 단어λ₯Ό 사전에 λ“±λ‘ν•œλ‹€.
  5. 단계 2둜 λŒμ•„κ°„λ‹€.

μ••μΆ• μ•Œκ³ λ¦¬μ¦˜μ΄ 영문 λŒ€λ¬Έμžλ§Œ μ²˜λ¦¬ν•œλ‹€κ³  ν•  λ•Œ, 사전은 λ‹€μŒκ³Ό 같이 μ΄ˆκΈ°ν™”λœλ‹€. μ‚¬μ „μ˜ 색인 λ²ˆν˜ΈλŠ” μ •μˆ˜κ°’μœΌλ‘œ μ£Όμ–΄μ§€λ©°, 1λΆ€ν„° μ‹œμž‘ν•œλ‹€κ³  ν•˜μž.

μƒ‰μΈλ²ˆν˜Έ123...242526
단어ABC...XYZ

예λ₯Ό λ“€μ–΄ μž…λ ₯으둜 KAKAOκ°€ λ“€μ–΄μ˜¨λ‹€κ³  ν•˜μž.

  1. ν˜„μž¬ μ‚¬μ „μ—λŠ” KAKAO의 첫 κΈ€μž KλŠ” λ“±λ‘λ˜μ–΄ μžˆμœΌλ‚˜, 두 번째 κΈ€μžκΉŒμ§€μΈ KAλŠ” μ—†μœΌλ―€λ‘œ, 첫 κΈ€μž K에 ν•΄λ‹Ήν•˜λŠ” 색인 번호 11을 좜λ ₯ν•˜κ³ , λ‹€μŒ κΈ€μžμΈ Aλ₯Ό ν¬ν•¨ν•œ KAλ₯Ό 사전에 27 번째둜 λ“±λ‘ν•œλ‹€.
  2. 두 번째 κΈ€μž AλŠ” 사전에 μžˆμœΌλ‚˜, μ„Έ 번째 κΈ€μžκΉŒμ§€μΈ AKλŠ” 사전에 μ—†μœΌλ―€λ‘œ, A의 색인 번호 1을 좜λ ₯ν•˜κ³ , AKλ₯Ό 사전에 28 번째둜 λ“±λ‘ν•œλ‹€.
  3. μ„Έ 번째 κΈ€μžμ—μ„œ μ‹œμž‘ν•˜λŠ” KAκ°€ 사전에 μžˆμœΌλ―€λ‘œ, KA에 ν•΄λ‹Ήν•˜λŠ” 색인 번호 27을 좜λ ₯ν•˜κ³ , λ‹€μŒ κΈ€μž Oλ₯Ό ν¬ν•¨ν•œ KAOλ₯Ό 29 번째둜 λ“±λ‘ν•œλ‹€.
  4. λ§ˆμ§€λ§‰μœΌλ‘œ μ²˜λ¦¬λ˜μ§€ μ•Šμ€ κΈ€μž O에 ν•΄λ‹Ήν•˜λŠ” 색인 번호 15λ₯Ό 좜λ ₯ν•œλ‹€.
ν˜„μž¬ μž…λ ₯(w)λ‹€μŒ κΈ€μž(c)좜λ ₯사전 μΆ”κ°€(w+c)
KA1127:KA
AK128:AK
O15

이 과정을 거쳐 λ‹€μ„― κΈ€μžμ˜ λ¬Έμž₯ KAKAOκ°€ 4개의 색인 번호 [11, 1, 27, 15]둜 μ••μΆ•λœλ‹€.

μž…λ ₯으둜 TOBEORNOTTOBEORTOBEORNOTκ°€ λ“€μ–΄μ˜€λ©΄ λ‹€μŒκ³Ό 같이 압좕이 μ§„ν–‰λœλ‹€.

ν˜„μž¬ μž…λ ₯(w)λ‹€μŒ κΈ€μž(c)좜λ ₯사전 μΆ”κ°€(w+c)
TO2027:TO
OB1528:OB
BE229:BE
EO530:EO
OR1531:OR
RN1832:RN
NO1433:NO
OT1534:OT
TT2035:TT
TOB2736:TOB
BEO2937:BEO
ORT3138:ORT
TOBE3639:TOBE
EOR3040:EOR
RNO3241:RNO
OT34

μž…μΆœλ ₯ 예제

msganswer
KAKAO[11, 1, 27, 15]
TOBEORNOTTOBEORTOBEORNOT[20, 15, 2, 5, 15, 18, 14, 15, 20, 27, 29, 31, 36, 30, 32, 34]
ABABABABABABABAB[1, 2, 27, 29, 28, 31, 30]

λ‚˜μ˜ 풀이

package programmers;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;

public class Compression {
	
	public static int[] solution(String msg) {
	
		LinkedHashMap<String, Integer> dictionary = new LinkedHashMap<>();
        List<Integer> result = new ArrayList<>();

        
        int index = 1;
        for (char ch = 'A'; ch <= 'Z'; ch++) {
        	dictionary.put(String.valueOf(ch), index++);
        }
        
        StringBuilder sb = new StringBuilder(msg);
        
        
        while(sb.length() > 0) {
        	int i ;
        	
        	for(i = 1; i <= sb.length(); i++) {
        		if(!dictionary.containsKey(sb.substring(0, i))) {
        			break;
        		}
        	}
        	
        	String found = sb.substring(0, i - 1);
        	
        	
        	
        	result.add(dictionary.get(found));
        	
        	if(i <= sb.length()) {
                dictionary.put(found + sb.charAt(i - 1), index++);
            }
            
            sb.delete(0, i - 1);
        	
        }
        
        
        
        int[] answer = new int[result.size()];
        for (int i = 0; i < result.size(); i++) {
            answer[i] = result.get(i);
        }
        
       
        return answer;
    }
	
	public static void main(String[] args) {
		
		solution("KAKAO");
	}

}


λ‚˜μ˜ 생각

LinkedHashMap<String, Integer> dictionary = new LinkedHashMap<>();
List<Integer> result = new ArrayList<>();

int index = 1;
for (char ch = 'A'; ch <= 'Z'; ch++) {
	dictionary.put(String.valueOf(ch), index++);
}

λ¨Όμ € A-Z key 값에 1~26 valueκ°’μœΌλ‘œ dictionarymap에 μ €μž₯ν•˜λ©΄ λœλ‹€.

예λ₯Όλ“€μ–΄λ³΄λ©΄ 
사전에 λ‹€μŒκ³Ό 같은 μˆœμ„œλ‘œ ν™•μΈν•˜λ©΄ λœλ‹€.

K (사전 맡에 Kκ°€ μžˆλŠ”μ§€ 확인) 
A (사전 맡에 Aκ°€ μžˆλŠ”μ§€ 확인)
KA (사전 맡에 KAκ°€ μžˆλŠ”μ§€ 확인) 
O (사전 맡에 Oκ°€ μžˆλŠ”μ§€ 확인)

StringBuilder sb = new StringBuilder(msg);

  • λ§€κ°œλ³€μˆ˜ msg 값을 μΆ”κ°€, μ‚­μ œκ°€ μ‰½κ²Œ StringBuilderλ₯Ό μ‚¬μš©

μ£Όμš” λ‘œμ§μ„ μ‚΄νŽ΄λ³΄λ©΄

while(sb.length() > 0) {
	int i ;
        	
    for(i = 1; i <= sb.length(); i++) {
    	if(!dictionary.containsKey(sb.substring(0, i))) {
        	break;
        }
    }
        	
    String found = sb.substring(0, i - 1);
    result.add(dictionary.get(found));
        	
    if(i <= sb.length()) {
    	dictionary.put(found + sb.charAt(i - 1), index++);
    }
            
    sb.delete(0, i - 1);
        	
}

dictionary Map에 ν•œκΈ€μžλ‘œ 된 문자 Kλ₯Ό λ¨Όμ € μ°Ύκ³ , 사전에 μ—†λŠ” λ¬Έμžκ°€ λ‚˜μ˜€λ©΄ i의 μœ„μΉ˜λ₯Ό κΈ°μ–΅ν•œλ‹€. κ·Έ κ²°κ³Ό Kλ₯Ό 리슀트 answer에 key K에 λŒ€ν•œ value 값을 λ„£λŠ”λ‹€.

if(i <= sb.length())쑰건은 λ²”μœ„ 초과 μ—λŸ¬λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•œ κ²ƒμœΌλ‘œ

이 쑰건 없이 sb.charAt(i - 1)을 ν˜ΈμΆœν•˜λ©΄, λ§Œμ•½ iκ°€ sb의 길이보닀 ν¬κ±°λ‚˜ 같은 경우 λ²”μœ„μ΄ˆκ³Ό 였λ₯˜κ°€ λ°œμƒν•˜κ²Œ λ©λ‹ˆλ‹€. 즉, KA, AK, KAOλ₯Ό 사전에 μΆ”κ°€ν•œλ‹€.

즉, sb에 λ“  λ¬Έμžμ— K,A,KA,Oλ₯Ό 제거 ν•œλ‹€.


Nμ§„μˆ˜ κ²Œμž„

πŸ“‘ λ¬Έ5) νŠœλΈŒκ°€ ν™œλ™ν•˜λŠ” μ½”λ”© λ™μ•„λ¦¬μ—μ„œλŠ” μ „ν†΅μ μœΌλ‘œ ν•΄μ˜€λŠ” κ²Œμž„μ΄ μžˆλ‹€. 이 κ²Œμž„μ€ μ—¬λŸ¬ μ‚¬λžŒμ΄ λ‘₯κΈ€κ²Œ μ•‰μ•„μ„œ 숫자λ₯Ό ν•˜λ‚˜μ”© μ°¨λ‘€λŒ€λ‘œ λ§ν•˜λŠ” κ²Œμž„μΈλ°, κ·œμΉ™μ€ λ‹€μŒκ³Ό κ°™λ‹€.

  1. 숫자λ₯Ό 0λΆ€ν„° μ‹œμž‘ν•΄μ„œ μ°¨λ‘€λŒ€λ‘œ λ§ν•œλ‹€. 첫 번째 μ‚¬λžŒμ€ 0, 두 번째 μ‚¬λžŒμ€ 1, … μ—΄ 번째 μ‚¬λžŒμ€ 9λ₯Ό λ§ν•œλ‹€.
  2. 10 μ΄μƒμ˜ μˆ«μžλΆ€ν„°λŠ” ν•œ μžλ¦¬μ”© λŠμ–΄μ„œ λ§ν•œλ‹€. 즉 μ—΄ν•œ 번째 μ‚¬λžŒμ€ 10의 첫 자리인 1, 열두 번째 μ‚¬λžŒμ€ λ‘˜μ§Έ 자리인 0을 λ§ν•œλ‹€.

μ΄λ ‡κ²Œ κ²Œμž„μ„ μ§„ν–‰ν•  경우,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 0, 1, 1, 1, 2, 1, 3, 1, 4, …
순으둜 숫자λ₯Ό λ§ν•˜λ©΄ λœλ‹€.

ν•œνŽΈ μ½”λ”© 동아리 일원듀은 컴퓨터λ₯Ό λ‹€λ£¨λŠ” μ‚¬λžŒλ‹΅κ²Œ μ΄μ§„μˆ˜λ‘œ 이 κ²Œμž„μ„ μ§„ν–‰ν•˜κΈ°λ„ ν•˜λŠ”λ°, 이 κ²½μš°μ—λŠ”
0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, …
순으둜 숫자λ₯Ό λ§ν•˜λ©΄ λœλ‹€.

μ΄μ§„μˆ˜λ‘œ μ§„ν–‰ν•˜λŠ” κ²Œμž„μ— μ΅μˆ™ν•΄μ Έ μ§ˆλ €κ°€λ˜ μ‚¬λžŒλ“€μ€ μ’€ 더 λ‚œμ΄λ„λ₯Ό 높이기 μœ„ν•΄ μ΄μ§„λ²•μ—μ„œ μ‹­μœ‘μ§„λ²•κΉŒμ§€ λͺ¨λ“  μ§„λ²•μœΌλ‘œ κ²Œμž„μ„ μ§„ν–‰ν•΄λ³΄κΈ°λ‘œ ν–ˆλ‹€. 숫자 κ²Œμž„μ΄ μ΅μˆ™ν•˜μ§€ μ•Šμ€ νŠœλΈŒλŠ” κ²Œμž„μ— μ Έμ„œ λ²ŒμΉ™μ„ λ°›λŠ” κ΅΄μš•μ„ ν”Όν•˜κΈ° μœ„ν•΄, μžμ‹ μ΄ 말해야 ν•˜λŠ” 숫자λ₯Ό μŠ€λ§ˆνŠΈν°μ— 미리 좜λ ₯ν•΄μ£ΌλŠ” ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€λ €κ³  ν•œλ‹€. 튜브의 ν”„λ‘œκ·Έλž¨μ„ κ΅¬ν˜„ν•˜λΌ.


μž…λ ₯ ν˜•μ‹

진법 n, 미리 ꡬ할 숫자의 갯수 t, κ²Œμž„μ— μ°Έκ°€ν•˜λŠ” 인원 m, 튜브의 μˆœμ„œ p κ°€ μ£Όμ–΄μ§„λ‹€.

  • 2 ≦ n ≦ 16
  • 0 < t ≦ 1000
  • 2 ≦ m ≦ 100
  • 1 ≦ p ≦ m

좜λ ₯ ν˜•μ‹

νŠœλΈŒκ°€ 말해야 ν•˜λŠ” 숫자 t개λ₯Ό 곡백 없이 μ°¨λ‘€λŒ€λ‘œ λ‚˜νƒ€λ‚Έ λ¬Έμžμ—΄. 단, 10~15λŠ” 각각 λŒ€λ¬Έμž A~F둜 좜λ ₯ν•œλ‹€.


μž…μΆœλ ₯ 예제

ntmpresult
2421"0111"
161621"02468ACE11111111"
161622"13579BDF01234567"

λ‚˜μ˜ 풀이

package programmers;

public class NBaseGame {
	
	public static String solution(int n, int t, int m, int p) {
		
		
		
		StringBuilder result = new StringBuilder();
		
		String chars = "0123456789ABCDEF";
		
		int number = 0;
		
		while(result.length() <  m * t){
			int currentNumber = number++;
			StringBuilder temp = new StringBuilder();
			
			
			do {
				temp.insert(0, chars.charAt(currentNumber % n));
				currentNumber /= n;
			}while(currentNumber > 0); 
			
			result.append(temp);
			
		}
		
		StringBuilder tubeResult = new StringBuilder();
		
		for(int i = 0; i < t; i++) {
			tubeResult.append(result.charAt(p - 1 + m * i));
		}
		
		System.out.println(tubeResult.toString());
        return tubeResult.toString();
    }
	
	
	public static void main(String[] args) {
		solution(16, 16, 2, 1);
	}

}

더 κ°„λ‹¨ν•˜κ²Œ κ΅¬ν˜„ν•œ 둜직

package programmers;

public class NBaseGame {
	
	public static String solution(int n, int t, int m, int p) {
		
		StringBuilder sb = new StringBuilder();
		
		for(int i = 0; i <= t*m; i++) {
			sb.append(Integer.toString(i, n).toUpperCase());
		}
		
		StringBuilder result = new StringBuilder();
		
		for(int i = p - 1 , j = 0; j < t; i +=m, j++) {
			result.append(sb.charAt(i));
		}
		
		
		System.out.println(result.toString());
        return sb.toString();
    }
	
	
	public static void main(String[] args) {
		solution(16, 16, 2, 1);
	}

}


λ‚˜μ˜ 생각

λ§€κ°œλ³€μˆ˜ n은 2μ—μ„œ 16κΉŒμ§€μ˜ 수(진법)을 λ‚˜νƒ€λ‚΄λ©° ν•œ μ‚¬λžŒμ΄ κ΅¬ν•˜λŠ” 숫자의 κ°œμˆ˜κ°€ t, 참가인원이 m μ΄κΈ°λ•Œλ¬Έμ—,

StringBuilder sb = new StringBuilder();
		
for(int i = 0; i <= t*m; i++) {
	sb.append(Integer.toString(i, n).toUpperCase());
}

λ‹€μŒκ³Ό 같이 식을 ꡬ할 수 μžˆλ‹€. μ΄λŠ”, Integer.toString()λ₯Ό μ‚¬μš©ν•˜μ—¬, n에 μ§„λ²•μ˜ 수λ₯Ό λ„£μœΌλ©΄ 숫자λ₯Ό μ§„λ²•μœΌλ‘œ λ³€ν™˜ν•  수 μžˆλ‹€.

예λ₯Όλ“€μ–΄ n = 16, t = 16, m = 2이면 0 ~ 32 κΉŒμ§€μ˜ 수λ₯Ό 16μ§„μˆ˜λ‘œ λ³€ν™˜ν•œλ‹€λŠ” μ˜λ―Έμ΄λ‹€.

참가인원 m, μˆœμ„œ pλ₯Ό κ°€μ§€κ³  예제의 λ¬Έμ œλŠ” 참가인원 2λͺ…쀑, 첫번째 μ°¨λ‘€μ΄κΈ°λ•Œλ¬Έμ—, 첫칸뢀터 μ‹œμž‘ν•˜μ—¬ ν•œμΉΈμ„ κ±΄λ„ˆλ›°κ³  λ‹€μŒ 칸을 μΆ”κ°€ν•œλ‹€. 단 10μ΄μƒμ˜ μˆ˜λŠ” 1,0으둜 λ‚˜λˆ„μ–΄ 칸을 μΆ”κ°€ν•œλ‹€. pλŠ” 1μ΄μƒμ˜ 수 μ΄κΈ°λ•Œλ¬Έμ— i = 0 λΆ€ν„° +m(μ°Έκ°€μΈμ›μ˜ 크기) 만큼 λ”ν•˜μ—¬ result에 μ €μž₯ν•œλ‹€.

int i = p - 1;
for(int j = 0; j < t; j++) {
	result.append(sb.charAt(i));
    i += m;
}

forλ¬Έ κ΅¬ν˜„whileλ¬Έ κ΅¬ν˜„

0개의 λŒ“κΈ€