본문 바로가기

컴린이 일기장/Today I Learned

[TIL] 구현(Implementation) - 시뮬레이션, 완전 탐색 / 이코테 - 상하좌우, 시각, 왕실의 나이트, 문자열 재정렬

반응형

[Today I Learned]

#  구현

- 풀이를 떠올리는 건 쉽지만 소스코드로 옮기기 어려운 문제들

- 2차원 공간 → 행렬(Matrix) 많이 등장 (파이썬은 2차원 리스트)

왼쪽 위가 (0,0)

- 시뮬레이션 및 완전 탐색 문제에서는 2차원 공간에서의 방향 벡터가 자주 활용됨

 

#  이코테 - 상하좌우

여행가 A는 N × N 크기의 정사각형 공간 위에 서 있다. 이 공간은 1 × 1 크기의 정사각형으로 나누어져 있다.가장 왼쪽 위 좌표는 (1, 1)이며, 가장 오른쪽 아래 좌표는 (N, N)에 해당한다.여행가 A는 상, 하, 좌, 우 방향으로 이동할 수 있으며, 시작 좌표는 항상 (1, 1)이다. 우리 앞에는 여행가 A가이동할 계획이 적힌 계획서가 놓여 있다
계획서에는 하나의 줄에 띄어쓰기를 기준으로 L, R, U, D 중 하나의 문자가 반복적으로 적혀있다.각 문자의 의미는 다음과 같다
L: 왼쪽으로 한 칸 이동 R: 오른쪽으로 한 칸 이동 U: 위로 한 칸 이동 D: 아래로 한 칸 이동
이때 여행가 A가 N × N 크기의 정사각형 공간을 벗어나는 움직임은 무시된다예를 들어 (1, 1)의 위치에서 L 혹은 U를 만나면 무시된다다음은 N = 5인 지도와 계획이다

입력
첫째 줄에 공간의 크기를 나타내는 N이 주어집니다. (1<=N<=100)둘째 줄에 여행가 A가 이동할 계획서 내용이 주어집니다. (1<=이동 횟수<=100)

출력
첫째 줄에 게임의 룰에 맞게 선택한 카드에 적힌 숫자를 출력

입력 예시
5
R R R U D D

출력 예시 3 4

 

@solution.py

space = int(input())
move = input().split() # > list

x = 1 
y = 1

info = {'L':(0,-1),'R':(0,1),'U':(-1,0),'D':(1,0)}

for m in move:

    dx = x + info[m][0] 
    dy = y + info[m][1] # dx, dy 반복문 바깥에서의 초기화 필요 X

    if dx < 1 or dx > space or dy < 1 or dy > space:
        continue

    x = dx
    y = dy

print(x,y)

// 시뮬레이션 유형

 

#  이코테 - 시각

정수 N이 입력되면 00시 00분 00초부터 N시 59분 59초까지의 모든 시각 중에서 3이 하나라도 포함되는모든 경우의 수를 구하는 프로그램을 작성하라. 예를 들어 1을 입력했을 때다음은 3이 하나라도 포함되어 있으므로 세어야 하는 시각이다

00시 00분 03초00시 13분 30초
반면에 다음은 3이 하나도 포함되어 있지 않으므로 세면 안 되는 시각이다
00시 02분 55초01시 27분 45초

입력
첫째 줄에 정수 N이 입력된다.(0<=N<=23)

출력
00시 00분 00초부터 N시 59분 59초까지의 모든 시각 중에서 3이 하나라도 포함되는 모든 경우의 수를 출력한다.

입력 예시
5

출력 예시
11475

 

@solution.py

hours = int(input())

count = 0

for h in range(hours+1):
    for m in range(60):
        for s in range(60):

            time = str(h) + str(m) + str(s)
  
            if '3' in time:
                count +=1 

print(count)

// 완전 탐색 유형

 

#  이코테 - 왕실의 나이트

행복 왕국의 왕실 정원은 체스판과 같은 8 × 8 좌표 평면이다. 왕실 정원의 특정한 한 칸에 나이트가 서있다.나이트는 매우 충성스러운 신하로서 매일 무술을 연마한다나이트는 말을 타고 있기 때문에 이동을 할 때는 L자 형태로만 이동할 수 있으며 정원 밖으로는 나갈 수 없다나이트는 특정 위치에서 다음과 같은 2가지 경우로 이동할 수 있다

수평으로 두 칸 이동한 뒤에 수직으로 한 칸 이동하기
수직으로 두 칸 이동한 뒤에 수평으로 한 칸 이동하기

이처럼 8 × 8 좌표 평면상에서 나이트의 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 출력하는프로그램을 작성하라. 왕실의 정원에서 행 위치를 표현할 때는 1부터 8로 표현하며, 열 위치를 표현할 때는a 부터 h로 표현한다

c2에 있을 때 이동할 수 있는 경우의 수는 6가지이다a1에 있을 때 이동할 수 있는 경우의 수는 2가지이다

입력
첫째 줄에 8x8 좌표 평면상에서 현재 나이트가 위치한 곳의 좌표를 나타내는 두 문자로 구성된 문자열이 입력된다. 입력 문자는 a1 처럼 열과 행으로 이뤄진다.

출력
첫째 줄에 나이트가 이동할 수 있는 경우의 수를 출력하시오.

입력 예시
a1

출력 예시
2

@solution.py

loc = input()
loc = (ord(loc[0]), int(loc[1]))

move = [(2,1),(2,-1),(-2,1),(-2,-1),(1,2),(1,-2),(-1,2),(-1,-2)]

count = 0
for m in move:
    dx = loc[0] + m[0]
    dy = loc[1] + m[1]

    if ord('a') > dx or ord('h') < dx or dy < 1 or dy > 8:
        continue
    else:
        count +=1

print(count)

 

#  이코테 - 문자열 재정렬

문제 정의
알파벳 대문자와 숫자(0 ~ 9)로만 구성된 문자열이 입력으로 주어집니다. 이때 모든 알파벳을 오름차순으로 정렬하여 이어서 출련한 뒤에, 그 뒤에 모든 숫자를 더한 값을 이어서 출력합니다.
 
예를 들어 K1KA5CB7이라는 값이 들어오면 ABCKK13을 출력합니다.
 
입력
첫째 줄에 하나의 문자열 S가 주어집니다. (1 <= S의 길이 <= 10,000)
 
출력
첫째 줄에 문제에서 요구하는 정답을 출력합니다.

입력 예시
KIKA5CB7

출력 예시
ABCKK13

 

@solution.py

string = input()

alpha = []
num = 0

for s in string:
    if s.isalpha():
        alpha.append(s)
    
    else:
        num += int(s)

alpha = sorted(alpha)

print(''.join(alpha)+str(num))

그런데 이렇게 풀면 num이 0인 경우에도 끝에 0이 붙어 나오게 된다. 따라서 아래처럼 예외처리를 추가해줘야한다.

string = input()

alpha = []
num = 0

for s in string:
    if s.isalpha():
        alpha.append(s)
    
    else:
        num += int(s)

alpha = sorted(alpha)

if num > 0:
    alpha.ppend(str(num))
    
print(''.join(alpha))
반응형