목록전체 글 (45)
코딩 공부

시뮬레이션 유형의 문제이므로 문제에서 설명한 그대로 구현하도록 한다. 사과가 있는 칸을 나타내기 위해 board에 주어진 사과 좌표를 이용해 1로 표기해둔다. 방향 전환 정보를 info라는 딕셔너리 형태(info = {X:C})에 담는다. 이때 X는 숫자, C는 문자 형태임에 유의한다. 한 칸 바라보고 있는 방향으로 이동하면서 벽이나 몸에 이동할 경우 반복문을 break하여 빠져나오고 사과가 있는 칸이라면 사과를 먹고(board[ni][nj] = 0) 몸을 늘린다. 사과가 없는 칸이라면 몸을 늘리고 꼬리를 당긴다(snake맨앞 정보 지우기). 기준 좌표를 재설정한다.(si, sj = ni, nj) info를 통해 방향을 바꿔야하는 turn인지 체크하고 해당 시 변경할 수 있도록 한다. N = int(in..

모든 가능한 경우의 수를 살펴봐야 하므로 '백트래킹'임을 추론한다. [조건]에 유의한다. - 최소 한 개의 모음(a, e, i, o, u)과 최소 두 개의 자음으로 구성 - 알파벳이 증가하는 순서로 암호 배열 먼저 알파벳을 sort로 정렬해놓고, 백트래킹을 통해 암호의 길이가 L이면서 모음(count)이 1개 이상이면서 자음(C-count)이 2개 이상일 경우, 그 암호를 출력하도록 한다. (모음인 알파벳을 선택할 경우 count + 1을 해준다.) def dfs(n, word, count): if n == C: if len(word) == L and count>0 and C-count>=2: print(word) return if candidates[n] in vowels: # 선택한 알파벳이 모음일 ..

시뮬레이션 유형이므로 문제에 나와있는 과정 그대로 코드를 구상하도록 한다. 끝과 끝이 이어진 격자임을 고려하여 [1]번 과정에서 이동된 구름의 위치i, j를 각각 N으로 나눠준다. [2]번 과정에서는 위에서 구한 이동된 구름(new_cloud)의 위치에 비의 양을 +1 해준다. [3]번 과정(구름 사라짐)은 따로 구현할 것은 없고, 이후 과정에서 구름의 위치들이 사용되므로 지우지 않음에 유의한다. [4]번 과정에서는 각 구름 좌표의 대각선에 물이 들어있는 바구니 수(count)를 세야하므로 ↖,↗,↙,↘ 방향의 물 존재 여부를 카운트하여 각 좌표의 물의 양에 값을 물이 들어있는 바구니 수를 더해준다. [5]번 과정에서 구름을 새로 생성해야 하므로 좌표의 값이 2이상(arr[i][j]>=2), 좌표가 ne..

우선, 표에 주어진 정보를 가지고 있어야 하므로, 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..