본문 바로가기

Dev. Etc/Algorithm

[알고리즘] JAVA독과 함께! - python

 

Q. 첫 문제를 푼 라이캣은 자신의 한계가 어디인지 궁금했어요. 그렇지만 높은 곳은 혼자 갈 수 없죠. 그래서 동료를 모으기로 결심했습니다.

하지만 선뜻 멀고 험한길을 듣보잡 라이캣과 함께 해줄 친구들은 없었답니다.

라이캣은 랩처럼 대사를 외우고 다녔어요.

내 동료가 되어라냥!
  • 뭐지? 명령문인가?
  • '냥'이라니, 자연어처리가 힘들겠는걸?
  • 동료는 sum인가, concat인가? axis 0인가, 1인가?

동물 친구들은 수근거렸습니다. 혼자 코딩하기 좋아하는 동물 친구들은 동료라는 말도 이해하지 못했어요.

 


그러던 중 동물 친구들 중에서 가장 재빠르고, 영리한 JAVA독이 말했습니다.

사실 자바독은 늘 Python을 해보고 싶었거든요.

그래서 라이캣이 파이와 썬의 보물을 찾으러 가는 도구로 파이썬을 사용한다고 하였을 때 눈여겨 보고 있었어요.

내가 동료되길 원해? 그렇다면 검증필!?

라이캣은 거절할 이유가 없었죠.

좋아냥!

 

 


 

저기 징검다리가 보이지? 내 친구들이 징검다리를 건널거야! 하지만 징검다리는 버틸수 있는 내구도가 한계가 있지! 내 친구들의 몸무게, 돌의 내구도, 친구들의 점프력을 고려하여 내 친구 루비독, 피치피독, 씨-독, 코볼독이 각각 다리를 건널 수 있는지 알아봐줘! 친구들은 더 추가 될 수도, 덜 건널 수도 있어! 1. 각 돌들이 얼마나 버틸수 있는지 배열로 주어집니다. (내구도 0까지는 독의 몸무게를 버틸 수 있습니다. 0미만이 되면 독은 살아남지 못합니다.)

2. 각 독들의 개인정보가 JSON(JSON은 큰 따옴표로 묶여야 합니다. 가능하다면 json을 import하여 풀어보세요!)으로 주어집니다. 개인정보는 보호되지 않습니다. 3. 각 돌에 독들이 착지할 때 돌의 내구도는 몸무게만큼 줄어듭니다. ex) [1,2,1,4] 각 돌마다 몸무게 1인 독 1마리 2마리 1마리 4마리의 착지를 버틸 수 있습니다. 4. 독들의 점프력이 각자 다릅니다. ex) 점프력이 2라면 2칸씩 점프하여 착지합니다. 4. 각 독들은 순서대로만 다리를 건넙니다.

 

입력
돌의내구도 = [1, 2, 1, 4]
독 = [{
    "이름" : "루비독",
    "나이" : "95년생",
    "점프력" : "3",
    "몸무게" : "4",
    },{
    "이름" : "피치독",
    "나이" : "95년생",
    "점프력" : "3",
    "몸무게" : "3",
    },{
    "이름" : "씨-독",
    "나이" : "72년생",
    "점프력" : "2",
    "몸무게" : "1",
    },{
    "이름" : "코볼독",
    "나이" : "59년생",
    "점프력" : "1",
    "몸무게" : "1",
    },
]

출력
생존자 : ['씨-독']

입력
돌의내구도 = [5, 3, 4, 1, 3, 8, 3]
독 = [{
    "이름" : "루비독",
    "나이" : "95년생",
    "점프력" : "3",
    "몸무게" : "4",
    },{
    "이름" : "피치독",
    "나이" : "95년생",
    "점프력" : "3",
    "몸무게" : "3",
    },{
    "이름" : "씨-독",
    "나이" : "72년생",
    "점프력" : "2",
    "몸무게" : "1",
    },{
    "이름" : "코볼독",
    "나이" : "59년생",
    "점프력" : "1",
    "몸무게" : "1",
    },
]

출력
생존자 : ['루비독', '씨-독']

 

 

 

 

A.

import JSON;

stone_durability = [1, 2, 1, 4]
doc = [{
    "이름" : "루비독",
    "나이" : "95년생",
    "점프력" : "3",
    "몸무게" : "4",
    },{
    "이름" : "피치독",
    "나이" : "95년생",
    "점프력" : "3",
    "몸무게" : "3",
    },{
    "이름" : "씨-독",
    "나이" : "72년생",
    "점프력" : "2",
    "몸무게" : "1",
    },{
    "이름" : "코볼독",
    "나이" : "59년생",
    "점프력" : "1",
    "몸무게" : "1",
    },
];

def solution(stone_durability, doc):
	answer = [i['이름'] for i in doc]
	for i in doc:
		location = 0
		while location < len(stone_durability)-1:
			location += int(i['점프력'])
			stone_durability[location-1] -= int(i['몸무게'])
			if stone_durability[location-1] < 0:
				answer[answer.index(i['이름'])] = 'fail'
				break;

	return [i for i in answer if i !='fail']

print(solution(JSON.loads(stone_durability), doc))

 

풀이 :

solution 함수를 만들어서 입력받은 값을 인자로 받는다.

JSON을 import해주고 json이 string에서 json으로 변환하여 solution함수 첫번쨰 인자에 loads 함수에 넣어 solution를 호출한다.

독들의 이름만 answer변수에 담아준다. (추후 징검다리를 건넌 독들의 이름만 추출하기 위함.)

for문안에 while문으로 독들의 첫 시작 위치를 0으로 잡는다.

len(stone_durability)-1은 array임으로 총 갯수에서 -1을 해서 인자의 수와 맞춰준다.

각 독들의 점프력으로 독들의 위치(location)에 합해준다.

돌 위치에 있는 내구도를 독들의 몸무게만큼 뺴준다.

돌의 내구도가 0보다 작다면 해당 독은 물에 빠진것임으로 독이름을 fail로 값을 변경해준다.

최종 독들의 이름이 fail이 아닌것들만 출력해준다.

fail이 아닌 독들은 무사히 건넌 독들이다.

 

 

출처 : 눈떠보니 코딩테스트 전날 (인프런)