목록삼성 (15)
코딩 공부

우선, 표에 주어진 정보를 가지고 있어야 하므로, info라는 큰 dictionary 안에 "해당학생번호-set(좋아하는 학생들)"의 정보를 담는다. 또한, 학생들은 순서대로 배치할 것이므로 sequence라는 list에 학생을 순서대로 담아놓는다. 위의 sequence에 담은 학생들 순서대로, 각 칸에 배치했을 경우, 좋아하는 학생들의 수, 빈칸의 수를 세어 temp라는 하나의 임시 리스트에 정보를 저장해둔다. temp를 본문에 쓰여 있는 기준 순서대로, 좋아하는 학생들 수, 빈칸 수, 행, 열을 기준으로 정렬한다. 가장 부합하는 자리(temp[0][0], temp[0][1])에 학생을 배치한다. (모든 학생 과정 동일) 모두 배치가 끝났다면 만족도를 계산하기 위해 각 칸을 돌며 좋아하는 학생들 수를 ..

적록색약이 아닌 사람과 적록색약인 사람이 인지하는 구역이 다르므로 각각의 상황에 맞는 BFS를 2개 만들어야겠다. 적록색약이 아닌 사람의 경우, 미방문된 구역을 bfs를 통해 같은 색깔끼리 하나의 덩어리로 계산하도록 하고, 적록색약인 사람의 경우, 미방문된 구역을 bfs를 통해 R이나 G일 경우 서로가 같은 색으로 인식될 수 있게 계산한다. from collections import deque def bfs(si, sj): # 적록색약이 아닌 사람의 경우 visited[si][sj] = 1 q = deque() q.append((si, sj)) while q: ci, cj = q.popleft() for di, dj in ((-1, 0), (0, 1), (1, 0), (0, -1)): ni = ci + ..

과정이 순서대로 나와있는 '시뮬레이션' 유형이므로 문제에서 시키는 그대로 해야 함에 유의한다. 컨베이어 벨트의 길이는 2N, 로봇이 올라갈 수 있는 길이는 N임을 알아낸다. [1]단계에서 벨트는 마지막 부분을 떼어서 맨앞으로 붙이고, 로봇은 같은 방식이지만 마지막 칸의 경우 즉시 로봇을 내린다 하였으므로 로봇을 없애준다. [2]단계에서 가장 먼저 벨트에 올라간 로봇부터 이동 가능 여부를 살펴보므로 for문을 뒤에서부터 돌려 로봇이 존재하고, 다음 칸에 로봇이 없고, 다음 칸의 내구도가 존재한다면 로봇을 옮기고 내구도도 깎고 내구도가 0이 될 경우, K의 값을 -1 해준다. [3]단계에서는 가장 앞 칸의 내구도가 0이 아니면 로봇을 올리고, 내구도를 깎고, 내구도가 0이 될 경우 K에 -1을 해준다. [4..

집과 치킨집 사이의 거리를 구해야하므로 집(arr[i][j] == 1)과 치킨집(arr[i][j] == 2)의 좌표를 각각 loc_house, loc_chicken 리스트에 저장한다. distance라는 이차원 배열을 만들어서 행과 열은 각각 집과 치킨집을 나타내도록 하고 서로의 거리를 구한다. 3. 조합의 결과로 나올 수 있는 치킨집의 경우의 수를 구해 각 집들에 있어 살아남은 치킨집들까지의 최소 거리(temp)를 total에 더한다. 4. 하나의 조합의 결과가 total이고, 우리가 구하고자 하는 정답은 answer, 즉 조합들의 결과 중 가장 최소인 값을 구하는 것 이 목표이므로 answer = min(answer, total)로 정답을 갱신해준다. from itertools import combi..

우선, 톱니바퀴가 4개로 고정되어 있으므로 gear라는 이차원 배열을 4줄짜리로 받는다. 각 회전마다 선택된 기어(spin_gear)와 d(방향)이 정해지므로 각 회전별 톱니바퀴 4개의 방향 변화 정보를 저장할 status = [0, 0, 0, 0]를 만들어준다. 선택된 기어(spin_gear)의 왼쪽과 오른쪽으로 나눠서 맞닿는 극이 서로 다르면 현재 방향에 -1을 곱해준 값을 저장하고, 극이 다르지 않다면 더이상 기어가 돌아가지 않으므로 break를 통해 for문을 빠져나온다. (이때, 맞닿는 극이 각 gear의 2번째 원소인지, 6번째 원소인지 유의하도록 한다.) 4개의 기어의 방향 정보가 모두 저장이 됐다면, 반시계 방향으로 회전(status[i]==-1)할 경우, 맨 앞 숫자를 떼서 맨 뒤로 붙이..

"구현" 유형에 속하는 문제는 말 그대로 문제에 쓰여 있는 그대로 구현해 내면 되는 것이 포인트다. 현재 방의 상태(벽인지 빈칸인지)를 나타낼 arr 이차 배열을 하나 생성하고, 청소를 해나가야 하므로 청소 상태(청소가 되어있는지 안되어있는지)를 나타낼 cleaned 이차 배열을 하나 따로 생성한다. 현재 칸이 청소되어 있지 않다면 cleaned[si][sj]를 청소처리 해준다.(0 → 1) 현재 칸 기준 주변 4칸을 살펴보며, 청소되지 않은 칸이 있으면 그 칸으로 이동, 없다면 후진을 해야 하므로 문제에 써져 있는 그대로 먼저 반시계 방향으로 90도씩 돌면서 다음 칸의 상태를 체크한다. 청소되지 않은 칸이 발견되면, 즉시 그 칸으로 이동(ni → si, nj → sj)하고 다시 [1]로 돌아가고 발견되..