[이코테] 구현 문제 풀이

이말감·2022년 1월 31일
0

알고리즘

목록 보기
8/11

예제

예제 4-1 상하좌우

n = int(input())

way = list(map(str, input().split()))

lrud = "LRUD"
lrudList = [[0,-1], [0,1], [-1,0], [1,0]]

i, j = 1, 1

for w in way :
    point = lrudList[lrud.index(w)]
    ni = i + point[0]
    nj = j + point[1]
    if 1 <= ni <= n and 1 <= nj <= n :
        i = ni
        j = nj

print(i, j)

예제 4-2 시각

n = int(input())

num = 0
for h in range(0, n+1) :
    for m in range(0, 60) :
        for s in range(0, 60) :
            if "3" in str(h) or "3" in str(m) or "3" in str(s):
            # 어차피 문자열이기 때문에 "3" in str(h) + str(m) + str(s) 로 사용 가능
                num += 1

print(num)

실전 문제

실전 문제 - 왕실의 나이트

alpha = " abcdefgh"

a, n = map(str, input())

pa = alpha.index(a)
pn = int(n)

point = [[-1, 2], [1, 2], [-1, -2], [1, -2], [-2, 1], [-2, -1], [2, 1], [2, -1]]
answer = 0
for i in range(8) :
    da = pa + point[i][0]
    dn = pn + point[i][1]
    if 1 <= da <= 8 and 1<= dn <= 8 :
        answer += 1

print(answer)
    

실전 문제 - 게임 개발


n, m = map(int, input().split())

a, b, d = map(int, input().split())

graph = []

for _ in range(n) :
    graph.append(list(map(int, input().split())))

# 0,1,2,3 : 북, 동, 남, 서
direct = [[0,-1], [-1, 0], [0, 1], [1, 0]]

backdirect = [[1,0],[0,-1],[-1,0],[0,1]]

graph[a][b] = 1
check = 0
answer = 1
while True :
    da = a + direct[d][0]
    db = b + direct[d][1]
    if check == 4:
        ba = da + backdirect[d][0]
        bb = db + backdirect[d][1]
        if 0 <= ba < n and 0 <= bb < m and graph[ba][bb] != 1:
            a, b = ba, bb
            check = 0
            continue
        break
    if 0 <= da < n and 0 <= db < m :
        # 가보지 않은 칸
        if graph[da][db] == 0 :
            graph[da][db] = 2
            a, b = da, db
            check = 0
            answer += 1
            d -= 1
            if d < 0 :
                d = 3
            continue
    check += 1
    # 맵 범위 외 공간이거나 이미 가본 칸/바다
    d -= 1
    if d < 0 :
        d = 3

print(answer)
  • 풀이
    답지는 풀이가 엄청 긴데 내가 푼 풀이는 너무 짧아서 맞는지 사실 모르겠다.
    일단 북, 동, 남, 서 방향에서 왼쪽 칸을 확인할 때를 위해 direct 배열을 만들었고,
    da, db를 통해 해당 칸의 값이 무엇인지 받아왔다.
    값이 육지인 0이라면 방문표시를 해주고 a,b 값을 바꿔준다. 그리고 방향을 현재 기준에서 왼쪽으로 돌리는데 보니까 왼쪽으로 돌릴 때마다 d 값이 -1되는 걸 알 수 있다. 북쪽(0)에서 -1하면 서쪽(3)이니까 이때는 조건문으로 d = 3
    그다음 check 변수를 이용해서 4번동안 가본 칸이나 맵 바깥쪽, 바다인 칸을 확인한 경우
    먼저 뒤쪽이 육지인지 여부를 확인해서 육지이면 현재 좌표를 뒤로 옮긴다.
    그런데 육지가 아니면 break

  • 얼레벌레 흐름도

일단 대충 내가 작성한 코드를 바탕으로 흐름도를 작성했는데...
예시 답안이 없어서 맞는지 모르겠다.
일단 여기에 매달릴 시간 없으니까 패스

profile
전 척척학사지만 말하는 감자에요

0개의 댓글