백준 15651: N과M(3)

Song-Minhyung·2022년 5월 31일
0

Problem Solving

목록 보기
3/50
post-thumbnail

문제

https://www.acmicpc.net/problem/15651

자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.

  • 1부터 N까지 자연수 중에서 M개를 고른 수열
  • 같은 수를 여러 번 골라도 된다.

문제 풀이

이번에는 N과M(1)에서 같은 수를 여러 번 골라도 된다. 라는 조건이 추가됐다.
같은수를 여러번 출력해도 된다면 if문을 없애도 될것같아서 없앴더니!

  • 11%에서 채점중이라고 10초넘게 멈춰있었는데 불안하다...
  • 내가 불안해하면 꼭 빗나가지 않았다.
    결과는 시간초과!

아무리 다시 생각해봐도 알고리즘이 틀린것같지는 않다.
그러다 전에 시간초과가 나왔던 문제가 생각났는데 console.log 속도로 인한 시간초과였다.

그래서 배열에 추가해서 console.log를 출력하는게 아니라 string 변수안에 결과를 추가했더니
결과는 성공!

//init용
const stdin: string[] = (process.platform ==='linux'
? require('fs').readFileSync(0, 'utf-8')
: `
4 2
`).trim().split('\n');

const input = (()=>{
    let line = 0;
    return ()=> stdin[line++].split(" ").map( v => +v);
})();

const [N, M] = input();
//const result: number[][] = [];
let result = '';

const sol = (arr: number[]) => {
    if (arr.length === M){
      /*
      	문제가 됐던 부분이다.
        result에 arr배열을 push 해주는 대신
        string변수 result에 문자열을 더해주니 
        시간초과는 더이상 뜨지 않았다.
      */
        //result.push(arr);
        result += arr.join(" ");
        result += "\n";
      	
        return;
    }
        
    for (let i=1; i<=N; i++) {
      // 조건을 다 없애버림!
      sol([...arr, i]);
    }
}

sol([]);
//result.map( v=> console.log(v.join(" ")));
console.log(result);

깔끔하게 성공!

profile
기록하는 블로그

0개의 댓글