관리 메뉴

JIE0025

[Softeer][level3] 스마트 물류 - 파이썬(Python) 본문

알고리즘/Softeer

[Softeer][level3] 스마트 물류 - 파이썬(Python)

Kangjieun11 2023. 2. 2. 21:28
728x90

 

https://softeer.ai/practice/info.do?idx=1&eid=414&sw_prbl_sbms_sn=140268 

 

Softeer

연습문제를 담을 Set을 선택해주세요. 취소 확인

softeer.ai

 

 

문제

현대자동차그룹은 주요 물류센터에 각종 자동화 기기를 도입하며 ‘스마트 물류’를 실현하고 있다. 최근에는 자동차 반조립 부품(KD, Knock-Down) 물류기지인 KD센터에 포장 관련 자동화 로봇 개발과 구축을 완료했다. 기존 수작업으로 진행하던 일부 작업 라인을 자동화 기기로 전환해 생산성을 높이기 위한 시도다. 기다란 작업 라인에 로봇과 부품이 아래 그림과 같이 단위 간격으로 놓여 있다. 로봇들의 위치에서 거리가 K 이하인 부품만 잡을 수 있다. 왼쪽 오른쪽은 상관 없다.



위 그림에서 K = 1인 경우를 생각해보자. 이 경우 모든 로봇은 그의 위치 바로 옆에 인접한 부품만 집을 수 있다. 

* 10번 위치에 있는 로봇은 바로 왼쪽 11번 위치에 있는 부품을 집을 수 있다. 이 경우 다음과 같이 최대 5개의 로봇이 부품을 집을 수 있다. 
* 2번 위치에 있는 로봇은 1번 위치에 있는 부품을 집을 수 있다.
* 4번 위치에 있는 로봇은 5번 위치에 있는 부품을 집을 수 있다.
* 6번 위치에 있는 로봇은 7번 위치에 있는 부품을 집을 수 있다.
* 9번 위치에 있는 로봇은 8번 위치에 있는 부품을 집을 수 있다.
* 10번 위치에 있는 로봇은 11번 위치에 있는 부품을 집을 수 있다.
* 12번 위치에 있는 로봇은 집을 수 있는 부품이 없다. 

만약 K = 2라고 한다면 다음과 같이 6개 로봇 모두가 부품을 집을 수 있다.

* 2번 위치에 있는 로봇은 1번 위치에 있는 부품을 집을 수 있다.
* 4번 위치에 있는 로봇은 3번 위치에 있는 부품을 집을 수 있다.
* 6번 위치에 있는 로봇은 5번 위치에 있는 부품을 집을 수 있다.
* 9번 위치에 있는 로봇은 7번 위치에 있는 부품을 집을 수 있다.
* 10번 위치에 있는 로봇은 8번 위치에 있는 부품을 집을 수 있다.
* 12번 위치에 있는 로봇은 11번 위치에 있는 부품을 집을 수 있다. 

라인의 길이 N, 부품을 집을

수 있는 거리 K, 그리고 로봇과 부품의 위치가 주어졌을 때 부품을 집을 수 있는 로봇의 최대 수를 구하는 프로그램을 작성하라.

 

 

 


 

💡 사고과정

  • N은 20000보다 작고, K는 10보다 작기 떄문에 완전탐색을 해도 괜찮다고 판단했다.
  • for i in range(n)
       for j in range(i-k,  i+k+1)   
       >> 인덱스 i 기준으로 양옆으로 체크할 수 있으므로, i-k부터 i+k+1까지 범위를 지정했다.
  • 처리했는지 여부를 check = False배열로 만들어서 처리된 부품(H)의 위치는 True로 변경해주었다. 
  •  

 

 

 

 

 

 

 

 

 

💻 내가 쓴 정답코드

출력문을 주석을 뺴고 체크하면, 그림으로 그린 테스트 케이스와 정확하게 일치하는것을 확인 할 수 있다. 

 

 

  1. line[i] == 'P' 로봇이면 -- 반복문 돌린다. 
  2. i == j이거나 (로봇 자기 자신의 위치는 볼 필요 없고), j가 영역 밖 (양옆으로 체크해야하는데 로봇인덱스가 0인경우는 왼쪽을 볼 필요가 없으므로)이면 continue처리했다.
  3. 만약 인덱스 j 위치에 부품(H)이 존재하고 , 아직 처리되지 않은 부품이면 check[j] = True로 바꿔준다.  -- for 문이 왼쪽부터 체크하므로 가장 가까운 부품이 처리될것이다.
  4. 마지막에 True의 개수를 출력하면 정답이다!
import sys

input = sys.stdin.readline 
n, k = map(int,input().split())
line = list(str(input()))

check = [False] * n

#print(check)
#print(line)


for i in range(0, n):
    if line[i] == 'P': #로봇이면 
        #print("now: ", i)
        for j in range(i-k, i+k+1):
            if (i==j) or (0>j) or (j>=n) : continue
            if line[j] == 'H' and not check[j]: #가장 가까운 부품을 찾는다 (완전탐색)
                check[j] = True
                #print(j)
                break
#print(check)

count = 0
for result in check:
    if result == True:
        count+=1

print(count)