Baekjoon algorithm training

[백준] 1436 (영화감독 숌)

interfacer_han 2023. 11. 3. 15:07

#1 알고리즘

1번 if문과 2번 if문을 병렬로 두는 코드보다, 2번 if문을 1번 if문 안에 넣는 코드가 더 빠르다. 왜냐하면, contains666Count가 갱신되지 않았다면, targetCount와 비교한 결과 또한 갱신되지 않을 것이기 때문이다. contains666Count가 변해야, 2번 if문에 의미가 생긴다.

 

#2 코드

#2-1 자바

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int targetCount = sc.nextInt();
        sc.close();
        
        int contains666Count = 0;
        
        // 범위 1 ~ 6660000에는 "666 패턴"을 만족하는 자연수 N이, 적어도 1만개 이상 있을 것이다
        for(int i = 1; i <= 6660000; i++) {
            if(Integer.toString(i).contains("666")) {
                contains666Count++;
                
                if(contains666Count == targetCount) {
                    System.out.println(Integer.toString(i));
                    return;
                }
            }
        }
    }
}

 

#2-2 코틀린

fun main() {
    val targetCount = readLine()!!.trim().toInt()
    
    var contains666Count = 0
    
    // 범위 1 ~ 6660000에는 "666 패턴"을 만족하는 자연수 N이, 적어도 1만개 이상 있을 것이다
    for(i : Int in 1..6660000) {
        if(i.toString().contains("666")) {
            contains666Count++
            
            if(contains666Count == targetCount) {
                println(i.toString())
                return
            }
        }
    }
}

 

#3 실패한 코드 - 시간 초과 - 자바

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int targetCount = sc.nextInt();
        sc.close();
        
        int contains666Count = 0;
        
        // 범위 1 ~ 6660000에는 "666 패턴"을 만족하는 자연수 N이, 적어도 1만개 이상 있을 것이다
        for(int i = 1; i <= 6660000; i++) {
        	System.out.println("now: " + Integer.toString(i));
        	
            if(isContains666(i)) {
                contains666Count++;
                
                if(contains666Count == targetCount) {
                    System.out.println(Integer.toString(i));
                    return;
                }
            }
        }
    }
    
    public static boolean isContains666(int parameterNumber) { 
        int[] digits = makeToIntArray(parameterNumber);
        int n = digits.length;
         
        if(n < 3) {
            return false;    
        }
        
        for(int i  = 0; i <= n - 3; n++) {
            if((digits[i] == 6) && (digits[i+1] == 6) && (digits[i+2] == 6)) {
                return true;       
            }
        }
        
        return false;
    }
    
    public static int[] makeToIntArray(int parameterNumber) {
        String baseString = Integer.toString(parameterNumber);
        int[] digits = new int[baseString.length()];
        
        for(int i = 0; i < baseString.length(); i++) {
            digits[i] = Character.getNumericValue(baseString.charAt(i)) ;
        }
        
        return digits;
        
    }
}

1436번 문제는 String 클래스의 메소드 contains() 하나로 너무 쉽게 풀리는 문제다. 그래서 contains()를 쓰지 않고 내가 직접 하나하나 비교해보고 싶었다. 하지만, 속도가 너무 느렸다.

'Baekjoon algorithm training' 카테고리의 다른 글

[백준] 1978 (소수 찾기)  (0) 2023.11.08
[백준] 1654 (랜선 자르기)  (0) 2023.11.04
[백준] 1157 (단어 공부)  (0) 2023.10.31
[백준] 1181 (단어 정렬)  (0) 2023.10.28
[백준] 1018 (체스판 다시 칠하기)  (0) 2023.10.27