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

Contents of table:


Topic: 계단 게임

Review:
잘못된 한 줄 코드를 찾아서 수정하는 형태의 문제. 이런 경우는 대입으로 잘못된 코드를 찾아내는 것이 가장 빠르다.
A,B 가 비기는 케이스 ex) (0,0) 일 때, cnt -=1 이 되면은 안되므로 max(0, cnt-1) 로 고쳐준다.


정답코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def func(record):
if record == 0:
return 1
elif record == 1:
return 2
return 0

def solution(recordA, recordB):
cnt = 0
for i in range(len(recordA)):
if recordA[i] == recordB[i]:
continue
elif recordA[i] == func(recordB[i]):
cnt += 3
else:
cnt = max(0, cnt - 1)
return cnt

문제내용

#문제9
두 학생 A와 B는 계단 게임을 하였습니다.
계단 게임의 규칙은 아래와 같습니다.

  1. 계단 제일 아래에서 게임을 시작합니다. (0번째 칸)
  2. 가위바위보를 합니다.
  3. 이기면 계단 세 칸을 올라가고, 지면 한 칸을 내려가고, 비기면 제자리에 있습니다.
  4. 계단 제일 아래에서 지면 제자리에 있습니다.
  5. 2~4 과정을 열 번 반복합니다.

A와 B가 계단 게임을 완료한 후에, A가 계단 위 몇 번째 칸에 있는지 파악하려고 합니다.

A와 B가 낸 가위바위보 기록이 순서대로 들어있는 리스트 recordA와 recordB가 매개변수로 주어질 때, 게임을 마친 후의 A의 위치를 return 하도록 solution 함수를 작성했습니다. 그러나, 코드 일부분이 잘못되어있기 때문에, 몇몇 입력에 대해서는 올바르게 동작하지 않습니다. 주어진 코드에서 _한 줄_만 변경해서 모든 입력에 대해 올바르게 동작하도록 수정하세요.

매개변수 설명

A와 B가 낸 가위바위보 기록이 순서대로 들어있는 리스트 recordA와 recordB가 매개변수로 주어집니다.

  • recordA와 recordB의 원소는 0, 1, 2중 하나이고 순서대로 가위, 바위, 보를 의미합니다.
  • recordA와 recordB의 길이는 10입니다.

return 값 설명

solution 함수는 계단 게임을 마친 후에 A가 계단 위 몇 번째 칸에 위치하는지를 return 합니다.

  • 계단 제일 아래 칸은 0번째 칸입니다.

예시

recordA recordB return
[2,0,0,0,0,0,1,1,0,0] [0,0,0,0,2,2,0,2,2,2] 14

예시 설명

recordA 가위 가위 가위 가위 가위 바위 바위 가위 가위
recordB 가위 가위 가위 가위 가위
result 0 0 0 0 +3 +6 +9 +8 +11 +14

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

Contents of table:


Topic:
소용돌이 수

Review:
유명한 소용돌이 알고리즘 문제이다. 2차원 리스트 안에서, 원하는 대로 point 이동 알고리즘을 짤 수 있는가를 테스트하는 문제이다.

정답코드


1
2
def in_range(i, j, n): # i와 j값이 0보다크고 n보다 작은지 확인 
return 0 <= i and i < n and 0 <= j and j < n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def solution(n):
pane = [[0 for j in range(n)] for i in range(n)] # n * n 크기의 panel 을 만든다.
dy = [0, 1, 0, -1] # 2차원 리스트 panel 에서, (dy,dx)의 움직임은, (right, down, left, up)을 의미한다.
dx = [1, 0, -1, 0]
ci, cj = 0, 0 # 시작 포인트는 (0,0)
num = 1
while in_range(ci, cj, n) and pane[ci][cj] == 0: # 1) in_range 함수를 활용, current point가 panel을 벗어나지 않음. 2) 이동하는 칸에 숫자가 채워져 있지 않음.
for k in range(4): # dy, dx의 이동순서
if not in_range(ci, cj, n) or pane[ci][cj] != 0:
break
while True: # 1) pannel 범위안 2) 다음칸의 숫자가 비어있을 때, 무한루프
pane[ci][cj] = num # k = 0 일 때, panel의 범위 안에서 num +=1 만큼의 숫자를 각 칸에 입력
num += 1
ni = ci + dy[k] # next point는 current point 에서 (dy,dx) 만큼의 이동값을 가져간 결과이다.
nj = cj + dx[k]
if not in_range(ni, nj, n) or pane[ni][nj] != 0: # next point 가 pannel 을 벗어났을 경우, (down, left, up, right) 순서로 이동.
ci += dy[(k + 1) % 4] # (k+1) % 4 는 1 2 3 0
cj += dx[(k + 1) % 4]
break
ci = ni
cj = nj
return pane

문제내용

#문제5
다음과 같이 n x n 크기의 격자에 1부터 n x n까지의 수가 하나씩 있습니다.

이때 수가 다음과 같은 순서로 배치되어있다면 이것을 n-소용돌이 수라고 부릅니다.

소용돌이 수에서 1행 1열부터 n 행 n 열까지 대각선상에 존재하는 수들의 합을 구해야 합니다.

위의 예에서 대각선상에 존재하는 수의 합은 15입니다.
격자의 크기 n이 주어질 때 n-소용돌이 수의 대각선상에 존재하는 수들의 합을 return 하도록 solution 함수를 완성해주세요.


매개변수 설명

격자의 크기 n이 solution 함수의 매개변수로 주어집니다.

  • n은 1 이상 100 이하의 자연수입니다.

return 값 설명

n-소용돌이 수의 대각선상에 존재하는 수들의 합을 return 해주세요.


예시
n return
3 15
2 4
예시 설명

예시 #1
문제의 예와 같습니다.

예시 #2

1과 3을 더하여 4가 됩니다.