구현 문제: 시각, 왕실의 나이트
1. [이것이 코딩테스트이다] 시각 문제
문제) 정수 N이 입력되면 00시 00분 00초부터 N시 59분 59초까지의 모든 시각 중에서 3이 하나라도 포함되는 모든 경우의 수를 구하는 프로그램을 작성하시오
입력 예시
5
출력 예시
11475
해결)
N = int(input())
result = 0
for i in range(N + 1):
for j in range(60):
for k in range(60):
# 매 시각 안에 '3'이 포함되어 있다면 카운트 증가
# 두자리 숫자는 '3'이 포함되어 있는지 확인하기 어려우므로 문자열로 바꿔서 확인
# in 키워드, find() 함수를 사용하여 특정 문자열 포함되어 있는지 확인
if '3' in str(i) + str(j) + str(k):
result += 1
print(result)
시, 분, 초로 중첩 반복문을 만들어서 00:00:00부터 N:59:59까지 차례로 확인하여 3이 포함되어 있는 시간 횟수를 세준다.
아이디어) string으로 생각해서 in 이용
########### List 외에도 (1) 문자열 ###########
if 'p' in 'python':
print(True)
else:
print(False)
-------------------------
True
############# (2)Tuple #############
if 'a' in ('a','b','c'):
print(True)
else:
print(False)
-------------------------
True
########### (3)Dict ###########
if 'a' in {'a':1,'b':2}:
print(True)
else:
print(False)
---------------------------
True
주의) 해당 시간에 3이 아무리 많이 포함되어 있어도 한 회로 취급
2. 왕실의 나이트
문제)
행복 왕국의 왕실 정원은 체스판과 같은 8 × 8 좌표 평면이다. 왕실 정원의 특정한 한 칸에 나이트가 서있다.
나이트는 매우 충성스러운 신하로서 매일 무술을 연마한다
나이트는 말을 타고 있기 때문에 이동을 할 때는 L자 형태로만 이동할 수 있으며 정원 밖으로는 나갈 수 없다
나이트는 특정 위치에서 다음과 같은 2가지 경우로 이동할 수 있다
- 수평으로 두 칸 이동한 뒤에 수직으로 한 칸 이동하기
- 수직으로 두 칸 이동한 뒤에 수평으로 한 칸 이동하기
이처럼 8 × 8 좌표 평면상에서 나이트의 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 출력하는
프로그램을 작성하라. 왕실의 정원에서 행 위치를 표현할 때는 1부터 8로 표현하며, 열 위치를 표현할 때는
a 부터 h로 표현한다
- c2에 있을 때 이동할 수 있는 경우의 수는 6가지이다
- a1에 있을 때 이동할 수 있는 경우의 수는 2가지이다
입력
첫째 줄에 8x8 좌표 평면상에서 현재 나이트가 위치한 곳의 좌표를 나타내는 두 문자로 구성된 문자열이 입력된다. 입력 문자는 a1 처럼 열과 행으로 이뤄진다.
출력
첫째 줄에 나이트가 이동할 수 있는 경우의 수를 출력하시오.
입력 예시
a1
출력 예시
2
해결 1)
dot = list(input())
x = ord(dot[0])-96
y = int(dot[1])
cnt = 0
dx = [-1,1,2,2,1,-1,-2,-2]
dy = [2,2,1,-1,-2,-2,-1,1]
for i in range(len(dx)):
nx = x+dx[i]
ny = y+dy[i]
if nx<=8 and nx>=1 and ny>=1 and ny<=8:
cnt+=1
print(cnt)
ord 를 이용해서 char을 int로
하나의 문자를 인자로 받고 해당 문자에 해당하는 유니코드 정수를 반환합니다
* 반대로 chr은 하나의 정수를 인자로 받고 해당 정수에 해당하는 유니코드 문자를 반환/ chr(97)을 하면 문자 'a'를 반환
아이디어) x, y 좌표 움직임 한 쌍을 dx, dy 두 개의 list로 나눈 다음에 for문으로 돌면서 확인
해결 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)]
# 8가지 방향에 대하여 각 위치로 이동이 가능한지 확인
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)
아이디어)
(1) List 요소값으로 tuple이 가능함을 활용
>>> a = [(1,2), (3,4), (5,6)]
>>> for (first, last) in a:
... print(first + last)
...
3
7
11
(2) 현재의 위치에서 움직일 수 있을까 없을까를 따지지 말고, 움직인 다음에 조건에 안 맞으면 반영 안하기