[프로그래머스 | 파이썬 / 자바스크립트] 피로도(완전탐색/ level 2)

2023. 2. 25. 20:36·Problem Solving/프로그래머스
문제

https://school.programmers.co.kr/learn/courses/30/lessons/87946

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

🐍파이썬
from itertools import permutations 
def solution(k, dungeons):
    result = []
    #던전을 방문하는 순서의 경우의 수를 나열
    for dg in permutations(dungeons, len(dungeons)):	
        nk = k	#매번 k로 피로도 리셋
        answer = 0	#방문한 던전 수 매번 리셋
        for d in dg:	#각 경우의 수마다 방문할 수 있는 던전 수 확인
            if nk >= d[0]:	#남은 피로도가 던전의 필요피로도보다 같거나 큰 경우 던전 방문
                nk -= d[1]	#남은 피로도-소모 피로도
                answer += 1 	#방문한 던전 수 + 1
        result.append(answer)
    return max(result)	#방문 가능한 최대 던전의 수

❓ 순열

itertools.permutations(iterable, r=None)

  • itertools 모듈
  • 서로 다른 n개 원소 중 r개를 순서를 고려해 나열하는 경우의 수
  • 위 코드의 경우 순열은 아래와 같다.
...
def solution(k, dungeons):
    result = []
    for dg in permutations(dungeons, len(dungeons)):
        print(dg)
        # dungeons = [[80,20],[50,40],[30,10]]일때
        # 순열의 결과
        # ([80, 20], [50, 40], [30, 10])
        # ([80, 20], [30, 10], [50, 40])
        # ([50, 40], [80, 20], [30, 10])
        # ([50, 40], [30, 10], [80, 20])
        # ([30, 10], [80, 20], [50, 40])
        # ([30, 10], [50, 40], [80, 20])
        nk = k
       ...

 

 

다른 풀이 방법

answer = 0
N = 0
visited = []

def dfs(k, cnt, dungeons):
    global answer
    if cnt > answer:	#방문가능한 던전의 갯수(cnt)가 answer보다 더 크다면 리턴할 최대 던전의 갯수를 cnt개로 설정 
        answer = cnt
    for j in range(N):
        if k >= dungeons[j][0] and not visited[j]:	#현재 피로도로 방문할 수 있는 던전이면서 방문하지 않은 던전인 경우
            visited[j] = 1	#방문처리
            dfs(k - dungeons[j][1], cnt + 1, dungeons)	#dfs(현재피로도 업데이트, 방문횟수 체크, 던전배열)
            visited[j] = 0	#dfs의 리프노드까지 모두 탐색 후 이전 노드로 돌아왔을 경우, 해당 노드 visited값을 0으로 복구

def solution(k, dungeons):
    global N, visited
    N = len(dungeons)
    visited = [0] * N
    dfs(k, 0, dungeons)	#방문한 던전갯수 0개
    return answer

DFS를 이용한 풀이

 

 

🐥자바스크립트
let answer = 0
let cnt = 0
let visited;

function DFS(k, cnt, dungeons){
    // 방문가능한 던전의 갯수(cnt)가 answer보다 더 크다면 리턴할 최대 던전의 갯수를 cnt개로 설정 
    if(cnt > answer){
        answer = cnt;
    }
    for(let i = 0; i < dungeons.length; i++){
        // 현재 피로도로 방문할 수 있는 던전이면서 방문하지 않은 던전인 경우
        if(k >= dungeons[i][0] && visited[i] == 0){
            visited[i] = 1;	// 방문처리
            DFS(k - dungeons[i][1], cnt+1, dungeons);	// DFS(현재피로도 업데이트, 방문횟수 체크, 던전배열)
            visited[i] = 0;	// DFS의 리프노드까지 모두 탐색 후 이전 노드로 돌아왔을 경우, 해당 노드 visited값을 0으로 복구
        }
    }
}

function solution(k, dungeons) {
    (visited = []).length = dungeons.length;	
    visited.fill(0);	//배열 선언. new Array(N).fill(0)보다 속도가 빠르다고 함
    DFS(k, 0, dungeons);	//방문한 던전갯수 0개
    return answer;
}

위 파이썬 DFS와 동일한 로직으로 풀었다.

 

 

참고

자바스크립트 블록 스코프

https://poiemaweb.com/es6-block-scope

 

let, const | PoiemaWeb

ES5까지 변수를 선언할 수 있는 유일한 방법은 var 키워드를 사용하는 것이었다. var 키워드로 선언된 변수는 아래와 같은 특징이 있다. 이는 다른 언어와는 다른 특징으로 주의를 기울이지 않으면

poiemaweb.com

 

자바스크립트 배열 선언

https://miiingo.tistory.com/272

 

[Node.js] Javascript: 지정한 길이에 맞게 배열을 선언하고 값을 초기화하는 방법들

배열 선언 및 초기화 방법 길이가 N인 배열 arr을 선언하면서 동시에 값을 초기화하고 싶은 경우 CASE 1: for문 이용 const N = 5; // 길이 N을 5라고 가정 let arr = []; for(let i=0; i

miiingo.tistory.com

 

DFS

https://han-py.tistory.com/242

 

[코딩테스트] 쉽게 이해하고 바로 쓰는 DFS (깊이 우선 탐색)

DFS (깊이 우선 탐색) DFS 깊이 우선 탐색은 코딩테스트에서 기본적으로 알아야한다. DFS란 말 그대로 깊이를 우선적으로 탐색하는 방법이다. 좀 더 쉽게 말하면, 갈림길이 있다면 한방향으로 끝까

han-py.tistory.com

 

저작자표시 비영리 변경금지 (새창열림)

'Problem Solving > 프로그래머스' 카테고리의 다른 글

[프로그래머스 | 파이썬 / 자바스크립트] 이진수 더하기(코딩테스트 입문/ level 0)  (0) 2023.02.28
[프로그래머스 | 파이썬 / 자바스크립트] 유한소수 판별하기(코딩테스트 입문/ level 0)  (0) 2023.02.25
[프로그래머스 | 파이썬 / 자바스크립트] 대문자와 소문자(코딩테스트 입문/ level 0)  (0) 2023.02.25
[프로그래머스 | 파이썬 / 자바스크립트] 다항식 더하기(코딩테스트 입문/ level 0)  (0) 2023.02.24
[프로그래머스 | 파이썬 / 자바스크립트] 배열 회전시키기(코딩테스트 입문/ level 0)  (0) 2023.02.24
[프로그래머스 | 파이썬 / 자바스크립트] 소인수분해(코딩테스트 입문/ level 0)  (0) 2023.02.24
'Problem Solving/프로그래머스' 카테고리의 다른 글
  • [프로그래머스 | 파이썬 / 자바스크립트] 유한소수 판별하기(코딩테스트 입문/ level 0)
  • [프로그래머스 | 파이썬 / 자바스크립트] 대문자와 소문자(코딩테스트 입문/ level 0)
  • [프로그래머스 | 파이썬 / 자바스크립트] 다항식 더하기(코딩테스트 입문/ level 0)
  • [프로그래머스 | 파이썬 / 자바스크립트] 배열 회전시키기(코딩테스트 입문/ level 0)
청량리 물냉면
청량리 물냉면
프로그래밍 공부를 하고 있습니다. 공부 내용 정리 겸 정보 공유를 목적으로 합니다.
  • 청량리 물냉면
    노력중인 블로그
    청량리 물냉면
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 프로그래밍
        • Programming
        • C | C++
        • Java
        • Python
      • 웹 프로그래밍
        • HTML | CSS
        • JavaScript | TypeScript
        • React
        • Vue.js
        • Next.js
        • Spring & Spring Boot
        • JSP & Servlet
        • DB
      • 웹 프로젝트
        • 웹 프로젝트
        • 🥨스낵몰
        • 👨‍👨‍👧‍👧소셜 가계부
        • 🌜꿈 일기장
        • 🔮포트폴리오 사이트
        • 🏃‍♂️팀 프로젝트: 일정관리 프로그램
        • 📈팀 프로젝트: AI기반 주식 분석 플랫폼
        • 😺Just Meow It: 고양이의 조언
      • 앱 프로그래밍
        • Flutter
        • Kotlin
      • Problem Solving
        • 백준
        • 프로그래머스
        • SWEA
      • Computer Science
        • 알고리즘
        • 컴퓨터 네트워크
        • 이산수학
      • Developer
        • 후기
        • 자료정리
        • 취업 | 취준
        • 웹개발 교육 프로그램
        • TIL
  • 블로그 메뉴

    • 홈
    • Github
  • 공지사항

    • 프로그래밍 공부 중😊
  • 인기 글

  • 태그

    컴퓨터네트워크
    파이썬
    뉴렉처
    클론 프로젝트
    리액트
    타입스크립트
    ZeroCho
    플러터
    Jiraynor Programming
    공식문서
    구현
    강의내용정리
    포트폴리오
    d3
    알고리즘
    백준
    프로젝트
    웹사이트
    mysql
    Next.js
    자바스크립트
    블로그 제작
    bfs
    SWEA
    프로그래머스
    AWS
    React
    Til
    자바
    spring boot
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
청량리 물냉면
[프로그래머스 | 파이썬 / 자바스크립트] 피로도(완전탐색/ level 2)
상단으로

티스토리툴바