STUDY/Coding

구현

sohexz 2021. 10. 12. 15:37

이것이 코딩테스트다-332p

도시의 크기 N x N , 치킨집 수  M

 

0 : 빈칸

1 : 집

2 : 치킨집

 

치킨 거리: 집과 가장 가까운 치킨집 사이의 거리

도시의 치킨 거리: 모든 집의 치킨 거리

 

=> 목표: 기존에 존재하는 치킨집을 줄여서 최대 M개로 맞추기, 집들로부터 M개의 치킨집까지의 거리 줄이기

 

입력 -> N M

출력 -> 도시의 치킨 거리의 최솟값

 

거리를 구하는 방법

임의의 두 칸 ( r1, c1 ) 과 ( r2, c2) 사이의 거리는 | r1 - r2 | + | c1- c2 |

 

from itertools import combinations   // 조합 라이브러리 사용

n,m = map(int,input().split())  //도시의 크기, 치킨집의 수 받아오기
chicken, house = [], [] 

for r in range(n):  // 도시의 크기 받아온 만큼 for문 
	data = list(map(int,input().split()))
	for c in range(n):
		if data[c]==1: // 1이면 집
			house.append((r,c))
		elif data[c]==2:  // 2면 치킨집
			chicken.append((r,c))

candidates= list(combinations(chicken,m)) // 모든 치킨집 중 m개의 치킨집을 뽑는 조합 계산

def get_sum(candidate): // 치킨 거리의 합 계산
	result=0
	for hx, hy in house: // 모든 집에 대해서 
		temp=1e9 //1e9= 10의 9승
		for cx, cy in candidate:
			temp=min(temp, abs(hx-cx) + abs(hy-cy)) // 가장 가까운 치킨집까지의 거리 구하기
		result += temp
	return result

result=1e9
for candidate in candidates: 
	result=min(result, get_sum(candidate)) // 치킨 거리의 합의 최소를 찾아 출력

print(result)

 

https://blog.naver.com/dbtodus1/222515814482

 

[Python] 코딩 테스트를 위한 파이썬 문법 정리1 - 자료형

본격적인 코딩 테스트 준비에 앞서 C++ 과 Python 중에서 어떤 언어로 코딩 테스트를 준비할까 고민하다...

blog.naver.com

* 1e9와 같은 자료형 문법 참고 블로그

 

 

 

이것이 코딩테스트다 - 325p

자물쇠: 격자 한 칸의 크기가 1 x 1 인 N x N 크기의 정사각 격자 형태

열쇠: M x M 크기의 정사각 격자 형태

 

열쇠-> 회전과 이동 가능

 

열쇠의 돌기 부분을 자물쇠의 홈 부분에 맞게 채우면 자물쇠가 열림

열쇠의 돌기와 자물쇠의 돌기가 만나면 안 됨

 

=> 목표: 열쇠를 적당히 회전하고 이동시켜 자물쇠의 홈에 딱 맞게 끼워 넣는 것

 

 

*이 문제는 프로그래머스 사이트에서 테스트해야 정상 동작한다

https://programmers.co.kr/learn/courses/30/lessons/60059?language=python 

 

코딩테스트 연습 - 자물쇠와 열쇠

[[0, 0, 0], [1, 0, 0], [0, 1, 1]] [[1, 1, 1], [1, 1, 0], [1, 0, 1]] true

programmers.co.kr

 

 

연산이 많이 필요 -> 완전 탐색을 이용하여 열쇠를 이동이나 회전시켜서 자물쇠에 끼워보는 작업 전부 시도 가능

-> 완전 탐색을 수월하게 하기 위해서 자물쇠 리스트의 크기를 3배 이상으로 변경 -> 자물쇠 리스트에 열쇠 리스트의 값을 더한 뒤에 더한 결과가 자물쇠 부분의 모든 값이 1이면 통과

 

*효율적인 문제 풀이를 위해 rotate_a_matrix_by_90_degree() 함수 구현

= 2차원 리스트를 90도 회전한 결과를 반환하는 함수

 

def rotate_a_matrix_by_90_degree(a):
    n= len(a)
    m=len(a[0])
    result = [[0] * n for _ in range(m)]
    for i in range(n):
        for j in range(m):
            result[j][n-i-1] = a[i][j]
    return result

def check(new_lock):
    lock_length = len(new_lock)
    for i in range(lock_length, lock_length *2 ):
        for j in range(lock_length, lock_length *2 ):
              if new_lock[i][j] !=1:
                     return False
    return True

def solution(key, lock):
    n=len(lock)
    m=len(key)
    new_lock = [[0]*(n*3) for _ in range(n*3)]
    for i in range(n):
        for j in range(n):
            new_lock[i+n][j+n]=lock[i][j]
            
    for rotation in range(4):
        key=rotate_a_matrix_by_90_degree(key)
        for x in range(n*2):
            for y in range(n*2):
                for i in range(m):
                    for j in range(m):
                        new_lock[x+i][y+j] += key[i][j]
                if check(new_lock)==True:
                    return True
                for i in range(m):
                    for j in range (m):
                        new_lock[x+i][y+j]-= key[i][j]

    return False

 

for _ in range 참고 블로그

 

https://syujisu.tistory.com/130

 

python " _ " (언더바) 쓰임

for _ in range(5): print('hi')  변수 _ 가 0, 1, 2, 3, 4 값을 가지고 반복을 수행한다 실제 사용되지는 않기 때문에 " _ " 를 사용함 => dummy variable 인터프리터에서 마지막 값을 저장하고 싶을 때 값을 무..

syujisu.tistory.com