[백준] 4와 7 (구현+수학)

2025. 6. 22. 03:40·Algorithm/Coding Test Records

문제 소개

4와 7 - 백준 2877번 문제를 정리합니다.
이 문제는 4와 7로만 이루어진 수 중 K번째 작은 수를 출력하는 이진 + 수학적 규칙 문제입니다.

문제 링크: 4와 7 - 백준 2877번


문제 접근 방식

이 문제는 다음과 같은 방식으로 접근했습니다:

  1. 4와 7로만 이루어진 수는 2진수처럼 구성 → 자리수 N이면 2ⁿ개의 수 생성 가능
  2. 자리수마다 몇 개의 수가 있는지 누적합을 구해 K번째 수의 자리수를 결정
  3. 해당 자리수 내에서의 인덱스를 2진수로 변환 후 → '0'을 4, '1'을 7로 치환

해결 과정 및 코드

핵심 아이디어

  1. 4, 7, 44, 47, 74, 77 … 이런 식으로 4와 7로만 이루어진 모든 수는 자리수가 증가할수록 2진수처럼 구성됨
4, 7 / 44, 47, 74, 77 / 444, 447, 474, 477, 744
0, 1 / 00, 01, 10, 11 / 000, 001, 010, 011, 100 
  1. 자리수 N이면 2ⁿ개의 수 생성 가능 → K가 어느 자리수의 수에 속하는지 먼저 계산
  2. 자리수 확정 후 그 자리수에서 몇 번째인지 계산 → 해당 인덱스를 2진수로 변환
  3. 2진수의 각 자리를 '0' → '4', '1' → '7'로 치환하여 최종 결과 생성

코드

시간 복잡도 : O(logK)
: 반복문이 length를 기준으로 조건 설정됨 length는 최대 log₂K까지 증가할 수 있기에 자리수 판별 과정의 시간복잡도는 O(logK)

import java.io.*;

public class Main {
	public static void main(String[] args) throws Exception {
		int K = read();  // 입력값 K
		System.out.println(findKthLuckyNumber(K));  // 결과 출력
	}

	public static String findKthLuckyNumber(long K) {
		int length = 1;
		long count = 0;

		// Step 1: 자리수 결정
		while (true) {
			long numAtLength = 1L << length; // 2^length
			if (count + numAtLength >= K) break;
			count += numAtLength;
			length++;
		}
		
		// 4, 7 / 44, 47, 74, 77 / 444, 447, 474, 477, 744
		// 0, 1 / 00, 01, 10, 11 / 000, 001, 010, 011, 100 
		// Step 2: 해당 자리수에서 몇 번째인지 (0-based index)
		long idx = K - count - 1;

		// Step 3: 2진수로 변환 후 자릿수 맞추기 (앞에 0 채움)
		StringBuilder binary = new StringBuilder(Long.toBinaryString(idx));
		while (binary.length() < length) {
			binary.insert(0, '0');
		}

		// Step 4: 0 -> 4, 1 -> 7로 매핑
		StringBuilder result = new StringBuilder();
		for (int i = 0; i < binary.length(); i++) {
			result.append(binary.charAt(i) == '0' ? '4' : '7');
		}

		return result.toString();
	}

	// 빠른 입력 처리
	public static int read() throws Exception {
		int n = System.in.read() & 15, cur;
		while ((cur = System.in.read()) > 32) {
			n = (n << 3) + (n << 1) + (cur & 15);
		}
		return n;
	}
}

'Algorithm > Coding Test Records' 카테고리의 다른 글

[백준] 아기 상어 (시뮬레이션)  (1) 2025.06.24
[백준] 가르침 (비트마스킹)  (0) 2025.06.23
[프로그래머스] 단속 카메라 (그리디)  (1) 2025.06.21
[프로그래머스] 섬 연결하기 (Kruskal)  (0) 2025.06.20
[프로그래머스] 조이스틱 (그리디)  (0) 2025.06.19
'Algorithm/Coding Test Records' 카테고리의 다른 글
  • [백준] 아기 상어 (시뮬레이션)
  • [백준] 가르침 (비트마스킹)
  • [프로그래머스] 단속 카메라 (그리디)
  • [프로그래머스] 섬 연결하기 (Kruskal)
Celion
Celion
오늘도 평소처럼 화이팅!
  • Celion
    Orion Log
    Celion
  • 전체
    오늘
    어제
    • 전체 글 (144)
      • Uncompiled Thoughts (8)
        • 네이버 부스트캠프 10기 (5)
      • CS 기초부터 한 걸음씩 (34)
      • Code Odyssey (22)
      • Algorithm (77)
        • Coding Test Records (63)
      • Git (3)
      • reference (0)
  • 블로그 메뉴

    • 태그
    • 방명록
  • 태그

    Kotlin
    알고리즘고득점kit
    Level2
    코테
    프로그래머스
    java
    greedy
    boostcamp
    Level3
    시뮬레이션
    백준
    문법정리
  • 최근 글

  • 인기 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.4
Celion
[백준] 4와 7 (구현+수학)
상단으로

티스토리툴바