본문 바로가기

코딩테스트/파이썬

(19)
[백준] 14503번 로봇 청소기 문제 설명 함수의 인자로는 행의 좌표, 열의 좌표, 현재 방향을 넣어주고 해당 좌표의 값이 0일 경우 값을 2로 바꾸어 청소했다고 표시하고 count 값을 1 증가시켰다. 문제에서 주어진 대로 현재 방향의 왼쪽 칸이 청소되어 있는지 확인을 하고 청소가 되어있지 않으면 현재 방향에 따라 방향을 바꾼 후 한 칸 옮겼다. 만약 왼쪽 칸이 청소되어 있을 경우 현재 칸의 상,하,좌,우의 칸들이 청소되어 있는지 확인한다. 상,하,좌,우의 칸들이 모두 청소되어 있을 경우 현재 방향으로부터 뒷 칸이 벽인지 확인한 후 벽일 경우 함수를 종료하고 벽이 아닐 경우 현재 방향을 유지한 채 한 칸 후진한다. 상,하,좌,우의 칸들 중 한 칸이라도 청소되어 있지 않은 칸이 존재할 경우 현재 칸에서 방향만 왼쪽으로 바꿔준다. 각 칸..
백준 12891번 톱니바퀴 문제 설명 signal 배열은 wheel1~4까지 각각의 바퀴마다 어느 방향으로 회전해야하는지에 대한 데이터가 담긴 배열이다. 0이면 그대로, 1이면 시계 방향, -1이면 반시계 방향이다. 처음에 func 함수에서 회전시키는 방법에 맞게 signal의 값들을 설정한다. 위에서 signal에 입력한 데이터를 사용하여 spin 함수를 실행한다. dir(방향)이 0일 경우 그대로 함수를 종료하고 1일 경우 마지막 톱니의 극을 빼서 맨 앞에 넣어주고 -1일 경우 맨 앞의 톱니의 극을 빼서 맨 뒤에 넣어준다. 전체 코드 wheel1 =[] wheel2 =[] wheel3 = [] wheel4 = [] signal = [] def spin(num,dir): global wheel1 global wheel2 glob..
백준 3190번 뱀 문제 설명 orders는 L개의 뱀의 방향 변환 정보를 담는 배열, snake는 뱀의 머리부터 꼬리까지의 좌표들, dir은 현재 뱀의 방향을 나타낸다. 함수의 인자로는 방향 변환 정보를 하나씩 받아온다. answer는 게임 시작으로부터 경과 시간을 나타낸다. 첫번째 경우로 뱀의 방향이 오른쪽(R)일 때 order[0]은 게임이 시작 시간으로부터의 경과 시간이므로 반복문을 order[0] - answer 만큼 돌린다. answer를 1 더한 후 뱀의 머리 부분을 이동시켜 해당 좌표로 이동할 수 있는지 확인한다. 총 2가지 경우의 수를 확인해야 하는데 1. 뱀의 머리가 보드를 넘어가는지 2. 뱀의 머리가 자신의 몸통에 닿는지 만약 오른쪽으로 한 칸 이동했을 때 보드를 넘어가면 finished를 True로 바..
백준 11559번 Puyo Puyo 문제 설명 dx, dy는 상하좌우에 같은 색깔의 뿌요가 있는지 확인할 때 사용한다. refresh 함수는 뿌요가 터지고 뿌요들을 다시 아래로 떨어지게 하는 함수다. color 배열에 해당 열에 있는 모든 색들을 넣고 가장 아래서부터 차례대로 채워넣는다. boom_count는 연쇄가 일어나는지 판별하기 위한 변수다. cur_color는 해당 위치의 뿌요의 색깔을 의미하고 color_count는 해당 뿌요와 같은 색깔의 뿌요의 갯수를 뜻한다. dfs를 사용하여 queue에 뿌요를 넣고 인접하는 같은 색깔의 뿌요를 same_color에 넣는다. 만약 인접한 같은 색깔의 뿌요가 3개 이상일 경우 boom_count를 1 더해주고 뿌요들을 . 으로 바꾼후 refresh 함수를 호출한다. 이중 for문을 돌린 후에..
백준 18808번 스티커 붙이기 문제 설명 해당 스티커를 붙일 수 있는지 확인한다. arr은 해당 스티커를 의미하고 plist에 스티커의 좌표를 넣어준다. flag는 스티커를 붙일 수 있는지 판별하는 bool형 변수다. 이중 for문을 통해 처음부터 끝의 좌표들을 검사해 스티커를 붙일 수 있는지 확인한다. 확인해야 하는 경우의 수는 총 세 가지다. 스티커를 붙일 때 가로측 범위를 벗어나는지, 세로측 범위를 벗어나는지, 이미 스티커가 붙여있는지를 확인하면 된다. 만약 붙일 수 없는 경우 스티커를 90도 회전시키고 plist를 초기화한다. 해당 내용을 3번 더 반복한다. 전체 코드 laptop = [] M = 0 N = 0 def turn(arr): n = len(arr) m = len(arr[0]) tmp = [] for j in ran..
백준 12100번 2048(Easy) 문제 설명 max_block은 가장 큰 블록을 뜻하고 count는 이동한 횟수를 뜻한다. 이동한 횟수가 5번이면 해당 블록에서 가장 큰 값과 max_block을 비교한다. goUp함수는 위로 블록을 이동시키는 함수다. copy_board는 위로 이동한 블록의 결과값을 저장한다. goUp함수는 첫번째 열부터 마지막 열까지 반복문을 돌린다. 반복문의 순서는 1. 해당 열에서 0보다 큰 값이 있으면 해당 열의 index를 tmp 배열에 담는다. 2-1. tmp 배열의 길이가 1일 경우 copy_board에 해당 열의 첫번째 행에 값을 대입한다. 2-2. tmp 배열의 길이가 1보다 클 경우 tmp에서 index를 2개씩 빼서 블록값을 비교 후 값이 같으면 results 배열에 담고 같지 않으면 나중에 뺀 in..
백준 15683번 감시 문제 설명 office는 사무실을 나타내는 배열, cctv는 사무실에 있는 cctv의 위치를 뜻한다. cctv가 없다는 뜻은 더이상 감시할 cctv가 없다는 뜻이므로 해당 사무실에서 0의 개수를 센 후 min_count와 비교해준다. cctv가 존재하면 하나씩 pop을 하여 해당 cctv의 종류에 맞게 office의 배열을 설정한다. x_pos는 cctv의 행의 좌표, y_pos는 cctv의 열의 좌표다. 만약 cctv가 1번 cctv일 경우 감시할 방향의 경우의 수는 총 4개이므로 for문을 사용하여 감시할 영역을 '#'으로 바꾼다. 여기서 함수에서 인자로 받은 arr을 그대로 사용할 경우 배열 자체의 데이터가 바뀌기 때문에 copy_office로 복사한 후 copy_office의 값을 변경한다. 이렇..
백준 1799번 비숍 문제 설명 N-Queen 문제를 돌려서 생각하여 (왼쪽에서 오른쪽으로 가는) / 모양의 대각선으로 해당 줄을 검사하면서 한 줄 씩 내려갔다. 훑어야 하는 대각선의 총 개수는 체스판의 크기 * 2 - 1 이다. (예를 들어, 체스판 크기가 3이면 ///// 이렇게 5개를 검사해야한다.) / 대각선을 N-Queen의 가로라고 보면 된다. isused는 \모양의 대각선으로 이런 식으로 (x,y)에 비숍을 넣으면 isused(x-y+체스판 크기-1)의 값을 1로 설정하여 해당 대각선은 사용되고 있다는 것을 표시해줬다. 함수의 매개변수로 cur, length, count를 설정했는데 cur은 현재 / 대각선의 위치(체스판 크기가 3이면 0부터 5까지다.), length는 / 대각선이 체크할 체스판의 개수, cou..