문제 2. 시각
- 입력 조건: 첫째 줄에 정수 N이 입력된다. (0 <= N <= 23)
- 출력 조건: 00시 00분 00초부터 N시 59분 59초까지의 모든 시각 중에서 3이 하나라도 포함되는 모든 경우의 수를 출력한다.
문제 해결 아이디어
이 문제는 가능한 모든 시각의 경우를 하나씩 모두 세서 풀 수 있는 문제이다.
(하나씩 일일이 센다는 점에서 전형적인 완전 탐색 문제 유형으로, 구현 문제라고도 볼 수 있다)
하루는 86,400초이므로, 00시 00분 00초부터 23시 59분 59초까지의 모든 경우는 86,400가지 이다.
(24 * 60 * 60 = 86,400)
따라서 단순히 시각을 1씩 증가시키면서 3이 하나라도 포함되어 있는지를 확인하면 된다.
이러한 유형은 완전 탐색(Brute Forcing) 문제 유형이라고 불린다.
가능한 경우의 수를 모두 검사해보는 탐색 방법을 의미한다.
h를 입력 받은 뒤
(for i in range(h+1)): i는 0부터 h까지 1씩 증가하도록 한다.
(for j in range(60)): 매번 j(분) 또한 0부터 59까지 증가하고
(for k in range(60)): j가 증가할 때마다 k 또한 0부터 59까지 증가할 수 있도록 한다. (k=초)
시, 분, 초 안에 3이 하나라도 포함되어 있는지를 세기 위해서
str(i) + str(j) + str(k): 시 분 초를 문자 형태로 만들어서 더한다.
3이 포함되어 있는지 확인해서 3이 포함되어 있다면 카운트를 증가시킨다 (count += 1)
결과적으로 count 값을 출력하면 3이 포함되어 있는 시각을 구할 수 있다.
문제 3. 왕실의 나이트
- 입력 조건: 첫째 줄에 8 X 8 좌표 평면 상에서 현재 나이트가 위치한 곳의 좌표를 나타내는 두 문자로 구성된 문자열이 입력된다. 입력 문자는 a1처럼 열과 행으로 이뤄진다.
- 출력조건: 첫째 줄에 나이트가 이동할 수 있는 경우의 수를 출력하시오.
문제 해결 아이디어
이 문제는 전형적인 시뮬레이션, 완전 탐색 유형이면서 2차원 좌표를 이용하는 구현 유형 문제이다.
나이트의 8가지 경로를 하나씩 확인하며 각 위치로 이동이 가능한지 확인한다.
리스트를 이용하여 8가지 방향에 대한 방향 벡터를 정의한다.
답안 예시
# 나이트가 이동할 수 있는 8가지 방향 정의
steps = [(-2, -1), …]: 2차원 배열을 이용해서 방향 벡터를 정의하였다.
dx, dy의 두 개의 리스트를 사용하지 않고 하나의 리스트를 사용하는 방법으로도 문제를 풀 수 있다.
#현재 나이트의 위치 입력받기
row = int(input-data[1]): 2번째 위치의 문자를 숫자로 바꾼 것이 나이트가 있는 행의 위치이고
column = int(ord(input_data[0])) - int(ord('a')) + 1: 열의 위치는 문자로 들어온 값을 아스키 코드 형태의 값으로 바꾸고, 그 값에 문자 a의 아스키 코드 값을 빼준 다음 1을 더하면 열의 위치를 찾을 수 있다.
#8가지 방향에 대하여 각 위치로 이동이 가능한지 확인
for step: 각각의 방향을 확인하면서
next_row, next_column: 다음 위치 값이 체스판을 벗어나지 않는다면 이동이 가능한 것이므로
#해당 위치로 이동이 가능하다면 카운트 증가
result += 1: 카운트를 증가시킨다.
문제 4. 문자열 재정렬
수와 숫자의 차이를 알아보자.
수는 100, 1000, 700과 같이 실제 정수와 같은 데이터이다.
숫자는 0부터 9 사이의 한 글자로 구성된 숫자 데이터이다.
K1KA5CB7에서 문자를 정렬한 값을 출력하고 1 + 5 + 7을 더한 값인 13을 덧붙여 출력한다.
문제 해결 아이디어
문자열이 입력되었을 때 문자를 하나씩 확인한다.
(숫자인 경우 따로 합계를 계산한다. 알파벳인 경우 별도의 리스트에 저장한다)
리스트에 저장된 알파벳을 정렬해 출력하고, 합계를 뒤에 붙여 출력하면 정답이다.
답안 예시
#숫자는 따로 더하기
value += int(x): 정수형 데이터로 바꿔서 value 값에 더해준다.
#숫자가 하나라도 존재하는 경우 가장 뒤에 삽입
if value != 0: :숫자가 하나 이상 존재한다면 value값이 0보다 크다.
result.append(str(value)): 0보다 크다면 문자열로 바꿔줘서 문자 리스트 뒤쪽에 붙여준다.
#최종 결과 출력
print(‘ ‘.join(result)): 공백 없이 리스트에 포함되어 있는 모든 문자열들을 일렬로 나열하여 출력하도록 만든다.
'이코테 강의 정리' 카테고리의 다른 글
(이코테 w/ Python) DFS & BFS 재귀함수 (Recursive Function) (0) | 2022.06.27 |
---|---|
(이코테 w/ Python) DFS & BFS - 스택과 큐 (0) | 2022.06.26 |
(이코테 w/ Python) 구현: 시뮬레이션과 완전 탐색 이론 (0) | 2022.06.24 |
(이코테 w/ Python) 그리디 알고리즘 2 (0) | 2022.06.23 |
(이코테 w/ Python) 그리디 알고리즘 1 (0) | 2022.06.22 |