준영이의 성장일기(FrontEnd)

백준 js, Python - N과M(5) 본문

코테 및 알고리즘

백준 js, Python - N과M(5)

Jay_Jung 2024. 9. 26. 11:55

 

백 트래킹 알고리즘 카테고리에서 N과 M 시리즈 문제를 풀고있다. 대표적인 백 트래킹 문제로 (1)~(5)까지 풀어보면서 감을 익히고 있다. 

 

Js와 Python 두 가지 언어를 이용하여 문제를 풀어보고 있는데 두 언어가 문법이 비슷해서 그런지 파이썬을 시작한지 얼마 되지 않았지만 금방 익숙해진것 같다 ㅎㅎ.. 하지만 아직 멀었다 생각하고 푸는 양을 일단 늘려보자

 

<문제>

 

<문제 핵심>

 

1.  위에서 말했듯이 백트래킹을 사용해야 하는 문제! 자바스크립트, 파이썬 기반으로 문제를 풀 때 공통적인 부분이 존재한다. 일단 재귀를 탈출하기 위한 조건문이 존재하고 반복문을 통해 해당 요소에 방문했는지를 판단하게 된다. 방문을 안했다면 seq 배열과 result 배열에 방문을 안한 요소를 넣어준다.

 

차이점으로 파이썬 기반으로 문제를 풀 때는 visitied 배열을 만들지 않았다. result 배열에서 array 배열의 요소가 없다면 이는 곧 방문을 안한 것을 의미하므로 없을 경우 result배열에 append 해주는 방법으로 구현했다.(밑에 첨부된 코드 참고)

 

 

2. 입력값의 두번째 줄을 보면 4 5 2 처럼 정렬이 안 되어있는 것을 볼수있다. 출력값을 볼 때 정렬을 기반으로 백 트래킹이 적용되기에 먼저 오름차순 정렬을 해줘야 한다.

 

결론적으로 자바스크립트 에서는 sort() , 파이썬에서는 sorted()를 적용하였다.

 

 

 

오름차순 정렬 확인

 

 

<전체 코드 - Js>

const input = require("fs")
  .readFileSync(process.platform === "linux" ? "./dev/stdin" : "./input.txt")
  .toString()
  .trim()
  .split("\n");

const [N, M] = input.shift().split(" ").map(Number);
const array = input[0]
  .split(" ")
  .map(Number)
  .sort((a, b) => a - b);
let result = "";

function solution(n, m) {
  const seq = [...Array(m)].fill(0); //[0]
  const visited = [...Array(n)].fill(false); //[false, false, false, false]
  const dfs = (k, start) => {
    if (k === m) {
      const arr = [];
      for (let i = 0; i < m; i++) {
        arr.push(seq[i]);
      }
      return (result += `${arr.join(" ")}\n`);
    }

    for (let i = 0; i < array.length; i++) {
      if (!visited[i]) {
        seq[k] = array[i];
        visited[i] = true;
        dfs(k + 1, array[i + 1]);
        visited[i] = false;
      }
    }
  };

  dfs(0, array[0]); //0부터 호출해야함
  return result;
}

console.log(solution(N, M));

 

<전체 코드 - Python>

def solve(N, K, array):
  
    result = []

    def dfs():
        if(len(result) == K) :
            print(' '.join(map(str, result)))
            return
        
        for i in range(N):#result에 array의 요소가 없다면 넣어라
            if array[i] not in result:
                result.append(array[i])
                dfs()
                result.pop()

    dfs()

# 메인 함수
if __name__ == "__main__":
    N, K = map(int, input().split())
    array = sorted(list(map(int, input().split())))
    
    solve(N, K, array)

 

 

확실히 유형별로 계속 푸니까 공통적으로 사용되는 코드 형태를 발견할 수 있었다. 물론 아직 어렵지만 계속 유형별로 풀어보면서 부족한 부분을 보완해야겠다.

 

<알고리즘 공부 레포지토리>

https://github.com/Jayjunyoung/JS_Python_Algorithm

 

GitHub - Jayjunyoung/JS_Python_Algorithm

Contribute to Jayjunyoung/JS_Python_Algorithm development by creating an account on GitHub.

github.com

 

'코테 및 알고리즘' 카테고리의 다른 글

백준 1926번 - js/Python  (1) 2024.09.29
백준 5972번 - js  (0) 2024.09.28
프로그래머스 - 퍼즐 게임 챌린지  (0) 2024.09.24
프로그래머스 - 과제 진행하기  (0) 2024.09.20
백준 js 1063번  (2) 2024.09.18