[CodingTest] 구현(Implementation)

HyunDong Lee·2021년 7월 19일
0
post-thumbnail

상하 좌우

여행가 A가 N * N 크기의 정사각형 공간 위에 있고. 공간은 1 * 1크기의 정사각형으로 나누어져 있다. 가장 왼쪽 상단 좌표가 (1, 1)이고, 가장 오른쪽 하단 좌표는 (N, N)에 해당된다.

여행자는 상, 하, 좌, 우 방향으로만 이동할 수 있고, 시작 좌표는 항상 (1, 1)이다.

그리고 여행자 A가 이동할 계획이 적혀있는 계획서가 주어진다. 계획서는 띄어쓰기를 기준으로 L, R, U, D 중 하나의 문자가 반복적으로 주어진다.

각 문자의 의미는 다음과 같다.

  • L: 왼쪽으로 한 칸 이동
  • R: 오른쪽으로 한 칸 이동
  • U: 위로 한 칸 이동
  • D: 아래로 한 칸 이동

예를 들어 N=2 인 정사각형 공간은 아래와 같다.

입력 조건

  • 첫 째 줄에 공간의 크기를 나타내는 N이 주어진다. (1 ≤ N ≤ 100)
  • 둘째 줄에 여행가 A가 이동할 계획서 내용이 주어진다.

출력 조건

  • 첫째 줄에 여행가 A가 최종적으로 도착할 지점의 좌표 (X, Y)를 공백으로 구분하여 출력한다.

입력 예시

5

R R R U D D

출력

3 4

코드

# 상하 좌우

n = int(input()) # N x N 정방 행렬 사이즈의 공간
move = map(str, input().split()) # 어떻게 이동 시킬지 계산
move = list(move)
loc = [1, 1]

for i in range(len(move)):
    if (move[i] == 'R') & (loc[1] < n):
        loc[1] += 1
    elif (move[i] == 'D') &  (loc[0] < n):
        loc[0] += 1
    elif (move[i] == 'L') &  (loc[1] > 1):
        loc[1] -= 1
    elif (move[i] == 'U') &  (loc[0] > 1):
        loc[0] -= 1

print(loc[0], loc[1])

#TEST CASE
# 6
# R R R U U U D D D D D L L L
# [6, 1]

# 3
# R R R R R R R R R U U U D D D D D L L L L L
# 3 1

시각

정수 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이 하나라도 포함되는 모든 경우의 수를 출력하라

문제 해결 전략

초단위에 3이 포함되는 경우, 분단위에 3이 포함되는 경우의 수, 시단위에 3이 포함 되는 경우

이렇게 크게 3가지가 있다.

그래서 시간에 3이 포함 될 때 분, 초에 대한 모든 경우의 수를 더하고

분에는 모든 초에 대한 경우의 수를 더하고 ...

초에 대해서는 1씩 더해주면 된다.

코드

# 시각
N = int(input())
cnt = 0
# N시 59분 59초 까지
for i in range(N+1):
    if (i == 3) or (i % 10 == 3):
        cnt += 60 * 60
        continue
    for j in range(60):
        if (j == 3) or (j % 10 == 3) or (j // 10 == 3):
            cnt += 60
            continue
        for k in range(60):
            if (k == 3) or (k % 10 == 3) or (k //10 == 3):
                cnt += 1
                continue


print(cnt)

왕실의 나이트

문제

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

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

https://media.vlpt.us/images/suzieep/post/c01d7972-7c64-400b-a07c-664bb10ebc88/image.png

이처럼 8 × 8 좌표 평면상에서 나이트의 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 출력하는

프로그램을 작성하라. 왕실의 정원에서 행 위치를 표현할 때는 1부터 8로 표현하며, 열 위치를 표현할 때는

a 부터 h로 표현한다

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

입력

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

출력

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

입력 예시

a1

출력 예시

2

파이썬 공부

기본 형변환 종류

  • str(object)
  • int(object
  • chr(i) 숫자를 char로 변형
  • ord(ch) 문자를 정수 아스키 코드로 변환
# 왕실의 나이트

where = input()
move =[[-2, -1], [-1, -2], [2, -1], [2, 1], [-2, 1], [1, 2], [-1, 2], [1, -2]]
x, y = ord(where[0])-ord('a')+1, int(where[1])
loc = [x, y]
cnt = 0


for i in range(8):
    move[i][0] += loc[0]
    move[i][1] += loc[1]
    if move[i][0] > 0 and (move[i][0] <= 8) and ((move[i][1] > 0) and (move[i][1] <= 8)):
        cnt += 1
print(cnt)

게임 개발

현민이는 게임 캐릭터가 맵 안에서 움직이는 시스템을 개발 중이다. 캐릭터가 있는 장소는 1 X 1 크기의 정사각형으로 이뤄진 N X M 크기의 직사각형으로, 각각의 칸은 육지 또는 바다이다. 캐릭터는 동서남북 중 한 곳을 바라본다.

맵의 각 칸은 (A, B)로 나타낼 수 있고, A는 북쪽으로부터 떨어진 칸의 개수, B는 서쪽으로부터 떨어진 칸의 개수이다. 캐릭터는 상하좌우로 움직일 수 있고, 바다로 되어 있는 공간에는 갈 수 없다. 캐릭터의 움직임을 설정하기 위해 정해 놓은 매뉴얼은 이러하다.

  1. 현재 위치에서 현재 방향을 기준으로 왼쪽 방향(반시계 방향으로 90도 회전한 방향)부터 차례대로 갈 곳을 정한다.
  2. 캐릭터의 바로 왼쪽 방향에 아직 가보지 않은 칸이 존재한다면, 왼쪽 방향으로 횐전한 다음 왼쪽으로 한 칸을 전진한다. 왼쪽 방향에 가보지 않은 칸이 없다면, 왼쪽 방향으로 회전만 수행하고 1단계로 돌아간다.
  3. 만약 네 방향 모두 이미 가본 칸이거나 바다로 되어 있는 칸인 경우에는, 바라보는 방향을 유지한 채로 한 칸 뒤로 가고 1단계로 돌아간다. 단, 이때 뒤쪽 방향이 바다인 칸이라 뒤로 갈 수 없는 경우에는 움직임을 멈춘다.

현민이는 위 과정을 반복적으로 수행하면서 캐릭터의 움직임에 이상이 있는지 테스트하려고 한다. 메뉴얼에 따라 캐릭터를 이동시킨 뒤에, 캐릭터가 방문한 칸의 수를 출력하는 프로그램을 만드시오.

<입력 조건>

첫째 줄에 맵의 세로 크기 N과 가로 크기 M을 공백으로 구분하여 입력한다.(3 <= N, M <= 50)

둘째 줄에 게임 캐릭터가 있는 칸의 좌표 (A, B)와 바라보는 방햔 d가 각각 서로 공백으로 구분하여 주어진다. 방향 d의 값으로는 다음과 같이 4가지가 존재한다.

0 : 북쪽1 : 동쪽2 : 남쪽3 : 서쪽

셋째 줄부터 맵이 육지인지 바다인지에 대한 정보가 주어진다. N개의 줄에 맵의 상태가 북쪽부터 남쪽 순서대로, 각 줄의 데이터는 서쪽부터 동쪽 순서대로 주어진다. 맵의 외각은 항상 바다로 되어 있다.

0 : 육지1 : 바다처음에 게임 캐릭터가 위치한 칸의 상태는 항상 육지이다.

출력 조건

첫째 줄에 이동을 마친 후 캐릭터가 방문한 칸의 수를 출력한다.

입력 예시

4 4

1 1 0 // (1, 1)에 북쪽(0)을 바라보고 서 있는 캐릭터

1 1 1 1

1 0 0 1

1 1 0 1

1 1 1 1

출력 예시
3

문제 해결 전략

만약 네 방향 모두 이미 가본 칸이거나 바다로 되어 있는 칸인 경우에는, 바라보는 방향을 유지한 채로 한 칸 뒤로 가고 1단계로 돌아간다. 단, 이때 뒤쪽 방향이 바다인 칸이라 뒤로 갈 수 없는 경우에는 움직임을 멈춘다.

이 조건을 보지 않고 문제를 해결하려 했기 때문에 답이 계속 나오지 않았다. 한 칸 뒤로 이동하는 것은 바라보는 방향에서의 한 칸 뒤로 이동인데 그래서 이동을 시키기 전에 바다인지 육지인지 구분을 해야하고 포인터 캐릭터는 엄연히 말해서 이미 이동을 한 것일 수도 있지만 바다면 다시 원위치로 돌려놓게 된다.

추가 테스트 케이스

5 5
2 2 3
1 1 1 1 1
1 0 0 0 1
1 0 0 1 1
1 1 1 1 1
1 0 0 0 1
5

코드

#게임 개발
n, m = map(int, input().split())
direction = list(map(int, input().split()))
dx = [0, 1, 0, -1] # 북 동 남 서
dy = [-1, 0, 1, 0]
mp = []
cnt = 1
loc = [direction[0], direction[1]] # 좌표 공간

# map 입력 받기
for i in range(n):
    tmp = list(map(int, input().split())) # 임시 저장 공간
    mp.append(tmp)

flag = 0
toward = direction[2]
mp[loc[0]][loc[1]] = 1

while 1:
    # 방향을 찾는다.
    flag += 1
    toward -= 1
    toward %= 4
    loc[0] += dx[toward]
    loc[1] += dy[toward]
    
    if mp[loc[0]][loc[1]] == 0:
        cnt += 1
        flag = 0
        mp[loc[0]][loc[1]] = 1
    elif mp[loc[0]][loc[1]] == 1:
        loc[0] -= dx[toward]
        loc[1] -= dy[toward]
    
    if flag == 4:
        break
print(cnt)
# test case
# 5 5
# 2 2 3
# 1 1 1 1 1
# 1 0 0 0 1
# 1 0 0 1 1
# 1 1 1 1 1
# 1 0 0 0 1 
# 5

0개의 댓글