Cos Pro Python 1급 1차 06번 문제풀이

Contents of table:


Topic:
체스의 나이트

Review:
2차원 panel 위에서 포인트 이동문제.
소용돌이 알고리즘의 해결방법과 유사하게, direction 리스트를 정하고, point 를 정해진 조건에
따라서 이동시켜서 결과값을 얻어낸다.


정답코드


1
2
3
4
5
6
7
8
9
10
11
12
13
def solution(pos):
dx = [1,1,-1,-1,2,2,-2,-2] #체스말이 움직이는 거리와 방향을 나타낸다.
dy = [2,-2,-2,2,1,-1,-1,1] #ex) (x,y) => (x+dx, y+dy)
cx = ord(pos[0]) - ord("A") #ord()함수는 문자열의 unicode 값을 리턴해준다.
#체스판 구조상, A와 1을 기준으로 잡고, unicode의 차이만큼을 current position으로 보겠다는 의미.
cy = ord(pos[1]) - ord("0") - 1
ans = 0
for i in range(8): #나이트가 움직일 수 있는 전방위는 8가지이다.
nx = cx + dx[i] #ex) (nx,ny) => (x+dx, y+dy)
ny = cy + dy[i]
if nx >= 0 and nx < 8 and ny >= 0 and ny < 8: # 0 <= x,y < 8 이어야지 체스판을 벗어나지 않는다.
ans += 1 # nx, ny 가 체스판을 벗어나지 않을 경우, ans 변수에 카운트누적.
return ans

문제내용

체스에서 나이트(knight)는 아래 그림과 같이 동그라미로 표시된 8개의 방향중 한 곳으로 한 번에 이동이 가능합니다.

''

단, 나이트는 체스판 밖으로는 이동할 수 없습니다.

체스판의 각 칸의 위치는 다음과 같이 표기합니다.
''
예를 들어, A번줄과 1번줄이 겹치는 부분은 ‘A1’이라고 합니다.

나이트의 위치 pos가 매개변수로 주어질 때, 나이트를 한 번 움직여서 이동할 수 있는 칸은 몇개인지 return 하도록 solution 함수를 완성해주세요.

매개변수 설명

나이트의 위치 pos가 solution 함수의 매개변수로 주어집니다.

  • pos는 A부터 H까지의 대문자 알파벳 하나와 1 이상 8이하의 정수 하나로 이루어진 두 글자 문자열입니다.
  • 잘못된 위치가 주어지는 경우는 없습니다.

return 값 설명

나이트를 한 번 움직여서 이동할 수 있는 칸의 개수를 return 해주세요.


예시

pos return
“A7” 3

예시 설명

나이트가 A7 위치에 있으면 아래 그림과 같이 왼쪽으로는 이동하지 못하고, 오른쪽으로는 맨 위를 제외한 나머지 세 칸으로 이동 가능합니다.

따라서, 3을 return 하면 됩니다.

Cos Pro Python 1급 1차 04번 문제풀이

Contents of table:


Topic:
타임머신

Review:
#point 1) 연산자의 활용능력. 기호 //, % 을 활용할 수 있는가.
#point 2) 숫자에 0을 포함하지 않도록 하는 로직. 정답코드에서는 num // digit % 10 == 0 으로 판단기준을 잡았다. 0이 포함된 숫자는 10의 배수라는 아이디어를 기본으로 num +=1, digit *= 10 을 반복하며 각 자릿수마다 0 이 없도록 while 문을 반복시킴.

문제내용

어느 누군가가 타임머신을 타고 과거로 가서 숫자 0이 없는 수 체계를 전파했습니다. 역사가 바뀌어 이제 사람들의 의식 속엔 0이란 숫자가 사라졌습니다. 따라서, 현재의 수 체계는 1, 2, 3, …, 8, 9, 11, 12, …와 같이 0이 없게 바뀌었습니다.

0을 포함하지 않은 자연수 num이 매개변수로 주어질 때, 이 수에 1을 더한 수를 return 하도록 solution 함수를 완성해주세요.

매개변수 설명

자연수 num이 solution 함수의 매개변수로 주어집니다.

  • num은 1 이상 999,999,999,999,999,999 이하의 0을 포함하지 않는 자연수입니다.

return 값 설명

자연수 num에 1을 더한 수를 return 해주세요.


예시

num return
9949999 9951111

예시 설명

9,949,999에 1을 더하면 9,950,000이지만 0은 존재하지 않으므로 9,951,111이 됩니다.


정답코드


def solution(num): 
    num += 1 #100을 넣었다고 가정해 볼 때, 101 즉 끝자리 수의 0을 1로 바꿔준다. 
    digit = 1 #임의의 digit 값, 아래 함수 참조하면, 1 => 10 => 100, 10의 거듭제곱 형태.
    while num // digit % 10 == 0: # num 값이 10의 배수라고 가정 했을 때, 
        num += digit
        digit *= 10
    return num
~~~python

## **부가설명**
num에 99라는 값을 임의로 넣었다고 가정했을 때, 아래와 같은 연산이 진행이 된다. 

num = 99
digit =1

num += 1 
=> num = 100 #99라는 숫자에 1을 더했을 때, 10의 배수가 되는데, 10의 배수가 되지 않도록 만드는 것이 목표.

num // digit % 10 == 0 (true) #100은 10의 배수 이므로 (num//digit) 값의 나머지가 0이 된다.
    100 + 1 = 101 = num #100에서 바꾸어야 할 숫자는 10**0자리와 10**1자리 둘. 두 개중 하나가 해결되었다.
    1 * 10 = 10 = digit #10**0의 자리수가 해결이 되었으므로 10**1자리로 포인트 이동.

101 // 10 % 10 == 0 (true) #101은 여전히 10의 배수, 몫의 정수 부분이 10이다. 
    101 + 10 = 111 = num #한 자리 수 올라간 digit 부분이 10*1 부분에 1을 삽입. 
    10 * 10 = 100 = digit

111 // 10 % 10 == 0 (false)
#루프 break