Programmers_2021 카카오 채용연계형 인턴쉽_거리두기 확인하기
프로그래머스 카카오 채용 - 거리두기 확인하기 문제 입니다.
1. 문제
https://programmers.co.kr/learn/courses/30/lessons/81302
2. 분류 및 난이도
Programmers 문제입니다.
2021 카카오 채용연계형 인턴쉽 문제입니다.
Level 2난이도의 문제입니다.
3. 생각한 것들(문제 접근 방법)
- 그리디하게 풀면 됩니다. 범위가 넓지 않아서 어렵지는 않습니다.
- 코드가 많이 더럽습니다.
4. 접근 방법을 적용한 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# 1. 사용자를 다 넣음.
# 2. 서로 거리가 2 이하인 경우만 분리
# 3. 주변을 보고 파티션이 있으면 1 없으면 0
from collections import deque
def getPerson(row,col,places):
result = deque()
idx = 0
for idx in range(5):
if(places[row][col][idx]=="P"):
result.append([col,idx])
return result
def getDistance(first,second,person_spot):
judge = abs(person_spot[first][0] - person_spot[second][0]) + abs(person_spot[first][1] - person_spot[second][1])
return judge
def filterList(person_spot,filter_list):
size = len(person_spot)
result = deque()
for i in range(size):
for j in range(i+1,size):
distance = getDistance(i,j,person_spot)
if distance == 1:
return [-1]
elif distance == 2:
filter_list.append((person_spot[i],person_spot[j]))
return filter_list
def judgeDouble(first,second):
if(first[0] + 2 == second[0]):
return 1
elif(first[1] + 2 == second[1]):
return 2
return 0
def judgeCross(first,second):
if(first[0] + 1 ==second[0] and first[1] + 1 == second[1]):
return 1
elif(first[0] +1 == second[0] and first[1] - 1 ==second[1]):
return 2
def solution(places):
answer = [1] * 5
row = 0
col = 0
for row in range(5):
person_spot = deque()
filter_list = deque()
for col in range(5):
person_spot += getPerson(row,col,places)
judge = filterList(person_spot,filter_list)
if(len(judge) !=0 and judge[0] == -1):
answer[row] = 0
continue
for idx in range(len(filter_list)):
first, second = filter_list[idx]
double_judge = judgeDouble(first,second)
if(double_judge == 1):
if (places[row][first[0] + 1][first[1]] != 'X'):
answer[row] = 0
break
elif(double_judge==2):
if(places[row][first[0]][first[1] + 1] != 'X'):
answer[row] = 0
break
else:
cross_judge = judgeCross(first,second)
if cross_judge == 1:
if(places[row][first[0] + 1][first[1]] != 'X' or places[row][first[0]][first[1] + 1] !='X'):
answer[row]=0
break
else:
if(places[row][first[0]][first[1] - 1] != 'X' or places[row][first[0] + 1][first[1]] !='X'):
answer[row]=0
break
return answer
5. 결과
필요시. c++ 짜드리겠습니다. 설명이 필요시 댓글달아주세요.
This post is licensed under CC BY 4.0 by the author.