ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Algo RhythmπŸ•ΊπŸ’ƒ] 2020 카카였 인턴십 ν‚€νŒ¨λ“œ λˆ„λ₯΄κΈ°
    Algo RhythmπŸ•ΊπŸ’ƒ/others 2020. 7. 4. 21:35

    문제 μ„€λͺ…

    슀마트폰 μ „ν™” ν‚€νŒ¨λ“œμ˜ 각 칸에 λ‹€μŒκ³Ό 같이 μˆ«μžλ“€μ΄ μ ν˜€ μžˆμŠ΅λ‹ˆλ‹€.

     

     

    이 μ „ν™” ν‚€νŒ¨λ“œμ—μ„œ 왼손과 였λ₯Έμ†μ˜ μ—„μ§€μ†κ°€λ½λ§Œμ„ μ΄μš©ν•΄μ„œ μˆ«μžλ§Œμ„ μž…λ ₯ν•˜λ €κ³  ν•©λ‹ˆλ‹€.

    맨 처음 왼손 엄지손가락은 * ν‚€νŒ¨λ“œμ— 였λ₯Έμ† 엄지손가락은 # ν‚€νŒ¨λ“œ μœ„μΉ˜μ—μ„œ μ‹œμž‘ν•˜λ©°, 엄지손가락을 μ‚¬μš©ν•˜λŠ” κ·œμΉ™μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

     

    1. 엄지손가락은 μƒν•˜μ’Œμš° 4가지 λ°©ν–₯으둜만 이동할 수 있으며 ν‚€νŒ¨λ“œ 이동 ν•œ 칸은 거리둜 1에 ν•΄λ‹Ήν•©λ‹ˆλ‹€.

    2. μ™Όμͺ½ μ—΄μ˜ 3개의 숫자 147을 μž…λ ₯ν•  λ•ŒλŠ” 왼손 엄지손가락을 μ‚¬μš©ν•©λ‹ˆλ‹€.

    3. 였λ₯Έμͺ½ μ—΄μ˜ 3개의 숫자 369λ₯Ό μž…λ ₯ν•  λ•ŒλŠ” 였λ₯Έμ† 엄지손가락을 μ‚¬μš©ν•©λ‹ˆλ‹€.

    4. κ°€μš΄λ° μ—΄μ˜ 4개의 숫자 2580을 μž…λ ₯ν•  λ•ŒλŠ” 두 μ—„μ§€μ†κ°€λ½μ˜ ν˜„μž¬ ν‚€νŒ¨λ“œμ˜ μœ„μΉ˜μ—μ„œ 더 κ°€κΉŒμš΄ 엄지손가락을 μ‚¬μš©ν•©λ‹ˆλ‹€.
      4-1. λ§Œμ•½ 두 μ—„μ§€μ†κ°€λ½μ˜ 거리가 κ°™λ‹€λ©΄, 였λ₯Έμ†μž‘μ΄λŠ” 였λ₯Έμ† 엄지손가락, μ™Όμ†μž‘μ΄λŠ” 왼손 엄지손가락을 μ‚¬μš©ν•©λ‹ˆλ‹€.

    μˆœμ„œλŒ€λ‘œ λˆ„λ₯Ό λ²ˆν˜Έκ°€ λ‹΄κΈ΄ λ°°μ—΄ numbers, μ™Όμ†μž‘μ΄μΈμ§€ 였λ₯Έμ†μž‘이인 지λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ¬Έμžμ—΄ handκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, 각 번호λ₯Ό λˆ„λ₯Έ 엄지손가락이 왼손인 지 였λ₯Έμ†μΈ 지λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ—°μ†λœ λ¬Έμžμ—΄ ν˜•νƒœλ‘œ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”.

     

    [μ œν•œμ‚¬ν•­]

    • numbers λ°°μ—΄μ˜ ν¬κΈ°λŠ” 1 이상 1,000 μ΄ν•˜μž…λ‹ˆλ‹€.

    • numbers λ°°μ—΄ μ›μ†Œμ˜ 값은 0 이상 9 μ΄ν•˜μΈ μ •μˆ˜μž…λ‹ˆλ‹€.

    • handλŠ” "left" λ˜λŠ” "right" μž…λ‹ˆλ‹€.

      • "left"λŠ” μ™Όμ†μž‘μ΄, "right"λŠ” 였λ₯Έμ†μž‘이λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

    • 왼손 엄지손가락을 μ‚¬μš©ν•œ κ²½μš°λŠ” L, 였λ₯Έμ† 엄지손가락을 μ‚¬μš©ν•œ κ²½μš°λŠ” R을 μˆœμ„œλŒ€λ‘œ 이어뢙여 λ¬Έμžμ—΄ ν˜•νƒœλ‘œ return ν•΄μ£Όμ„Έμš”.

     

    μ–΄λ–»κ²Œ ν’€μ—ˆλ‚˜

    import java.lang.StringBuilder;
    import java.util.HashMap;
    
    class Location {
        public int row;
        public int col;
        
        public Location(int row, int col) {
            this.row = row;
            this.col = col;
        }
    }
    
    class Solution {
        private static final int STAR = 10;
        private static final int HASH = 12;
        
    	public String solution(int[] numbers, String hand) {
    		String answer = "";
    		StringBuilder sbd = new StringBuilder();
            HashMap<Integer, Location> numNLoc = new HashMap<Integer, Location>();
    		int lHand = STAR, rHand = HASH;
            
            
            // init
            int id = 1;
            for(int r = 1; r <= 4; r++) { 
                for(int c = 1; c <= 3; c++) {
                    if(id == 11) { //zero
                        numNLoc.put(0, new Location(r, c));
                    }
                    else {
                    	numNLoc.put(id, new Location(r, c));
                    }
                    id++;
                }
            }
            
    		for (int num : numbers) {
    			if (num == 0) { // 0 -> left/ right
                    int lDist = calcDist(numNLoc.get(lHand), numNLoc.get(num));
                    int rDist = calcDist(numNLoc.get(rHand), numNLoc.get(num));
    
    				if(lDist == rDist) {
    					switch (hand) {
    					    case "left":
                                sbd.append("L");
                                lHand = num;
                                break;
    
    					    case "right":
                                sbd.append("R");
                                rHand = num;
                                break;
    					    }
    				} else { // different dist
                        if (lDist > rDist) {
    						sbd.append("R");
    						rHand = num;
    					} else {
    						sbd.append("L");
    						lHand = num;
    					}
    				}
                    
                    continue;
    			}
    
    		    switch (num % 3) {
                    case 0: // 3, 6, 9 -> right hand
                        rHand = num;
                        sbd.append("R");
                        break;
                    
                    case 1: // 1, 4, 7 -> left hand
                        lHand = num;
                        sbd.append("L");
                        break;
    
                    case 2: // 2, 5, 8 -> left/ right
                        int lDist = calcDist(numNLoc.get(lHand), numNLoc.get(num));
                        int rDist = calcDist(numNLoc.get(rHand), numNLoc.get(num));
    
                        if (lDist == rDist) {
                            switch (hand) {
                                case "left":
                                    sbd.append("L");
                                    lHand = num;
                                    break;
    
                                case "right":
                                    sbd.append("R");
                                    rHand = num;
                                    break;
                            }
                        } else { // different dist
                            if (lDist > rDist) {
                                sbd.append("R");
                                rHand = num;
                            } else {
                                sbd.append("L");
                                lHand = num;
                            }
                        }
    
                        break;
    			}
    		}
            
            answer = sbd.toString();
            
    		return answer;
    	}
        
        public int calcDist(Location handLoc, Location numLoc) {
         return Math.abs(handLoc.row - numLoc.row) + Math.abs(handLoc.col - numLoc.col);   
        }
    }

     

    μ™œ μ €λ ‡κ²Œ ν’€μ—ˆλ‚˜

    문제λ₯Ό 보면 μ•Œ 수 μžˆλ“―μ΄ DRY(Do not Repeat Yourself) 원칙을 μ–΄κΈ΄ μ½”λ“œλ„ 있고 λ‘œμ§λ„ ν•œ λˆˆμ— 잘 μ•ˆ 보인닀. ν•œ λ§ˆλ””λ‘œ λ”λŸ¬μš΄ μ½”λ“œλ‹€...πŸ˜‚πŸ˜‚

     

    μ•Œκ³ λ¦¬μ¦˜μ„ μ†Œκ°œν•˜κΈ° 전에 μ½”λ“œκ°€ λ”λŸ¬μ›Œμ§„ 원인뢀터 λ§ν•˜μžλ©΄ 0이 적힌 λ²„νŠΌμ„ 0 κ·ΈλŒ€λ‘œ μ²˜λ¦¬ν•˜κΈΈ κ³ μ§‘ν–ˆκΈ° λ•Œλ¬Έμ΄λ‹€. μžμ„Έν•œ μ΄μ•ΌκΈ°λŠ” μ•„λž˜μ—μ„œ κ³„μ†ν•˜κ² λ‹€.

     

    이 λ¬Έμ œμ—μ„œ κ°€μž₯ μ–΄λ €μš΄ λΆ€λΆ„μ΄μž 핡심은 λ²„νŠΌ κ°„μ˜ 거리λ₯Ό κ΅¬ν•˜λŠ” λΆ€λΆ„μ΄μ˜€λ‹€. λ²„νŠΌ κ°„ 거리λ₯Ό κ΅¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” * λ²„νŠΌκ³Ό # λ²„νŠΌμ„ νŠΉμ • 숫자λ₯Ό id둜 μ •ν•΄μ•Όν–ˆλ‹€. κ·Έλž˜μ„œ * λ²„νŠΌκ³Ό #λ²„νŠΌμ˜ idλ₯Ό 각각 10, 12둜 μ •ν–ˆλ‹€. κ·Έλ¦¬κ³ λ‚˜μ„œ 각 λ²„νŠΌμ˜ Idλ₯Ό 3으둜 λ‚˜λˆ λ³΄κΈ°λ„ ν•˜κ³  3으둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό ꡬ해보기도 ν–ˆμ§€λ§Œ μ–΄λ–€ κ·œμΉ™λ„ 찾을 수 μ—†μ–΄μ„œ 각 λ²„νŠΌμ˜ 거리λ₯Ό 계산할 수 μ—†μ—ˆλ‹€. μ™œλƒν•˜λ©΄ μ•žμ„œ λ§ν–ˆλ“―μ΄ 0의 idλ₯Ό 11이 μ•„λ‹Œ 0 κ·ΈλŒ€λ‘œ μ²˜λ¦¬ν•˜κΈΈ κ³ μ§‘ν–ˆκΈ° λ•Œλ¬Έμ΄λ‹€.

     

    각 λ²„νŠΌμ˜ 거리λ₯Ό μ–΄λ–»κ²Œ κ΅¬ν• κΉŒ κ³ λ―Όν•˜λ‹€κ°€ μƒκ°λ‚˜μ§ˆ μ•Šμ•„μ„œ 각 λ²„νŠΌμ˜ row와 col을 λ‚˜νƒ€λ‚΄λŠ” Locationμ΄λΌλŠ” classλ₯Ό λ§Œλ“€μ—ˆλ‹€. 그리고 각 λ²„νŠΌμ˜ idλ₯Ό Key둜 ν•˜κ³  location을 value둜 ν•˜λŠ” ν•΄μ‹œλ§΅μ„ μ΄ˆκΈ°ν™”ν–ˆλ‹€. κ·Έ λ‹€μŒλΆ€ν„°λŠ” λ¬Έμ œμ—μ„œ μ„€λͺ…ν•˜κ³  μžˆλŠ” κ²ƒμ²˜λŸΌ 1, 4, 7은 μ™Όμͺ½ μ†κ°€λ½μœΌλ‘œ, 3, 6, 9λŠ” 였λ₯Έμͺ½ μ†κ°€λ½μœΌλ‘œ, 2, 5, 8, 0은 두 손가락 쀑 거리가 더 κ°€κΉŒμš΄ μ†κ°€λ½μœΌλ‘œ λ§Œμ•½ 거리가 κ°™μœΌλ©΄ μžμ‹ μ΄ 주둜 μ‚¬μš©ν•˜λŠ” μ†μœΌλ‘œ λˆ„λ₯΄λ„둝 μ½”λ“œλ₯Ό μž‘μ„±ν–ˆλ‹€.

     

    같이 μŠ€ν„°λ””ν•˜λŠ” μΉœκ΅¬λž‘ μ•Œκ³ λ¦¬μ¦˜ λΉ„κ΅ν•˜λ‹€κ°€ 0이 적힌 λ²„νŠΌμ˜ idλ₯Ό 0이 μ•„λ‹Œ 11둜 μ²˜λ¦¬ν•˜λ©΄ 거리 κ΅¬ν•˜κΈ°κ°€ 훨씬 κΉ”λ”ν•΄μ§„λ‹€λŠ” 것을 μ•Œ 수 μžˆμ—ˆλ‹€. κ·Έ 친ꡬ의 풀이법은 μ•„λž˜ μ£Όμ†Œλ₯Ό λ“€μ–΄κ°€λ©΄ λ³Ό 수 μžˆλ‹€. 정말 λ¦¬μŠ€νŽ™ν•˜λŠ” μΉœκ΅¬λ‹€...πŸ‘πŸ‘

     

    https://0pencoding.github.io/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4/2020/07/03/%ED%82%A4%ED%8C%A8%EB%93%9C%EB%88%84%EB%A5%B4%EA%B8%B0_level1.html

     

    ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ 2020 카카였 인턴십 : ν‚€νŒ¨λ“œ λˆ„λ₯΄κΈ°

    λ‚œμ΄λ„ β˜… β˜† β˜† β˜† β˜† ν•΄λ‹Ή 문제의 μœ ν˜•μ€ λͺ¨λ₯΄κ² λ‹€..γ…Žγ…Ž μ–΄λ– ν•œ 자료ꡬ쑰λ₯Ό μ‚¬μš©ν•œκ²Œ μ•„λ‹ˆκΈ°λ„ν•˜κ³  κ·Έλƒ₯ 문제λ₯Ό 보고 νŠΉμ • μœ ν˜•μ„ μƒκ°ν•˜κ³  μ•Œκ³ λ¦¬μ¦˜μ„ μ„Έμš΄κ²Œ μ•„λ‹ˆλΌ, ‘μ΄λ ‡κ²Œ μ΄λ ‡κ²Œν•˜λ©΄

    0pencoding.github.io

     

    무엇을 λ°°μ› λ‚˜

    이 문제λ₯Ό ν’€κΈ° μ–΄λ €μ› λ˜ μ΄μœ λŠ” μ—¬λŸ¬ 방법을 μƒκ°ν•˜μ§€ μ•Šκ³  ν•œ 가지 λ°©λ²•μ—λ§Œ 맀달렸기 λ•Œλ¬Έμ΄λΌκ³  μƒκ°ν•œλ‹€. 가끔은 고집을 꺾을 ν•„μš”λ„ μžˆμ„ 것 κ°™λ‹€.

    λŒ“κΈ€

Designed by Tistory.