-문제: https://www.acmicpc.net/problem/15686

 

15686번: 치킨 배달

크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸

www.acmicpc.net

 

부족했던 점: 

파이썬에서 combinations는 n개에서 m개를 선택한 모든 경우의 수를 구해준다 

치킨거리를 구할 때는 '집'을 기준으로 계산한다 

get_sum()에서 하나의 집 위치 (hx,hy)를 기준으로 각 치킨 집과의 거리를 result에 더한다

from itertools import combinations

n,m=map(int,input().split())
chicken,house=[],[]

for r in range(n):
    data=list(map(int,input().split()))
    for c in range(n):
        if data[c]==1:
            house.append((r,c))
        elif data[c]==2:
            chicken.append((r,c))
            
candidates=list(combinations(chicken,m))

def get_sum(candidate):
    result=0
    for hx,hy in house:
        temp=1e9
        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://www.acmicpc.net/problem/3190

 

3190번: 뱀

 'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임

www.acmicpc.net

 

문제 풀면서 부족했던 부분:

방향을 돌리는 turn()함수를 생각해 보지 못한 것 

회전정보를 담고 있는 Info 리스트 생각해보지 못한 것 

꼬리 위치는 q리스트로 파악 가능하다 

 

백준에서 콛 돌리면서 while 다음 첫번째 If문에서 indexerror가 발생한다. 추후에 고칠 예정

N=int(input())
K=int(input())
board=[[0]*(N+1) for _ in range(N+1)]
for _ in range(K):
    a,b=map(int,input().split())
    board[a][b]=1
    
L=int(input())
info=[]
for _ in range(L):
    x,c=input().split()
    info.append((int(x),c))
dx=[0,1,0,-1]
dy=[1,0,-1,0]

def turn(direction,c):
    if c=='L':
        direction=(direction-1)%4
    else:
        direction=(direction+1)%4
    return direction
        
def simulate():
    x,y=1,1
    board[x][y]=2
    time=0
    direction=0
    index=0
    q=[(x,y)]
    while True:
        nx,ny=x+dx[direction],y+dy[direction]
        if board[nx][ny]!=2 and 1<=nx and nx<=N and 1<=ny and ny<=N:
            if board[nx][ny]==1:
                board[nx][ny]=2
                q.append((nx,ny))
            if board[nx][ny]==0:
                board[nx][ny]=2
                q.append((nx,ny))
                qx,qy=q.pop(0)
                board[qx][qy]=0
        else:
            time+=1
            break
        time+=1
        x,y=nx,ny
    if index<1 and time==info[index][0]:
        direction=turn(direction,info[index][1])
        index+=1
    return time
print(simulate())

문제: https://programmers.co.kr/learn/courses/30/lessons/60059? 

 

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

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

programmers.co.kr

 

어려웠던 문제다. 어떻게 시작해야할지 감도 안 잡혔던 문제. 

찾아보니 lock보다 3배 큰 행렬을 만들고, 그 중간에 lock 행렬을 넣고 주변에서 key를 움직이면서 값을 더한후 중간 lock행렬의 값이 모두 1일 때 True를 반환하는 방식이었다 

코딩테스트 준비는 정말 쉽지 않은 것 같다 

 

-정답풀이

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(n):
        	result[j][n-(i+1)]=a[i][j]
	return result
    
    
def check(new_lock):
	lock_length=len(new_lock)//3
    for i in range(lock_length,2*lock_length):
    	for j in range(lock_length,2*lock_length):
        	if new_lock[i][j]!=1:
            	return False	
	return True 
    
    
def solution(key,lock):
	n=len(lock)
    m=len(key)
    new_lock=[[0]*3*n for _ in range(3*n)]
    
    for i in range(n,2*n):
    	for j in range(n,2*n):
        	new_lock[i][j]=lock[i][j]
            
	for rotation in range(4):
    	key=rotate_a_matrix_90_degree(key)
        for x in range(2*n):
        	for y in range(2*n):
            #자물쇠에 열쇠 끼어넣기 
            	for i in range(m):
                	for j in range(m):
                    	new_lock[x+i][y+j]+=key[i][j]
                if check[x][y]!=1:
                	return True
                for i in range(m):
                	for j in range(m):
                    	new_lock[x+i][y+j]-=key[i][j]
                        
	return False
  • 공부한 날짜: 2021.11.26,28/ 2021.12.01

 

 

1. 정수 boolean으로 변환/ 불 값 반대로 출력하기 

 

 

2. 불 값 다를 경우 True, 같을 경우 False 출력하기

 

 

 

 

3. 정수 a, ~a= -a-1

 

4. 'A'도 String이다. input()으로 그대로 받으면 되고, ''표시 제대로 적어주기 

 

 

 

 

 

 

 

 

5. 임의의 정수가 계속 입력되고, 입력되는 횟수를 알 수 없을때 -> while문 이용 

 

왼쪽이 오답, 오른쪽이 정답 

-while n!=0에 n이 영이면 멈추는 조건이 있음. 굳이 안써도 됨. 0이 출력이 되면 안되니까 If문 달아주기

 

6.

오른쪽으로 하면 시간초과. while로 반복되니까 굳이 for 안써도됨 

7. 알파벳의 정수값은 ord()함수로 구할 수 있음. 숫자의 아스키코드 값은 chr() 

a부터 주어진 문자까지 출력하는 두가지 방법

 

 

8. 0부터 주어진 수까지 차례로 출력하는 방법

 

 

 

 

9. 주어진 수부터 0까지 출력하는 방법 

 

 

 

 

 

9. 16진수 출력하는 방법: int(input(),16)-> 입력한 문자를 16진수로 표현

문자 16진수로 바꾸고 그거를 대문자 16진수로 표현하기(6081번)

 

10. 최소 공배수 구하는 방법. 주어진수들로 d를 나누었을 때, 나눈 나머지가 모두 0인 d가 최소공배수이다. 

그때까지 반복하기 

 

 

 

 

 

 

 

 

11. 6092번(여러번 보고 익히기)

 

 

12. 6094번: 주어진 리스트에서 최소값 찾기 

 

#2에 입력되는 값들 분리해서 정수로 바꾸고, 리스트 형태로 반환하는 거 생각못해서 여러번 헤맸음.

코테 시작 부분 정확히 알아두기!!

 

13. 6095번: 풀이 순서 및 방법 계속 손으로 풀어보기 

 

#1. 0으로 찬 표 만들기(이 단계는 외우기)

 

#2. 입력된 좌표 위치에 1대입하기 

 

#3. 출력하기(이 단계도 외우기)

 

 

14. 6096번 : 이거 여러번 연습해 보기. 인덱스 설정에 주의

6096번 정답 

 

15. 6097번: 내가 처음 작성한 답안과 정답 비교하면서 문제점 개선해나가기 

내가 처음 작성한 6097번 답안
6097번 답안

#1. h,w 순서 제대로 확인하고 작성

#2. 초반에 자료구조 설정하는거***

#3. 입력된 값들 매핑하는 거 공부하기. 위에처럼 List로하면 오류남. 

 

 

16. 6098번: 백트래킹(연습이 많이 필요함, 경우 효율적으로 설정하는 것이 관건일 것 같음)

 

 

내가 처음 쓴 답안 

처음에는 For문으로 돌리면 된다고 생각했지만, 이렇게 하면 경로가 아닌 곳에 9가 입력된다. 따라서 while문으로 작성하는 것이 맞음.

'코딩테스트' 카테고리의 다른 글

[코딩테스트] #1. 코테 공부 시작  (0) 2021.11.25

+ Recent posts