** πŸ“Œ# 1단계 λ³Έλ¬Έ: λ°°μ—΄ 생성 및 μ΄ˆκΈ°ν™”**


1. λ°°μ—΄μ΄λž€?


λ°°μ—΄μ˜ νŠΉμ§• μš”μ•½

πŸ”Ή λΉ„μœ : 우체ꡭ μ‚¬μ„œν•¨


2. λ°°μ—΄ μƒμ„±ν•˜κΈ°

int[] balls = new int[45]; // 1~45 숫자λ₯Ό μ €μž₯ν•  λ°°μ—΄
int[] lotto = new int[6];  // μ„žμΈ 번호 쀑 6개 μ €μž₯

πŸ”Ή λΉ„μœ : λ²ˆν˜Έν‘œ 톡 λ§Œλ“€κΈ°


3. λ°°μ—΄ μ΄ˆκΈ°ν™”ν•˜κΈ°

for (int i = 0; i < balls.length; i++) {
    balls[i] = i + 1;
}

πŸ”Ή λΉ„μœ : λ²ˆν˜Έν‘œ λ§Œλ“€κΈ°


4. λ°°μ—΄ μ΄ˆκΈ°ν™”μ˜ 전체 흐름

  1. balls[] 배열을 μƒμ„±ν•©λ‹ˆλ‹€. (int[] balls = new int[45];)
  2. for 문을 μ‚¬μš©ν•˜μ—¬ balls[] 배열을 μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€.
  3. 1λΆ€ν„° 45κΉŒμ§€μ˜ μˆ«μžκ°€ μˆœμ„œλŒ€λ‘œ μ €μž₯λ©λ‹ˆλ‹€.

전체 μ½”λ“œ

int[] balls = new int[45];
for (int i = 0; i < balls.length; i++) {
    balls[i] = i + 1;
}

πŸ”Ή λΉ„μœ : λ²ˆν˜Έν‘œ 톡 μ€€λΉ„ν•˜κΈ°


5. 기술 λ©΄μ ‘ λŒ€λΉ„ μš”μ•½


πŸ“ ν•œλˆˆμ— λ³΄λŠ” μš”μ•½



πŸ”€ 2단계 λ³Έλ¬Έ: λ°°μ—΄ μ„žκΈ° (랜덀 μ…”ν”Œ)


1. λ°°μ—΄ μ„žκΈ°(랜덀 μ…”ν”Œ)의 ν•„μš”μ„±


λ°°μ—΄ μ„žκΈ°μ˜ λͺ©μ  μš”μ•½

πŸ”Ή λΉ„μœ : 곡 λ’€μ„žκΈ°


2. 랜덀 μ„žκΈ° μ•Œκ³ λ¦¬μ¦˜ (Swap 방식)


랜덀 μ„žκΈ° μ½”λ“œ 뢄석

for (int i = 0; i < 1000; i++) {
    int f = (int)(Math.random() * 45);
    int t = (int)(Math.random() * 45);
    int tmp = balls[f];
    balls[f] = balls[t];
    balls[t] = tmp;
}

μ„€λͺ…

  1. 랜덀 인덱슀 생성

     int f = (int)(Math.random() * 45);
     int t = (int)(Math.random() * 45);
    
    • Math.random()은 0.0 이상 1.0 미만의 μ‹€μˆ˜λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
    • Math.random() * 45λŠ” 0 이상 45 미만의 μ‹€μˆ˜κ°€ λ©λ‹ˆλ‹€.
    • (int)둜 μ •μˆ˜ν˜• λ³€ν™˜ν•˜λ©΄ 0λΆ€ν„° 44 μ‚¬μ΄μ˜ λžœλ€ν•œ μ •μˆ˜κ°€ λ‚˜μ˜΅λ‹ˆλ‹€.
    • *λžœλ€ν•˜κ²Œ 뽑은 두 μœ„μΉ˜(f와 t)의 값을 **μ„œλ‘œ κ΅ν™˜(Swap) ν•©λ‹ˆλ‹€.

  1. 두 μœ„μΉ˜μ˜ 값을 κ΅ν™˜(Swap)

     int tmp = balls[f];
     balls[f] = balls[t];
     balls[t] = tmp;
    
    • *μž„μ‹œ λ³€μˆ˜(tmp)λ₯Ό μ‚¬μš©ν•˜μ—¬ **두 μœ„μΉ˜μ˜ 값을 κ΅ν™˜(Swap) ν•©λ‹ˆλ‹€.
    • 예: balls[3]κ³Ό balls[7]을 κ΅ν™˜ν•  λ•Œ
      • tmp에 balls[3] 값을 μ €μž₯
      • balls[3]에 balls[7] 값을 λ„£μŒ
      • balls[7]에 tmp 값을 λ„£μŒ
    • 두 μœ„μΉ˜μ˜ 값이 λ°”λ€Œλ©΄μ„œ 배열이 λ¬΄μž‘μœ„λ‘œ μ„žμž„

πŸ”Ή λΉ„μœ : μΉ΄λ“œ μ„žκΈ°


3. 1000번 반볡의 의미


4. 랜덀 μ…”ν”Œμ˜ λΉ„νš¨μœ¨μ„± 및 κ°œμ„ μ 

λΉ„νš¨μœ¨μ μΈ 점

κ°œμ„ μ : Fisher-Yates μ•Œκ³ λ¦¬μ¦˜


Fisher-Yates μ•Œκ³ λ¦¬μ¦˜ μ˜ˆμ‹œ

for (int i = balls.length - 1; i > 0; i--) {
    int j = (int)(Math.random() * (i + 1));
    int tmp = balls[i];
    balls[i] = balls[j];
    balls[j] = tmp;
}

5. 기술 λ©΄μ ‘ λŒ€λΉ„ μš”μ•½


πŸ“ ν•œλˆˆμ— λ³΄λŠ” μš”μ•½


🎟️ 3단계 λ³Έλ¬Έ: 둜또 번호 6개 μ„ νƒν•˜κΈ°


1. 둜또 번호 μ„ νƒμ˜ κΈ°λ³Έ κ°œλ…


μ™œ μ•žμͺ½ 6개λ₯Ό μ„ νƒν• κΉŒ?

πŸ”Ή λΉ„μœ : 곡 뽑기 ν†΅μ—μ„œ μ•žμͺ½ 곡 6개 뽑기


2. λ°°μ—΄μ—μ„œ 6개의 번호 μ„ νƒν•˜κΈ°


μ½”λ“œ 뢄석

for (int i = 0; i < lotto.length; i++) {
    lotto[i] = balls[i];
}

μ„€λͺ…

  1. 6번 λ°˜λ³΅ν•˜κΈ°
    • lotto.lengthλŠ” 6μž…λ‹ˆλ‹€.
    • 6번 λ°˜λ³΅ν•˜λ©΄μ„œ lotto[0]λΆ€ν„° lotto[5]κΉŒμ§€ 값을 λ„£μŠ΅λ‹ˆλ‹€.
  2. μ•žμͺ½ 6개의 숫자 μ„ νƒν•˜κΈ°
    • balls[0], balls[1], …, balls[5]β†’ λžœλ€ν•˜κ²Œ μ„žμΈ λ°°μ—΄μ—μ„œ μ•ž 6개λ₯Ό 선택
    • balls 배열은 이미 λ¬΄μž‘μœ„λ‘œ μ„žμ˜€μœΌλ―€λ‘œμ•žμͺ½ 숫자 6κ°œκ°€ λžœλ€ν•˜κ²Œ μ„ νƒλ©λ‹ˆλ‹€.
  3. lotto[] 배열에 μ €μž₯ν•˜κΈ°
    • lotto[0] = balls[0]
    • lotto[1] = balls[1]
    • …
    • lotto[5] = balls[5]

μ˜ˆμ‹œ

// balls[] λ°°μ—΄ (λžœλ€ν•˜κ²Œ μ„žμΈ μƒνƒœ)
balls = [33, 7, 22, 1, 19, 44, 10, ... , 15]

// lotto[] λ°°μ—΄ (μ•ž 6개 선택 ν›„)
lotto = [33, 7, 22, 1, 19, 44]

πŸ”Ή λΉ„μœ : μ•žμͺ½μ—μ„œ 6개 곡 뽑기


3. 쀑볡 검사 없이 번호 μ„ νƒν•˜κΈ°


쀑볡 검사 없이 κ°€λŠ₯ν•œ 이유 정리

  1. λ°°μ—΄ μ΄ˆκΈ°ν™” 단계
    • 1λΆ€ν„° 45κΉŒμ§€μ˜ μˆ«μžκ°€ 쀑볡 없이 배열에 μ €μž₯됨
    • balls[] = [1, 2, 3, ... , 45]
  2. λ°°μ—΄ μ„žκΈ° 단계
    • 배열을 λžœλ€ν•˜κ²Œ μ„žμŒ
    • ν•˜μ§€λ§Œ μˆ«μžλŠ” κ·ΈλŒ€λ‘œ μ‘΄μž¬ν•˜λ―€λ‘œ 쀑볡 μ—†μŒ
  3. μ•žμͺ½ 6개 선택
    • 쀑볡 없이 λ¬΄μž‘μœ„λ‘œ μ„žμΈ λ°°μ—΄μ—μ„œ
    • μ•ž 6개λ₯Ό μ„ νƒν•˜λ―€λ‘œ 쀑볡이 μžˆμ„ 수 μ—†μŒ

πŸ”Ή λΉ„μœ : λ²ˆν˜Έν‘œ μˆœμ„œλ§Œ μ„žκΈ°


4. λ‹€λ₯Έ λ°©λ²•κ³Όμ˜ 비ꡐ

ν˜„μž¬ 방식: λ°°μ—΄ μ„žκΈ° β†’ μ•ž 6개 선택


λ‹€λ₯Έ 방법: Set 자료ꡬ쑰 μ‚¬μš©ν•˜κΈ°

Set<Integer> lotto = new HashSet<>();
while (lotto.size() < 6) {
    lotto.add((int)(Math.random() * 45) + 1);
}

5. 기술 λ©΄μ ‘ λŒ€λΉ„ μš”μ•½


πŸ“ ν•œλˆˆμ— λ³΄λŠ” μš”μ•½



πŸ”’ 4단계 λ³Έλ¬Έ: 번호 μ •λ ¬ (버블 μ •λ ¬)


1. 번호 μ •λ ¬μ˜ ν•„μš”μ„±


μ™œ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν• κΉŒ?

πŸ”Ή λΉ„μœ : 숫자 μˆœμ„œλŒ€λ‘œ μ •λ ¬ν•˜κΈ°


2. 버블 μ •λ ¬ (Bubble Sort) μ‚¬μš©


버블 μ •λ ¬μ˜ νŠΉμ§• μš”μ•½

πŸ”Ή λΉ„μœ : 물방울이 μœ„λ‘œ μ˜¬λΌκ°€λŠ” λͺ¨μ–‘


3. 버블 μ •λ ¬ μ½”λ“œ 뢄석

for (int i = 0; i < lotto.length; i++) {
    boolean sortable = true;
    for (int j = 0; j < lotto.length - 1 - i; j++) {
        if (lotto[j] > lotto[j + 1]) {
            int tmp = lotto[j];
            lotto[j] = lotto[j + 1];
            lotto[j + 1] = tmp;
            sortable = false;
        }
    }
    if (sortable) break;
}

μ„€λͺ…

  1. 두 κ°œμ”© λΉ„κ΅ν•˜μ—¬ 큰 숫자λ₯Ό 였λ₯Έμͺ½μœΌλ‘œ 이동
    • lotto[j]와 lotto[j + 1]을 λΉ„κ΅ν•˜μ—¬
      • μ™Όμͺ½ μˆ«μžκ°€ 더 크면 β†’ μ„œλ‘œ κ΅ν™˜(Swap)
      • μ™Όμͺ½ μˆ«μžκ°€ 더 μž‘μœΌλ©΄ β†’ 아무 일도 μ•ˆ 함
  2. ν•œ 번의 μˆœνšŒκ°€ λλ‚˜λ©΄
    • κ°€μž₯ 큰 μˆ«μžκ°€ 맨 였λ₯Έμͺ½μ— μœ„μΉ˜
    • κ°€μž₯ 였λ₯Έμͺ½ μˆ«μžλŠ” 정렬이 λλ‚œ μƒνƒœ
  3. λ°˜λ³΅ν•˜λ©° μ •λ ¬
    • 6개의 숫자λ₯Ό 5번 λΉ„κ΅ν•˜λ©΄μ„œ μ •λ ¬ μ™„λ£Œ
    • μ΄μ›ƒν•œ 숫자끼리 λΉ„κ΅ν•˜λ©΄μ„œ 큰 숫자λ₯Ό 였λ₯Έμͺ½μœΌλ‘œ 이동
    • κ°€μž₯ 큰 μˆ«μžκ°€ μ •λ ¬λ˜λ©΄ λ‹€μŒ 큰 숫자λ₯Ό μ •λ ¬
  4. sortable ν”Œλž˜κ·Έλ‘œ μ„±λŠ₯ μ΅œμ ν™”
    • 이미 μ •λ ¬λœ μƒνƒœλΌλ©΄ 더 이상 λ°˜λ³΅ν•˜μ§€ μ•ŠμŒ
    • 비ꡐ와 Swap이 λ°œμƒν•˜μ§€ μ•ŠμœΌλ©΄ β†’ sortable = true
    • sortable이 true라면 β†’ break둜 반볡문 μ’…λ£Œ
    • λΆˆν•„μš”ν•œ λ°˜λ³΅μ„ μƒλž΅ν•΄μ„œ μ„±λŠ₯ ν–₯상

μ˜ˆμ‹œ: 버블 μ •λ ¬ κ³Όμ •

// 초기 μƒνƒœ
lotto = [33, 7, 22, 1, 19, 44]

// 1νšŒμ „ ν›„ (κ°€μž₯ 큰 숫자 44κ°€ 맨 였λ₯Έμͺ½μœΌλ‘œ 이동)
lotto = [7, 22, 1, 19, 33, 44]

// 2νšŒμ „ ν›„ (33이 였λ₯Έμͺ½μœΌλ‘œ 이동)
lotto = [7, 1, 19, 22, 33, 44]

// 3νšŒμ „ ν›„ (22κ°€ 였λ₯Έμͺ½μœΌλ‘œ 이동)
lotto = [1, 7, 19, 22, 33, 44]

πŸ”Ή λΉ„μœ : 물방울이 μœ„λ‘œ μ˜¬λΌκ°€λŠ” λͺ¨μ–‘


4. λΉ„νš¨μœ¨μ„± 및 κ°œμ„ μ 

버블 μ •λ ¬μ˜ λΉ„νš¨μœ¨μ„±


κ°œμ„ μ : Arrays.sort() μ‚¬μš©ν•˜κΈ°

Arrays.sort(lotto);

5. 기술 λ©΄μ ‘ λŒ€λΉ„ μš”μ•½



πŸ”Š 5단계 λ³Έλ¬Έ: 번호 좜λ ₯ν•˜κΈ°


1. 번호 좜λ ₯을 ν•˜λŠ” 이유


μ™œ ,둜 κ΅¬λΆ„ν•΄μ„œ 좜λ ₯ν• κΉŒ?

πŸ”Ή λΉ„μœ : μ „ν™”λ²ˆν˜Έ 좜λ ₯ν•˜κΈ°


2. 번호 좜λ ₯ μ½”λ“œ 뢄석

System.out.printf("μ΅œμ’…μ •λ ¬ : ");
for (int a : lotto)
    System.out.printf(a + ",");

μ„€λͺ…

  1. System.out.printf()둜 κ²°κ³Ό λ¬Έμžμ—΄ 좜λ ₯
    • printf()λŠ” ν˜•μ‹ν™”λœ λ¬Έμžμ—΄μ„ 좜λ ₯ν•©λ‹ˆλ‹€.
    • "μ΅œμ’…μ •λ ¬ : " 뢀뢄은 λ¬Έμžμ—΄ κ·ΈλŒ€λ‘œ 좜λ ₯λ©λ‹ˆλ‹€.
    • 예: μ΅œμ’…μ •λ ¬ :
  2. ν–₯μƒλœ forλ¬Έ μ‚¬μš©ν•˜κΈ°

     for (int a : lotto)
    
    • ν–₯μƒλœ for문은 λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œλ₯Ό ν•˜λ‚˜μ”© κΊΌλ‚΄μ„œ λ°˜λ³΅ν•©λ‹ˆλ‹€.
    • lotto[] 배열에 μžˆλŠ” 6개의 숫자λ₯Ό μ™Όμͺ½λΆ€ν„° μˆœμ„œλŒ€λ‘œ κΊΌλƒ…λ‹ˆλ‹€.
    • aμ—λŠ” ν˜„μž¬ κΊΌλ‚Έ μˆ«μžκ°€ μ €μž₯λ©λ‹ˆλ‹€.
      • 첫 번째 반볡: a = lotto[0]
      • 두 번째 반볡: a = lotto[1]
      • …
      • μ—¬μ„― 번째 반볡: a = lotto[5]
  3. μˆ«μžμ™€ ,λ₯Ό ν•¨κ»˜ 좜λ ₯ν•˜κΈ°

     System.out.printf(a + ",");
    
    • 숫자(a)와 ,λ₯Ό λ¬Έμžμ—΄λ‘œ μ΄μ–΄λΆ™μ—¬μ„œ 좜λ ₯ν•©λ‹ˆλ‹€.
    • 예: 1, 7, 19, 22, 33, 44,
    • λͺ¨λ“  숫자 뒀에 ,κ°€ λΆ™μŒ
      • 예: 1, 7, 19, 22, 33, 44, (λ§ˆμ§€λ§‰μ—λ„ ,κ°€ 있음)
    • λ§ˆμ§€λ§‰ ,λŠ” μ œκ±°ν•˜μ§€ μ•ŠμŒ

μ˜ˆμ‹œ: 좜λ ₯ κ²°κ³Ό

μ΅œμ’…μ •λ ¬ : 1, 7, 19, 22, 33, 44,

3. κ°œμ„ μ : λ§ˆμ§€λ§‰ , μ œκ±°ν•˜κΈ°

문제점


κ°œμ„  방법 1: if문으둜 λ§ˆμ§€λ§‰ , 제거

System.out.printf("μ΅œμ’…μ •λ ¬ : ");
for (int i = 0; i < lotto.length; i++) {
    System.out.printf(lotto[i] + (i < lotto.length - 1 ? "," : ""));
}

κ°œμ„  방법 2: String.join() μ‚¬μš©ν•˜κΈ° (Java 8 이상)

String result = String.join(",", Arrays.stream(lotto)
                                       .mapToObj(String::valueOf)
                                       .toArray(String[]::new));
System.out.printf("μ΅œμ’…μ •λ ¬ : " + result);

4. 기술 λ©΄μ ‘ λŒ€λΉ„ μš”μ•½


πŸ“ ν•œλˆˆμ— λ³΄λŠ” μš”μ•½



βš™οΈ 6단계 λ³Έλ¬Έ: μ„±λŠ₯ μ΅œμ ν™” 및 κ°œμ„ μ 


1. μ„±λŠ₯ μ΅œμ ν™”κ°€ ν•„μš”ν•œ 이유


μ™œ μ„±λŠ₯ μ΅œμ ν™”κ°€ ν•„μš”ν• κΉŒ?

πŸ”Ή λΉ„μœ : 곡 뽑기 톡을 더 효율적으둜 μ„žκΈ°


2. 랜덀 μ…”ν”Œμ˜ 문제점 및 κ°œμ„ μ 

ν˜„μž¬ λ°©μ‹μ˜ 문제점: Swap 방식

for (int i = 0; i < 1000; i++) {
    int f = (int)(Math.random() * 45);
    int t = (int)(Math.random() * 45);
    int tmp = balls[f];
    balls[f] = balls[t];
    balls[t] = tmp;
}

λΉ„νš¨μœ¨μ μΈ 점


κ°œμ„ μ : Fisher-Yates μ•Œκ³ λ¦¬μ¦˜


Fisher-Yates μ•Œκ³ λ¦¬μ¦˜ μ½”λ“œ

for (int i = balls.length - 1; i > 0; i--) {
    int j = (int)(Math.random() * (i + 1));
    int tmp = balls[i];
    balls[i] = balls[j];
    balls[j] = tmp;
}

μ„€λͺ…

  1. λ’€μ—μ„œλΆ€ν„° μ•žμœΌλ‘œ μ΄λ™ν•˜λ©΄μ„œ
    • iλŠ” λ°°μ—΄μ˜ λ§ˆμ§€λ§‰ μΈλ±μŠ€λΆ€ν„° μ•žμͺ½μœΌλ‘œ μ΄λ™ν•©λ‹ˆλ‹€.
    • *ν˜„μž¬ μœ„μΉ˜(i)μ—μ„œ **이전 μœ„μΉ˜ 쀑 ν•˜λ‚˜(j)λ₯Ό λžœλ€ν•˜κ²Œ μ„ νƒν•©λ‹ˆλ‹€.
  2. λžœλ€ν•˜κ²Œ μ„ νƒλœ μœ„μΉ˜μ™€ κ΅ν™˜
    • jλŠ” 0λΆ€ν„° iκΉŒμ§€μ˜ λžœλ€ν•œ μΈλ±μŠ€μž…λ‹ˆλ‹€.
    • balls[i]와 balls[j]의 값을 κ΅ν™˜(Swap) ν•©λ‹ˆλ‹€.
  3. ν•œ 번 μ„ νƒλœ μœ„μΉ˜λŠ” λ‹€μ‹œ μ„ νƒλ˜μ§€ μ•ŠμŒ
    • *ν˜„μž¬ μœ„μΉ˜(i)λŠ” **이전 μœ„μΉ˜ 쀑 ν•˜λ‚˜μ™€ κ΅ν™˜ν•˜κ³ ,
    • λ‹€μŒ λ°˜λ³΅μ—μ„œλŠ” ν˜„μž¬ μœ„μΉ˜(i)κ°€ μ œμ™Έλ©λ‹ˆλ‹€.
    • 쀑볡 없이 λžœλ€ν•˜κ²Œ μ„žμž„

πŸ”Ή λΉ„μœ : μΉ΄λ“œ μ„žκΈ°


Fisher-Yates μ•Œκ³ λ¦¬μ¦˜μ˜ μž₯점


3. μ •λ ¬μ˜ 문제점 및 κ°œμ„ μ 

ν˜„μž¬ λ°©μ‹μ˜ 문제점: 버블 μ •λ ¬

for (int i = 0; i < lotto.length; i++) {
    boolean sortable = true;
    for (int j = 0; j < lotto.length - 1 - i; j++) {
        if (lotto[j] > lotto[j + 1]) {
            int tmp = lotto[j];
            lotto[j] = lotto[j + 1];
            lotto[j + 1] = tmp;
            sortable = false;
        }
    }
    if (sortable) break;
}

κ°œμ„ μ : Arrays.sort() μ‚¬μš©ν•˜κΈ°

Arrays.sort(lotto);

4. 기술 λ©΄μ ‘ λŒ€λΉ„ μš”μ•½


πŸŽ“ 7단계 λ³Έλ¬Έ: 기술 λ©΄μ ‘ λŒ€λΉ„ 포인트 및 총정리


1. 기술 λ©΄μ ‘ λŒ€λΉ„μ˜ μ€‘μš”μ„±


μ™œ 기술 λ©΄μ ‘ λŒ€λΉ„κ°€ ν•„μš”ν• κΉŒ?

πŸ”Ή λΉ„μœ : μš”λ¦¬ λŒ€νšŒ μ°Έκ°€ μ€€λΉ„


2. μ£Όμš” κ°œλ… 및 질문 포인트

1) λ°°μ—΄(Array)와 자료ꡬ쑰


λ©΄μ ‘ 질문 포인트

  1. λ°°μ—΄(Array)의 νŠΉμ§•μ€ λ¬΄μ—‡μΈκ°€μš”?
    • 같은 νƒ€μž…μ˜ λ°μ΄ν„°λ§Œ μ €μž₯ν•  수 있음
    • μΈλ±μŠ€λŠ” 0λΆ€ν„° μ‹œμž‘
    • 크기가 κ³ μ •λ˜μ–΄ 있으며 ν•œ 번 μƒμ„±ν•˜λ©΄ 크기λ₯Ό λ³€κ²½ν•  수 μ—†μŒ
  2. λ°°μ—΄(Array)와 ArrayList의 차이점은 λ¬΄μ—‡μΈκ°€μš”?
    • ArrayλŠ” 크기가 κ³ μ •λ˜κ³  μ΄ˆκΈ°ν™” μ‹œ 크기λ₯Ό μ§€μ •ν•΄μ•Ό 함
    • ArrayListλŠ” 크기가 κ°€λ³€μ μœΌλ‘œ λ™μ μœΌλ‘œ 크기 λ³€κ²½ κ°€λŠ₯
    • ArrayListλŠ” λ‚΄λΆ€μ μœΌλ‘œ 배열을 μ‚¬μš©ν•˜μ§€λ§Œ,
      • μžλ™μœΌλ‘œ 크기가 μ‘°μ •λ˜κ³  λ‹€μ–‘ν•œ λ©”μ„œλ“œλ₯Ό 제곡

2) 랜덀 μ…”ν”Œ(Random Shuffle)κ³Ό 랜덀 μ•Œκ³ λ¦¬μ¦˜


λ©΄μ ‘ 질문 포인트

  1. ν˜„μž¬ λ°©μ‹μ˜ 문제점과 κ°œμ„ μ μ€ λ¬΄μ—‡μΈκ°€μš”?
    • 문제점:
      • λžœλ€ν•œ μœ„μΉ˜λ₯Ό 1000번 Swap β†’ λΆˆν•„μš”ν•œ 연산이 많음
      • μ€‘λ³΅λœ μœ„μΉ˜κ°€ μ—¬λŸ¬ 번 선택될 수 있음
      • μ‹œκ°„ λ³΅μž‘λ„: O(N * 1000) (λΉ„νš¨μœ¨μ )
    • κ°œμ„ μ :
      • Fisher-Yates μ•Œκ³ λ¦¬μ¦˜ μ‚¬μš©
      • 쀑볡 없이 λžœλ€ν•˜κ²Œ μ„žμž„
      • O(N) μ‹œκ°„ λ³΅μž‘λ„λ‘œ ν˜„μž¬ 방식보닀 훨씬 빠름
  2. Fisher-Yates μ•Œκ³ λ¦¬μ¦˜μ˜ μ›λ¦¬λŠ” λ¬΄μ—‡μΈκ°€μš”?
    • λ’€μ—μ„œλΆ€ν„° μ•žμœΌλ‘œ μ΄λ™ν•˜λ©΄μ„œ
    • 이전 μœ„μΉ˜ 쀑 ν•˜λ‚˜λ₯Ό λ¬΄μž‘μœ„λ‘œ μ„ νƒν•˜μ—¬ κ΅ν™˜
    • ν•œ 번 μ„ νƒλœ μœ„μΉ˜λŠ” λ‹€μ‹œ μ„ νƒλ˜μ§€ μ•ŠμŒ
    • 쀑볡 없이 λžœλ€ν•˜κ²Œ μ„žμž„

3) μ •λ ¬(Sorting) μ•Œκ³ λ¦¬μ¦˜


λ©΄μ ‘ 질문 포인트

  1. 버블 μ •λ ¬μ˜ 문제점과 κ°œμ„ μ μ€ λ¬΄μ—‡μΈκ°€μš”?
    • 문제점:
      • O(NΒ²) μ‹œκ°„ λ³΅μž‘λ„
      • 비ꡐ νšŸμˆ˜μ™€ κ΅ν™˜ νšŸμˆ˜κ°€ 많음
      • λ°°μ—΄μ˜ 크기가 컀질수둝 μ„±λŠ₯ μ €ν•˜
    • κ°œμ„ μ :
      • Arrays.sort() λ©”μ„œλ“œ μ‚¬μš©
      • Dual-Pivot Quick Sort μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ O(N log N)
      • λΉ λ₯΄κ³  효율적인 μ •λ ¬
  2. 버블 μ •λ ¬κ³Ό Quick Sort의 차이점은 λ¬΄μ—‡μΈκ°€μš”?
    • 버블 μ •λ ¬(Bubble Sort)
      • μ΄μ›ƒν•œ 숫자끼리 비ꡐ
      • 큰 숫자λ₯Ό 였λ₯Έμͺ½μœΌλ‘œ 이동
      • μ‹œκ°„ λ³΅μž‘λ„: O(NΒ²)
      • κ΅¬ν˜„μ΄ μ‰½μ§€λ§Œ λΉ„νš¨μœ¨μ 
    • Quick Sort (Dual-Pivot Quick Sort)
      • κΈ°μ€€(Pivot)을 μ •ν•˜κ³  쒌우둜 λΆ„ν• 
      • λΆ„ν• ν•œ λΆ€λΆ„ 배열을 μž¬κ·€μ μœΌλ‘œ μ •λ ¬
      • μ‹œκ°„ λ³΅μž‘λ„: O(N log N)
      • λΉ λ₯΄κ³  효율적인 μ •λ ¬

4) μ„±λŠ₯ μ΅œμ ν™” 및 μ‹œκ°„ λ³΅μž‘λ„ 뢄석


λ©΄μ ‘ 질문 포인트

  1. μ‹œκ°„ λ³΅μž‘λ„λž€ λ¬΄μ—‡μΈκ°€μš”?
    • *μž…λ ₯ 크기(N)κ°€ 컀질수둝 **μ—°μ‚° νšŸμˆ˜κ°€ μ¦κ°€ν•˜λŠ” 정도λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • Big-O ν‘œκΈ°λ²•μœΌλ‘œ ν‘œν˜„ν•©λ‹ˆλ‹€.
    • 예: O(N), O(N log N), O(NΒ²), O(NΒ³)
  2. 둜또 번호 생성 μ½”λ“œμ˜ μ‹œκ°„ λ³΅μž‘λ„λ₯Ό μ„€λͺ…ν•΄λ³΄μ„Έμš”.
    • 랜덀 μ…”ν”Œ (Fisher-Yates μ•Œκ³ λ¦¬μ¦˜): O(N)
    • μ •λ ¬ (Arrays.sort()): O(N log N)
    • 전체 μ‹œκ°„ λ³΅μž‘λ„: O(N log N)

5. 기술 λ©΄μ ‘ λŒ€λΉ„ 총정리