
안전지대
프로그래머스 / Level 0 / 안전지대

- 2차원 배열 문제라는 건,
dx (상하로 이동하는 칸 수), dy(좌우로 이동하는 칸 수) 리스트를 만들어서 인접 칸을 체크해야 한다는 뜻
- 인접 칸을 확인할 때, 2차원 배열의 범위를 벗어나는지 안 벗어나는지 체크는 필수
0 <= nx < N and 0 <= ny < N
- 시간 복잡도: 모든 칸을 이중 for문으로 순회하는 과정에서 O(N2)
def solution(board):
def check_danger(x, y):
dx = [-1, -1, -1, 0, 0, 1, 1, 1]
dy = [-1, 0, 1, -1, 1, -1, 0, 1]
safe[x][y] = False
for k in range(8):
nx, ny = x + dx[k], y + dy[k]
if 0 <= nx < N and 0 <= ny < N:
safe[nx][ny] = False
N = len(board)
safe = [[True] * N for _ in range(N)]
for i in range(N):
for j in range(N):
if board[i][j] == 1:
check_danger(i, j)
answer = sum(sum(i for i in row) for row in safe)
return answer
성격 유형 검사하기
프로그래머스 / Level 1 / 성격 유형 검사하기
- 여러 가지 풀이법이 있겠지만, 딕셔너리를 이용해 각 유형별 점수를 저장하는 게 제일 편한 것 같음
- 시간 복잡도: N개의 문제를 채점하는 과정에서
for문을 사용하므로 O(N)
def solution(survey, choices):
points = {key: 0 for key in "RTCFJMAN"}
for i in range(len(survey)):
left_i = survey[i][0]
right_i = survey[i][1]
ch = choices[i]
if ch <= 3:
points[left_i] += (4 - ch)
elif ch >= 5:
points[right_i] += (ch - 4)
answer = []
answer.append("R" if points["R"] >= points["T"] else "T")
answer.append("C" if points["C"] >= points["F"] else "F")
answer.append("J" if points["J"] >= points["M"] else "M")
answer.append("A" if points["A"] >= points["N"] else "N")
return "".join(answer)
영어 끝말잇기
프로그래머스 / Level 2 / 영어 끝말잇기
- 이미 사용한 단어를 확인할 방법이 필요한데, O(1) 안에 확인 가능한 집합형이 딱이지
- 누구의 차례인지는 나머지 연산으로, 그 사람의 몇 번째 차례인지는 몫 연산으로 확인
- 이런 건 직접 보통 종이에 쓰면서 패턴 찾는 게 제일 속 편함.

- 시간 복잡도: 최대 N개의 단어를
for문으로 확인하므로 O(N)
def solution(n, words):
used_words = set([words[0]])
for i in range(1, len(words)):
number = i % n + 1
order = i // n + 1
if words[i] in used_words:
return [number, order]
if words[i][0] != words[i - 1][-1]:
return [number, order]
used_words.add(words[i])
return [0, 0]