이코테 강의 정리

(이코테 w/ Python) 구현: 시뮬레이션과 완전탐색 문제 풀이

김디니 2022. 6. 25. 22:14

문제 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)): 공백 없이 리스트에 포함되어 있는 모든 문자열들을 일렬로 나열하여 출력하도록 만든다.