• Feed
  • Explore
  • Ranking
/
/
    Java baekjoon

    랜덤 값 생성 (백준 33701)

    백준 랜덤값 생성
    Javabaekjoonrandom
    k
    kimyega
    2025.05.05
    ·
    5 min read

    ✍ 백준 26575 번 새천년관

    5846

    조건에 맞는 이름을 랜덤으로 생성해주는 문제이다.

    랜덤함수가 있다는것은 알았지만, 랜덤에 대해 자세히는 몰랐기 때문에 랜덤함수에 대해 알아보기로 하였다.

    📌 랜덤 값 생성

    1. java.util.Random 클래스

    먼저, 주요 메서드들은 이와 같다.

    import java.util.Random;
    
    Random rand = new Random();
    
    // 0 이상 10 미만의 정수 (0~9)
    int n = rand.nextInt(10);
    
    // int 범위내의 무작위 정수
    int m = rand.nextInt()
    
    // long 범위내의 무작위 정수
    int l = rand.nextLong()
    
    // true 또는 false 무작위
    boolean b = rand.nextBoolean();
    
    // 0.0 이상 1.0 미만의 double
    double d = rand.nextDouble();
    
    // 배열에 무작위 바이트 생성
    byte[] bytes = new byte[5];
    rand.nextBytes(bytes)
    

    이 랜덤 클래스가 만든 난수들은 사실 완전한 무작위가 아니라 어떤 규칙적인 계산을 통해 만들어진 값인데, 이 계산의 시작점을 시드 (Seed) 라고 한다.

    Random rand1 = new Random();       // 자동 시드
    Random rand2 = new Random(12345);  // 지정 시드
    
    Random r1 = new Random(123);
    Random r2 = new Random(123);
    
    System.out.println(r1.nextInt(100)); // 20
    System.out.println(r1.nextInt(100)); // 32 
    
    System.out.println(r2.nextInt(100)); // 20 
    System.out.println(r2.nextInt(100)); // 32 시드값이 같아서 같은 결과가 나온다.
    • Random() 은 현재 시간을 기반으로 자동생성된다.

    • 시드를 이용하는 경우 같은 값이 생성되기 때문에, 디버깅등의 테스트에 유용하다.

    2. Math.Random() 메서드

    double r = Math.random(); // 0.0 이상 1.0 미만의 double 반환
    
    // 0 이상 9 이하의 정수 만들기
    int n = (int)(Math.random() * 10);
    
    // 5~15 사이 정수 만들기
    int min = 5;
    int max = 15;
    int randRange = (int)(Math.random() * (max - min + 1)) + min;
    
    // 1.5 ~ 3.5 사이 실수 만들기
    double min = 1.5;
    double max = 3.5;
    double randDouble = Math.random() * (max - min) + min;
    
    • Math.random() 메서드는 가장 간단하게 난수를 생성할 수 있는 메서드이다.

    • 0.0 ~ 1.0 사이의 실수만 주기 때문에, 우리가 원하는 범위로 바꿔줘야 한다.

    3. 랜덤 활용 해보기

    랜덤은 난수값이 숫자이기 때문에 랜덤 문자열은 인덱스로 접근해야 한다.

    int length = 10; // 문자열 길이
    String chars = "abcdefghijklmnopqrstuvwxyz";
    StringBuilder sb = new StringBuilder();
    
    Random rand = new Random();
    
    // 랜덤 인덱스 생성
    int index1 = rand.nextInt(chars.length()); // Random 클래스
    int index2 = (int)(Math.random() * chars.length()); // Math.random() 메서드
    
    for (int i = 0; i < length; i++) {
        sb.append(chars.charAt(index1)); // 랜덤 문자 생성
    }
    
    System.out.println(sb.toString());  //  랜덤 문자열 생성
    

    다음은 Random 클래스를 활용해 해결해본 코드이다.

    import java.io.*;
    import java.util.Random;
    
    public class Main{
      public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    
        Random random = new Random();
        String allChars = "abcdefghijklmnopqrstuvwxyz";
        String suffix = "gwan";
    
        while (true) {
    
          int totalLength = random.nextInt(45) + 5; // 총 길이 : 5~49 + gwan = 최대 50
          int bodyLength = totalLength - suffix.length(); // gwan 제외한 앞부분 길이
    
          StringBuilder sb = new StringBuilder();
          sb.append('n'); // 첫 글자
    
          boolean hasK = false;
          boolean hasU = false;
    
          for (int i = 1; i < bodyLength - 1; i++) {
            char c = allChars.charAt(random.nextInt(allChars.length())); // 랜덤 글자 생성
    
            if (c == 'k') hasK = true;
            if (c == 'u') hasU = true;
    
            sb.append(c);
          }
    
          sb.append('n'); // 마지막 글자 == 첫 글자
    
    
          if (!hasK || !hasU) continue; // k와 u 없으면 다시 만들기
    
          sb.append(suffix); // gwan 붙이기
    
          String result = sb.toString();
          bw.write(result);
          break;
        }
    
        bw.flush();
        bw.close();
      }
    }

    📚마무리

    • 랜덤 생성은 Random, Math.random() 이 있다.

    • Random 클래스의 시드는 같은 값이 생성되기 때문에 테스트에 유용하다.

    • 문자열의 랜덤생성의 경우 인덱스의 랜덤값으로 접근한다.







    - 컬렉션 아티클