KDLiam

[Programmers ์ฝ”๋”ฉ ๊ธฐ์ดˆ ํŠธ๋ ˆ์ด๋‹ : Java] ์ฃผ์‚ฌ์œ„ ๊ฒŒ์ž„ 3 ๋ณธ๋ฌธ

Problems(Java)/Programmers

[Programmers ์ฝ”๋”ฉ ๊ธฐ์ดˆ ํŠธ๋ ˆ์ด๋‹ : Java] ์ฃผ์‚ฌ์œ„ ๊ฒŒ์ž„ 3

KDLiam 2025. 10. 15. 14:46

๐ŸŽฒ ์ฃผ์‚ฌ์œ„ ๊ฒŒ์ž„ 3 (ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค)

๋งํฌ : https://school.programmers.co.kr/learn/courses/30/lessons/181916

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

SW๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ‰๊ฐ€, ๊ต์œก์˜ Total Solution์„ ์ œ๊ณตํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์„ฑ์žฅ์„ ์œ„ํ•œ ๋ฒ ์ด์Šค์บ ํ”„

programmers.co.kr

๋ฌธ์ œ ์š”์•ฝ

  • 4๊ฐœ์˜ ์ฃผ์‚ฌ์œ„ ์ˆซ์ž(a, b, c, d)๊ฐ€ ์ฃผ์–ด์ง.
  • ๊ทœ์น™์— ๋”ฐ๋ผ ์ ์ˆ˜ ๊ณ„์‚ฐ:
    1. ๋„ค ์ฃผ์‚ฌ์œ„ ๋ชจ๋‘ ๊ฐ™์Œ → 1111 × ์ฃผ์‚ฌ์œ„ ์ˆซ์ž
    2. ๋„ค ์ฃผ์‚ฌ์œ„ ๋ชจ๋‘ ๋‹ค๋ฆ„ → ์ตœ์†Œ ์ˆซ์ž
    3. ์„ธ ์ฃผ์‚ฌ์œ„ ๊ฐ™๊ณ  ํ•˜๋‚˜ ๋‹ค๋ฆ„ → (10 × ๋™์ผ ์ˆซ์ž + ๋‹ค๋ฅธ ์ˆซ์ž)^2
    4. ๋‘ ์ฃผ์‚ฌ์œ„ ๊ฐ™๊ณ  ๋‚˜๋จธ์ง€ ๋‘ ์ฃผ์‚ฌ์œ„ ๊ฐ๊ฐ ๋‹ค๋ฆ„ → (๊ฐ™์€ ์ฃผ์‚ฌ์œ„ ์ˆซ์ž + ๋‹ค๋ฅธ ์ฃผ์‚ฌ์œ„ ์ˆซ์ž) × |๊ฐ™์€ ์ฃผ์‚ฌ์œ„ ์ˆซ์ž - ๋‹ค๋ฅธ ์ฃผ์‚ฌ์œ„ ์ˆซ์ž|
    5. ๋‘ ์Œ ๊ฐ™์€ ๊ฒฝ์šฐ → (์ฒซ ์Œ ์ˆซ์ž + ๋‘ ๋ฒˆ์งธ ์Œ ์ˆซ์ž) × |์ฒซ ์Œ ์ˆซ์ž - ๋‘ ๋ฒˆ์งธ ์Œ ์ˆซ์ž|

1๏ธโƒฃ ์ฒ˜์Œ ์ž‘์„ฑํ•œ ์ฝ”๋“œ

 
class Solution {
    public int solution(int a, int b, int c, int d) {
        int answer = 0; // ๋ธ”๋ก ๋ฐ–์—์„œ ์„ ์–ธ

        // 1. ๋„ค ์ฃผ์‚ฌ์œ„ ๋ชจ๋‘ ๊ฐ™์Œ
        if(a == b && b == c && c == d) {
            answer = 1111 * a;

        // 2. ๋„ค ์ฃผ์‚ฌ์œ„ ๋ชจ๋‘ ๋‹ค๋ฆ„
        } else if(a!=b && a!=c && a!=d &&
                  b!=c && b!=d &&
                  c!=d) {
            answer = Math.min(Math.min(a,b), Math.min(c,d));

        // 3. ์„ธ ์ฃผ์‚ฌ์œ„๊ฐ€ ๊ฐ™๊ณ  ๋‚˜๋จธ์ง€ ํ•˜๋‚˜ ๋‹ค๋ฆ„
        } else if((a==b && b==c) || (a==b && b==d) || 
                  (a==c && c==d) || (b==c && c==d)) {
            
            if(a==b && b==c) answer = (int)Math.pow(10*a + d, 2);
            else if(a==b && b==d) answer = (int)Math.pow(10*a + c, 2);
            else if(a==c && c==d) answer = (int)Math.pow(10*a + b, 2);
            else if(b==c && c==d) answer = (int)Math.pow(10*b + a, 2);

        // 4. ๋‘ ์ฃผ์‚ฌ์œ„๊ฐ€ ๊ฐ™๊ณ  ๋‚˜๋จธ์ง€ ๋‘ ์ฃผ์‚ฌ์œ„๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅด๊ฑฐ๋‚˜ ๋‘ ์Œ ๊ฐ™์€ ๊ฒฝ์šฐ
        } else {
            // ๋‘ ์Œ ๊ฐ™์€ ๊ฒฝ์šฐ
            if(a==b && c==d) answer = (a + c) * Math.abs(a - c);
            else if(a==c && b==d) answer = (a + b) * Math.abs(a - b);
            else if(a==d && b==c) answer = (a + b) * Math.abs(a - b);
            // ํ•˜๋‚˜๋งŒ ์ค‘๋ณต
            else if(a==b) answer = c * d;
            else if(a==c) answer = b * d;
            else if(a==d) answer = b * c;
            else if(b==c) answer = a * d;
            else if(b==d) answer = a * c;
            else if(c==d) answer = a * b;
        }

        return answer;
    }
}

์žฅ์ 

  • ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ์กฐ๊ฑด๋ฌธ์œผ๋กœ ๋ช…์‹œ → ๋…ผ๋ฆฌ ํ๋ฆ„ ์ง๊ด€์ 
  • ๊ฐ„๋‹จํ•œ if-else ๊ตฌ์กฐ๋กœ ๋ฐ”๋กœ ์ดํ•ด ๊ฐ€๋Šฅ

๋‹จ์ 

  • ์กฐ๊ฑด๋ฌธ์ด ๊ธธ๊ณ  ์ค‘๋ณต๋จ → ์œ ์ง€๋ณด์ˆ˜ ์–ด๋ ค์›€
  • ์ˆซ์ž๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ์กฐ๊ฑด์ด ํญ๋ฐœ์ ์œผ๋กœ ์ฆ๊ฐ€
  • ์—ฐ์‚ฐ ๋ฐ ๊ฐ€๋…์„ฑ ์ธก๋ฉด์—์„œ ๋น„ํšจ์œจ์ 

2๏ธโƒฃ ๊ฐœ์„ ํ•œ ์ฝ”๋“œ (Stream + ๋ฐฐ์—ด ๊ธฐ๋ฐ˜)

 
import java.util.*;

class Solution {
    private int findSingleIndex(int a, int b, int c, int d) {
        if(a==b && b==c) return 3;
        else if(a==b && b==d) return 2;
        else if(a==c && c==d) return 1;
        else return 0;
        
    }
    
    public int solution(int a, int b, int c, int d) {
        int answer = 0; 
        
        // ๋ฐฐ์—ด๋กœ ์ƒ์„ฑ
        int[] nums = {a, b, c, d};
        int[] distinctNums = Arrays.stream(nums)
                    .distinct() // ์ค‘๋ณต ์ œ๊ฑฐ
                    .sorted() // ์ •๋ ฌ
                    .toArray();
        
        // System.out.println(Arrays.toString(nums)); // ๋ฐฐ์—ด ์ถœ๋ ฅ
        // 1. ๋ชจ๋‘ ๊ฐ™์€ ์ˆซ์ž => ๋ฐฐ์—ด ์‚ฌ์ด์ฆˆ 1
        if(distinctNums.length == 1) {
            answer = 1111*distinctNums[0];
        
        // 2. ๋ชจ๋‘ ๋‹ค๋ฅธ ์ˆซ์ž => ๋ฐฐ์—ด ์‚ฌ์ด์ฆˆ 4
        } else if(distinctNums.length == 4) {
            answer = Math.min(Math.min(distinctNums[0], distinctNums[1]), Math.min(distinctNums[2], distinctNums[3]));        
        // 3. ์„ธ ์ฃผ์‚ฌ์œ„๊ฐ€ ๊ฐ™์€ ์ˆซ์ž => ๋ฐฐ์—ด ์‚ฌ์ด์ฆˆ 2
        } else if (distinctNums.length == 2) {
            
            int cnt1 = 0;
            int cnt2 = 0;
            // ๋ช‡๊ฐœ๊ฐ€ ๊ฐ™์€์ง€ ํŒ๋ณ„
            for(int n: nums) {
                if(n==distinctNums[0]) cnt1++;
                else cnt2++;
            }
            
            // 3๊ฐœ ๊ฐ™๊ณ , 1๊ฐœ ๋‹ค๋ฆ„            
            if(cnt1==3 || cnt2==3) {
                int p=0;
                int q=0;
                // ์–ด๋–ค ์ˆซ์ž๊ฐ€ 3๊ฐœ์”ฉ ๋‚˜์™”๋Š”์ง€ ํŒ๋ณ„
                switch(findSingleIndex(a, b, c, d)) {
                    case 0: p=b; q=a; break;
                    case 1: p=a; q=b; break;
                    case 2: p=a; q=c; break;
                    case 3: p=a; q=d; break;
                }
                answer = (10*p + q) * (10 * p + q);
            } else {
                int p = distinctNums[0];
                int q = distinctNums[1];
                answer = (p+q) * Math.abs(p-q);
            }
        // 4. ๋‘ ์ฃผ์‚ฌ์œ„๊ฐ€ ๊ฐ™๊ณ , 2๊ฐœ๊ฐ€ ๊ฐ๊ฐ ๋‹ค๋ฆ„ => 
        } else {
            // ๋ญ๊ฐ€ 2๋ฒˆ ๋‚˜์˜จ์ง€ ํ™•์ธ ํ›„ ๋‹ค๋ฅธ๊ฒƒ ํ•ฉํ•˜๊ธฐ
            int cnt1 = 0;
            int cnt2 = 0;
            int cnt3 = 0;
            
            int q = 0;
            int r = 0;
            
            for(int n: nums) {
                if(n == distinctNums[0]) cnt1++;
                else if(n == distinctNums[1]) cnt2++;
                else cnt3++;
           }

            if(cnt1 == 2) {
                q = distinctNums[1];
                r = distinctNums[2]; 
            } else if (cnt2 == 2) {
                q = distinctNums[0];
                r = distinctNums[2]; 
            } else {
                q = distinctNums[0];
                r = distinctNums[1]; 
            }
            answer = q*r;
        }

        return answer;
    }
}

์žฅ์ 

  • ๋ฐฐ์—ด + Stream API ํ™œ์šฉ → ์ˆซ์ž ์ค‘๋ณต ์ œ๊ฑฐ, ์ •๋ ฌ, ์ตœ์†Œ๊ฐ’ ํ™•์ธ ๊ฐ„ํŽธ
  • ์กฐ๊ฑด๋ฌธ์ด ๋‹จ์ˆœํ™” → ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด
  • ์—ฐ์‚ฐ๋Ÿ‰ ์ตœ์†Œํ™” (ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ๊ณ„์‚ฐ)

๋‹จ์ 

  • ์ฒ˜์Œ ๋ณด๋Š” ์‚ฌ๋žŒ์—๊ฒŒ๋Š” Stream API์™€ distinct() ๋“ฑ ์ต์ˆ™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ
  • switch๋ฌธ๊ณผ ๋ฐฐ์—ด ์ธ๋ฑ์Šค ์—ฐ์‚ฐ์ด ์กฐ๊ธˆ ๋ณต์žก

3๏ธโƒฃ ๋‘ ์ฝ”๋“œ ๋น„๊ต

๊ตฌ๋ถ„์ฒ˜์Œ ์ฝ”๋“œ๊ฐœ์„  ์ฝ”๋“œ
๊ฐ€๋…์„ฑ ์กฐ๊ฑด๋ฌธ ๊ธธ๊ณ  ์ค‘๋ณต ๋งŽ์Œ ๋ฐฐ์—ด + Stream, ๊ฒฝ์šฐ ๋‚˜๋ˆ„๊ธฐ ๊ฐ„๊ฒฐ
์œ ์ง€๋ณด์ˆ˜ ์–ด๋ ค์›€, ์กฐ๊ฑด ์ถ”๊ฐ€ ์‹œ ๋ณต์žก ์šฉ์ด, ์ˆซ์ž๊ฐ€ ๋Š˜์–ด๋‚˜๋„ ๊ตฌ์กฐ ์œ ์ง€ ๊ฐ€๋Šฅ
์„ฑ๋Šฅ ์ƒ์ˆ˜ ๊ฐœ์ˆ˜๋ผ ํฐ ๋ฌธ์ œ ์—†์Œ, ํ•˜์ง€๋งŒ ์กฐ๊ฑด๋ฌธ ๋งŽ์Œ Stream๊ณผ distinct ์‚ฌ์šฉ → O(n) ๋‚ด์™ธ, ์ž‘์€ ์ƒ์ˆ˜๋ผ ์ฒด๊ฐ ์—†์Œ
๋ณต์žก๋„ O(1) (ํ•ญ์ƒ 4๊ฐœ ์ˆซ์ž) O(1), Stream ์‚ฌ์šฉ์œผ๋กœ ์•ฝ๊ฐ„ ์˜ค๋ฒ„ํ—ค๋“œ ์žˆ์ง€๋งŒ ์ƒ์ˆ˜ ์ˆ˜์ค€

4๏ธโƒฃ ์ตœ์ข… ํ‰๊ฐ€

  • ์ฒ˜์Œ ์ฝ”๋“œ: ์ง๊ด€์ ์ด์ง€๋งŒ, ์กฐ๊ฑด๋ฌธ์ด ๊ธธ๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ต๋‹ค.
  • ๊ฐœ์„  ์ฝ”๋“œ: ๊ฐ€๋…์„ฑ, ์œ ์ง€๋ณด์ˆ˜, ๊ตฌ์กฐ์  ๋ช…ํ™•์„ฑ์—์„œ ์šฐ์ˆ˜.
    • Stream + ๋ฐฐ์—ด ์ ‘๊ทผ์œผ๋กœ ์ค‘๋ณต ์ œ๊ฑฐ, ์ •๋ ฌ, ์ตœ์†Œ๊ฐ’ ํƒ์ƒ‰์ด ๊ฐ„๋‹จํ•ด์ง.
    • ์‹ค์ œ ์„ฑ๋Šฅ ์ฐจ์ด๋Š” ๋ฏธ๋ฏธํ•˜์ง€๋งŒ, ์ฝ”๋“œ ํ™•์žฅ์„ฑ๊ณผ ๊ฐ€๋…์„ฑ ์ธก๋ฉด์—์„œ ํ›จ์”ฌ ์ข‹์Œ.

๐Ÿ’ก ๊ฒฐ๋ก : ํ˜„์—… ์ฝ”๋“œ๋‚˜ ํ˜‘์—… ํ™˜๊ฒฝ์—์„œ๋Š” ๊ฐœ์„  ์ฝ”๋“œ๋ฅผ ์ถ”์ฒœ