코테 노트/프로그래머스

Level 3 외벽 점검 <2020 KAKAO BLIND RECRUITMENT> Python 3

화요밍 2022. 4. 7. 22:43
728x90
반응형

https://programmers.co.kr/learn/courses/30/lessons/60062?language=python3# 

 

코딩테스트 연습 - 외벽 점검

레스토랑을 운영하고 있는 "스카피"는 레스토랑 내부가 너무 낡아 친구들과 함께 직접 리모델링 하기로 했습니다. 레스토랑이 있는 곳은 스노우타운으로 매우 추운 지역이어서 내부 공사를 하

programmers.co.kr

 

최종 코드

 

GitHub - hwayeon351/Programmers-Algorithms: 프로그래머스 알고리즘 소스 코드 모음

프로그래머스 알고리즘 소스 코드 모음. Contribute to hwayeon351/Programmers-Algorithms development by creating an account on GitHub.

github.com

from itertools import permutations

def solution(n, weak, dist):
    answer = -1
    permu = list(set(permutations(dist, len(dist))))

    for i in range(len(weak)):
        for per in permu:
            visit = [0] * len(weak)
            check = 0
            friend = 0
            loc = i
            for f in per:
                friend += 1
                check += 1
                visit[loc] = 1
                new_loc = weak[loc] + f
                
                if new_loc >= n:
                    for j in range(len(weak)):
                        if not visit[j]:
                            if weak[loc] < weak[j] < n or 0 <= weak[j] <= new_loc - n:
                                visit[j] = 1
                                check += 1
                    if new_loc - n == weak[i] or check == len(weak): break
                    
                else:
                    for j in range(len(weak)):
                        if not visit[j]:
                            if weak[loc] < weak[j] <= new_loc:
                                visit[j] = 1
                                check += 1
                    if new_loc == weak[i] or check == len(weak): break
                    
                loc += 1
                if loc == len(weak): loc = 0
                while visit[loc]:
                    loc += 1
                    if loc == len(weak): loc = 0

            if check == len(weak):
                if answer == -1 or answer > friend: answer = friend

    return answer

풀이 과정

 

 

from itertools import permutations

def solution(n, weak, dist):
    answer = -1
    
    #외벽 점검을 갈 친구들 순서 구하기
    permu = list(set(permutations(dist, len(dist))))

	#weak[i]를 시작점으로 외벽 점검 시작
    for i in range(len(weak)):
    	#모든 경우의 수에 대하여 순서에 맞게 친구들이 외벽을 점검한다
        for per in permu:
        	#visit[i] = i번째 외벽 점검 완료이면 True, 아니면 False
            visit = [0] * len(weak)
            #점검한 외벽 수
            check = 0
            #외벽 점검을 나간 친구 수
            friend = 0
            #현재 점검해야 하는 외벽의 인덱스
            loc = i
            
            #한 명씩 순서대로 외벽을 점검한다
            for f in per:
            	#외벽 점검을 나간 친구 수 증가
                friend += 1
                #loc번 째 외벽을 점검한다
                check += 1
                visit[loc] = 1
                #현재 점검 중인 친구가 점검을 끝낸 지점
                new_loc = weak[loc] + f
                
                #new_loc이 n보다 큰 경우,
                if new_loc >= n:
                	#현재 친구가 점검한 외벽을 카운팅 한다
                    for j in range(len(weak)):
                    	#현재 친구가 이동한 거리 내에 점검하지 않은 외벽인 경우, 점검 처리한다
                        if not visit[j]:
                            if weak[loc] < weak[j] < n or 0 <= weak[j] <= new_loc - n:
                                visit[j] = 1
                                check += 1
                    
                    #외벽 둘레를 모두 점검한 경우이거나, 모든 점검할 외벽을 다 점검한 경우, 반복문을 벗어난다
                    if new_loc - n == weak[i] or check == len(weak): break
                
                #new_loc이 n보다 작은 경우,
                else:
                	#현재 친구가 점검한 외벽을 카운팅 한다
                    for j in range(len(weak)):
                    	#현재 친구가 이동한 거리 내에 점검하지 않은 외벽인 경우, 점검 처리한다
                        if not visit[j]:
                            if weak[loc] < weak[j] <= new_loc:
                                visit[j] = 1
                                check += 1
                    
                    #외벽 둘레를 모두 점검한 경우이거나, 모든 점검할 외벽을 다 점검한 경우, 반복문을 벗어난다
                    if new_loc == weak[i] or check == len(weak): break
                
                
                #다음 친구가 점검을 시작해야하는 외벽 인덱스를 구한다
                loc += 1
                if loc == len(weak): loc = 0
                while visit[loc]:
                    loc += 1
                    if loc == len(weak): loc = 0
			
            
            #모든 점검해야할 외벽을 다 점검한 경우, answer을 갱신한다
            if check == len(weak):
                if answer == -1 or answer > friend: answer = friend

    return answer

참고

 

Level 3 기둥과 보 설치 <2020 KAKAO BLIND RECRUITMENT> Python 3

https://programmers.co.kr/learn/courses/30/lessons/60061?language=python3 코딩테스트 연습 - 기둥과 보 설치 5 [[1,0,0,1],[1,1,1,1],[2,1,0,1],[2,2,1,1],[5,0,0,1],[5,1,0,1],[4,2,1,1],[3,2,1,1]] [[1,0,0..

hwayomingdlog.tistory.com

  • 7. 블록 이동하기 -> 

 

728x90
반응형