[Python] 이것이 코딩 테스트다 with Python - 구현
이것이 코딩 테스트다 with Python - 구현
1. 구현
-
알고리즘을 소스코드로 바꾸는 과정
-
풀이는 생각하기 쉽지만 소스 코드로 옮기기 어려운 것 -> 연습 필요
2차원 공간
-
행렬
(0,0) (0,1) (0,2) (0,3) (0,4) (1,0) (1,1) (1,2) (1,3) (1,4) (2,0) (2,1) (2,2) (2,3) (2,4) (3,0) (3,1) (3,2) (3,3) (3,4) (4, 0) (4,1) (4,2) (4,3) (4,4) - 행 (세로 = row) / 열 (가로 = column)
시뮬레이션
-
완전 탐색 2차원 벡터 : 방향 벡터
-
(0,0) (0,1) (0,2) (0,3) (0,4) (1,0) (1,1) (1,2) (1,3) (1,4) (2,0) (2,1) (2,2) (2,3) (2,4) (3,0) (3,1) (3,2) (3,3) (3,4) (4, 0) (4,1) (4,2) (4,3) (4,4) # 동 북 서 남 dx = [0, -1, 0, 1] # 행 (0, 위쪽, 0, 아래쪽) dy = [1, 0, -1, 0] # 열 (오른쪽, 0, 왼쪽, 0) # 현재 위치 x, y = 2, 2 for i in range(4): nx = x + dx[i] // 행 방향 ny = y + dy[i] // 열 방향 print(nx, ny)
문제 1 > 상하좌우
- A는 정사각형 N x N 위에 서 있다.
- 가장 왼쪽 위의 좌표는 (1, 1)이다. 가장 오른쪽 아래는 (N, N) 이다.
- 상하좌우로 움직일 수 있고 시작좌표는 (1, 1)이다.
- L : 왼쪽으로 한 칸 이동 / R : 오른쪽으로 한 칸 이동 / U : 위쪽으로 한 칸 이동 / D : 아래쪽으로 한 칸 이동
-
(1,1) 에서 L이나 U는 무시 됩니다.
##### 입력 예시
5
R R R U D D
출력 예시
3 4
해결
n = int(input())
line = input().split()
basic = ['L', 'R', 'U', 'D']
# 동 서 남 북
dx = [0, 0, 1, -1]
dy = [-1, 1, 0, 0]
x, y = 1, 1
nx, ny = 0, 0
for b in basic:
for i in range(len(line)):
if line[i] == b:
nx = x + dx[i]
ny = y + dy[i]
# 공간을 벗어나는 경우
if nx < 1 or ny < 1 or nx > n or ny > n:
continue
# 이동 수행
x, y = nx, ny
print(x, y)
문제 2 > 시각
- 정수 N 입력, 00시 00분 00초 ~ N시 59분 59초까지 모든 시각 중 3이 하나라도 포함되는 모든 경우의 수를 구하라
- 예 ) 1 입력 : 00시 00분 03초, 00시 13분 30초 , … 등
입력 예시
5
출력 예시
11475
해결
hour = int(input())
count = 0
for h in range(hour+1):
for m in range(60):
for s in range(60):
if '3' in str(i)+str(m)+str(s):
count += 1
print(count)
- 하루는 86,400 초 (24*60*60) 이므로 완전 탐색을 이용해 계산할 수 있다.
문제 3 > 왕실의 나이트
- 8 X 8 좌표 평면에 L자 형태로 이동한다.
- 수평 2칸 이동 후 수직 1칸 이동 할 수 있고
- 수직 2칸 이동 후 수평 1칸 이동 할 수 있다.
- 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 구하라.
- 왕실의 정원에서 행 위치를 표현 할 때 1~8로 표현, 열 위치를 표현 할 때 a ~ h 로 표현 한다.
- 예) c2에 있을 때 6가지
- a1일 때에는 2가지
입력 예시
a1
출력 예시
2
해결
# 현재 나이트위 위치 입력 받기
input_data = input()
row = int(input_data[1]) # 행 세로
column = int(ord(input_data[0])) - int(ord('a')) + 1 # 열 가로
# 나이트가 이동할 수 있는 8가지 방향 정의
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 = column + step[1]
# 해당 위치로 이동이 가능하다면 카운트 증가
if next_row >= 1 and next_row <= 8 and next_column >= 1 and next_column <= 8:
result += 1
print(result)
문제 4 > 문자열 재정렬
- 알파벳 대문자와 숫자(0~9)로만 구성된 문자열이 입력으로 주어집니다.
- 모든 알파벳은 오름차순으로 정렬하여 이어서 출력한 뒤 , 그 뒤 모든 숫자를 더한 값을 이어서 출력합니다.
- 예) K1KA5CB7 -> ABCKK13
입력 예시
K1KA5CB7
AJKDLSI412KSJSJ9D
출력 예시
ABCKK13
ADDIJJJKKLSS20
해결
data = input()
result = []
value = 0
# 문자를 확인하며
for x in data:
# 알파벳인 경우 리스트에 삽입
if x.isalpha():
result.append(x)
# 숫자인 경우 더해주기
else :
value += int(x)
# 오름차순 정렬
result.sort()
# 숫자가 하나 이상인 경우 가장 뒤에 삽입
if value != 0:
result.append(str(value))
# 리스트를 문자열로 변환해서 출력
print(''/join(result))
Leave a comment