강의를 보며 기록해야할 부분만 작성.
1이 될 때까지 입력받은 N을 K로 나누거나, N을 1을 빼는 최소 횟수를 구하는 문제
최소 횟수
를 구하기 위해선, 나누는 것을 많이 할 수록 최소 횟수이다. (1을 빼는 것을 적게하자)내가 문제를 풀 때 나온 것은 재귀로 풀었는데, 이렇게 재귀로 하면 시간초과가 나올 것 같다..
또한, 입력 받아야 하는 값이 n과 k 뿐인데 count 까지 함수로 넣었으니 할 말 없다
---> 작성이유
def whileOne(n, k, count):
if n == 1:
print(count)
return
if n % k == 0:
n = n // k
else:
n = n - 1
count = count + 1
whileOne(n, k, count)
whileOne(25, 3, 0)
-----------------------------------------------------
def whileOneOLogN(n, k):
result = 0 # 결과 값
while True: # n 값이 K보다 크거나 같을 때 까지 반복한다
# target = n을 k로 나누어 떨어지개 만든 후 k를 곱한 값 즉, n 을 k 로 나누어 질때 까지 뺀 값
# 가장 가까운 나눠 떨어지는 값을 얻는 방법
target = (n // k) * k
# result = 얼마나 뺐는지 결과 값에 더해준다 (즉, -1 의 갯수당 실행 횟수 1번이기 때문)
result += (n - target)
# n 을 1을 나누어질 때 까지 뺀 값으로 준다.
n = target
# 만약, n이 k로 나누어지지 않는다면 실행을 멈춘다.
if n < k:
break
# 실행 1회 추가 (n 을 k로 나누었기 떄문)
result += 1
# n을 k로 나눈 정수의 몫을 n에 대입.
n //= k
# n이 k보다 작지만, 1보다 클경우 그만큼 실행 횟수를 더해주기 위함
result += n - 1
print(result)
n, k = map(int, input().split())
whileOneOLogN(n, k) # 입력 값으로 받은 값을 n과 k 로 int 형으로 각각 받는다.
이동방향을 받고 그 만큼 움직인 후의 위치를 물어보는 문제
def getPosition(space, moves):
x, y = 1, 1
#행
dx = [0, 0, -1, 1]
#열
dy = [-1, 1, 0, 0]
moves_plan = ['L', 'R', 'U', 'D']
for move in moves:
index = moves_plan.index(move)
nx = x + dx[index]
ny = y + dy[index]
if nx < 1 or ny < 1 or nx > space or ny > space:
continue
x, y = nx, ny
print(x, y)
getPosition(5, ['R', 'R', 'R', 'U', 'D', 'D'])
dx
, dy
를 만들어서 즉, 이동방향
을 업데이트 시키는 방향으로 풀면 되는 것을 알아갔다.
8 x 8 안에 있는 기사의 위치를 받아서 그 기사가 움직일 수 있는 횟수를 구하는 문제이다.
기사는 이 2가지 방법 중 1가지 방법을 선택하여 움직 일 수 있다.
나는, 문제를 풀 때 dx
, dy
같은 이동방향
에 대해서 생각하지 않고, 기사가 최대 8개의 이동 횟수가 있고, 상하
or 좌우
중 한개를 선택하여 이동 방법 1, 2를 모두 고려하면 움직일 수 있는 갯수가 정해짐을 고려했다.
즉, 기사의 위치 값을 받아서 숫자화 시키고 8x8을 넘어가지 않도록 좌
이동, 우
이동을 고려해서 if문을 사용했는데,
실제로는, 이 좌
, 우
구분이 아니라, 모든 케이스 이동방향
에 대해서 고려하면 되는 문제였다. 즉
steps = [(-2, -1), (-1, -2), (1, -2), (2, -1), (2, 1), (1, 2), (-1, 2), (-2, 1)]
을 고려하면 되었다.
def KnightOfKingdom(pos: str):
#행, 열
col = ["1", "2", "3", "4", "5", "6", "7", "8"]
row = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
count = 8
colIndex = col.index(pos[1]) + 1
rowIndex = row.index(pos[0]) + 1
#좌
for i in range(3):
if i == 0:
continue
if i == 1:
if rowIndex - i < 1 or colIndex - 2 < 1:
count -= 1
if rowIndex - i < 1 or colIndex + 2 > 8:
count -= 1
if i == 2:
if rowIndex - i < 1 or colIndex - 1 < 1:
count -= 1
if rowIndex - i < 1 or colIndex + 1 > 8:
count -= 1
#우
for i in range(3):
if i == 0:
continue
if i == 1:
if rowIndex + i > 8 or colIndex - 2 < 1:
count -= 1
if rowIndex + i > 8 or colIndex + 2 > 8:
count -= 1
if i == 2:
if rowIndex + i > 8 or colIndex - 1 < 1:
count -= 1
if rowIndex + i > 8 or colIndex + 1 > 8:
count -= 1
print(count)
-------------------------------------------------------------------------
def GetPostionOfKnight():
input_data = input()
row = int(input_data[1])
col = int(ord(input_data[0]) - int(ord('a')) + 1)
steps = [(-2, -1), (-1, -2), (1, -2), (2, -1), (2, 1), (1, 2), (-1, 2), (-2, 1)]
result = 0
for step in steps:
next_row = row + step[0]
next_column = col + step[1]
if next_row > 0 and next_row < 9 and next_column > 0 and next_column < 9:
result += 1
print(result)
python
문법
.sort()
메소드는 list type
만 사용할 수 있다.
str.isalpha()
은 문자가 알파벳인지 확인하는 함수이다. 알파벳이 아니면 False
를 반환한다
list
to string
은 ''.join(list)
을 사용하자