πŸ“” Algorithm

[ν•­ν•΄99] μ•Œκ³ λ¦¬μ¦˜ λͺ¨μ˜κ³ μ‚¬ - μ†Œμˆ˜μ˜ κ°œμˆ˜μ™€ λ§μ…ˆ

kyuu_ng 2022. 11. 23. 23:02

- 문제 : 

  • λ¬Έμžμ—΄ S에 곡백으둜 κ΅¬λΆ„λœ μˆ«μžλ“€μ΄ μ €μž₯λ˜μ–΄μžˆλŠ”λ°, ν•΄λ‹Ή 숫자 쀑 μ†Œμˆ˜μ˜ μ΅œλŒ€κ°’κ³Ό μ†Œμˆ˜κ°€ μ•„λ‹Œ 수의 μ΅œμ†Œκ°’μ„ μ°Ύμ•„ λ°˜ν™˜ν•˜λŠ” 문제
  • μŒμˆ˜λŠ” μ—†λ‹€

- μ†ŒμŠ€μ½”λ“œ

package examPrac;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class exam3 {
    public String solution(String s) {
        String[] sSplit = s.split(" ");
        // λ¬Έμžμ—΄ Sλ₯Ό λ°›μ•„μ„œ 곡백을 κΈ°μ€€μœΌλ‘œ μž˜λΌμ„œ 배열에 μ €μž₯ν•œλ‹€.

        // μ†Œμˆ˜μ™€, μ†Œμˆ˜κ°€ μ•„λ‹Œ ν•­λͺ©λ“€μ„ 담을 Listλ₯Ό μƒμ„±ν•œλ‹€.
        List<Integer> sosu = new ArrayList<Integer>();
        List<Integer> nososu = new ArrayList<Integer>();

        int[] newArr = new int[sSplit.length];
        // 곡백을 κΈ°μ€€μœΌλ‘œ 자λ₯Έ 숫자λ₯Ό λ‹΄κ³ μžˆλŠ” λ¬Έμžμ—΄ λ°°μ—΄μ˜ 데이터λ₯Ό μ •μˆ˜ 배열에 λ„£κΈ°μœ„ν•΄ μ •μˆ˜ν˜• 배열을 μƒμ„±ν•œλ‹€.

        for (int i = 0; i < sSplit.length; i++) {
            // sSplit 크기만큼 λ°˜λ³΅ν•˜μ—¬ 데이터λ₯Ό μ •μˆ˜ν˜• 배열에 μ €μž₯ν•œλ‹€
            newArr[i] = Integer.parseInt(sSplit[i]);
        }

        // μ†Œμˆ˜λ₯Ό κ΅¬ν•˜κΈ° μœ„ν•œ 반볡문
        // μ†Œμˆ˜λž€ 1κ³Ό 자기 μžμ‹  μ™Έ λ‹€λ₯Έ 숫자둜 λ‚˜λ‰˜μ–΄μ§€μ§€ μ•ŠλŠ” 숫자둜 μ•½μˆ˜λ„ 2개 μ΄ν•˜μ—¬μ•Όν•¨
        // μ•½μˆ˜κ°€ 2개 이상이면 μ†Œμˆ˜κ°€ μ•„λ‹Œκ±Έλ‘œ νŒλ³„ ν•˜μ˜€μŒ
        for (int i = 0; i < newArr.length; i++) {
            // iλŠ” 0λΆ€ν„° newArr의 길이만큼 λ°˜λ³΅ν•œλ‹€.
            int cnt = 0;
            // cntλ₯Ό 첫번째 forλ¬Έμ—μ„œ μ΄ˆκΈ°ν™” ν•˜λŠ” μ΄μœ λŠ” 2번째 forλ¬Έμ—μ„œ newArr[i] 만큼 연산을 ν•˜λ©΄μ„œ Cntλ₯Ό 증가 μ‹œν‚¨ ν›„
            // newArr[i]의 연산이 λλ‚˜κ³  newArr[i+1]의 연산이 μ‹œμž‘λ˜μ—ˆμ„ λ•Œ λ‹€μ‹œ 0 λΆ€ν„° μ΄ˆκΈ°ν™”ν•˜μ—¬ cntλ₯Ό μ„Έμ•Όν•˜κΈ° λ•Œλ¬Έμž„
            for (int j = 1; j <= newArr[i]; j++) {
                // μ•½μˆ˜κ°€ 2개(1κ³Ό λ‚˜μžμ‹ )μ΄μƒμΌλ•Œλ₯Ό ꡬ할것이기 떄문에 JλŠ” 1λΆ€ν„° newArr[i]의 κ°’λ§ŒνΌ λ°˜λ³΅ν•œλ‹€.
                if (newArr[i] % j == 0) {
                    // newArr[i]λ₯Ό j(1~newArr[i])둜 λ‚˜λˆ΄μ„λ•Œ λ‚˜λ¨Έμ§€κ°€ 0이면 μ†Œμˆ˜κ°€ μ•„λ‹ˆλ―€λ‘œ
                    cnt += 1; }
                    // cnt λ₯Ό 1μ”© μ¦κ°€ν•œλ‹€.
            }if (cnt >= 3) {
                // λ‘λ²ˆμ§Έ forλ¬Έ ν•œλ°”κΎΈ 돈 후에 cntκ°€ 3 이상(=μ•½μˆ˜κ°€ 3이상)일 경우
                nososu.add(newArr[i]);
                // nososu λ¦¬μŠ€νŠΈμ— ν•΄λ‹Ή 값을 μΆ”κ°€ν•œλ‹€.
            } else {
                // cntκ°€ 3 미만 (=2,1)일경우 μ†Œμˆ˜μ΄κΈ° 떄문에
                sosu.add(newArr[i]);
                // sosu 배열에 μΆ”κ°€ν•œλ‹€.
            }
        }

        int max = Collections.max(sosu);
        // Collections.max ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ sosu 리슀트의 μ΅œλŒ€κ°’μ„ κ΅¬ν•œλ‹€.
        int min = Collections.min(nososu);
        // Collections.min ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ nososu 리슀트의 μ΅œμ†Œκ°’μ„ κ΅¬ν•œλ‹€.
        String total = "μ΅œμ†Œ : " + min + "μ΅œλŒ€ : " + max;
        return total;
    }

    public static void main(String[] args) {
//        String s = "2 3 4 5";
        String s = "15 3 10 9 7 8";

        exam3 exam = new exam3();
        System.out.println(exam.solution("2 3 4 5"));
        System.out.println(exam.solution( "15 3 10 9 7 8"));
        System.out.println(exam.solution( "97 75 88 99 95 92 73"));
    }
}

-  풀이  : 

  • 이 문제λ₯Ό ν’€κΈ° μœ„ν•΄μ„œλŠ” μ†Œμˆ˜κ°€ λ­”μ§€ λΆ€ν„° μ•Œμ•„μ•Όν•œλ‹€.
    πŸ‘‰ μ†Œμˆ˜λŠ” λ‚˜λˆ΄μ„λ•Œ 1κ³Ό λ‚΄ μžμ‹ μœΌλ‘œλ§Œ λ‚˜λ‰˜μ–΄μ§€λŠ” 수 = 즉 μ•½μˆ˜κ°€ 2개인 수 이닀.
  • λ‚˜λŠ” λ¬Έμ œμ—μ„œ μ•½μˆ˜κ°€ 2개 μ΄ν•˜μΈ 수λ₯Ό μ†Œμˆ˜λ‘œ νŒλ‹¨ν•˜κ²Œλ” μ†ŒμŠ€μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ˜€λ‹€.
    γ„΄ μ•½μˆ˜ 갯수λ₯Ό μ„ΈκΈ°μœ„ν•΄ cntλΌλŠ” λ³€μˆ˜λ₯Ό, μ†Œμˆ˜/μ†Œμˆ˜κ°€ μ•„λ‹Œ 수 의 리슀트λ₯Ό λ§Œλ“€μ–΄μ„œ λΆ„λ₯˜ν•˜μ—¬ λͺ¨μŒλ“€μ˜ μ΅œμ†Œ/μ΅œλŒ€κ°’μ„ κ΅¬ν–ˆλ‹€.