CS/알고리즘

[알고리즘] 구현 알고리즘

삶_ 2022. 6. 25. 11:12

  • 알고리즘은 간단한데 코드가 지나칠만큼 길어지는 문제
    • 실수 연산을 다루고, 특정 소수점 자리까지 출력해야하는 문제
    • 문자열을 특정한 기준에 따라서 끊어 처리해야하는 문제
    • 적절한 라이브러리를 찾아서 사용해야 하는 문제
  • 일반적인 알고리즘 문제의
    2차원 공간은 행렬의 의미로 사용함
    ex. 좌표 어딘가로 이동한다 는 문제 등
  • 시뮬레이션/탐색 문제는 2차원 공간에서의 방향 벡터가 자주 활용됨
    (특정위치(2,2)에서 이동)
    • (x, y) 좌표에서, (x는 세로, y는 가로)
      #동, 서, 남, 북
      dx = [0, 0, 1, -1]
      dy = [1, -1, 0, 0]
    • for i in range(4):
      nx = x + dx[i]
      ny = y + dy[i]

  • ex. 상하좌우 문제. 여행가는 NxN 크기의 정사각형 공간에 있다.
  • 가장 왼쪽위 좌표는 (1,1). 가장 오른쪽 아래 좌표는(n,n).
    상,하,좌,우 방향으로 이동할수있고, 시작좌표는 (1,1).
    L,R,U,D로 이동
    L : 왼쪽으로 한칸이동 >> 서
    R : 오른쪽으로 한칸이동 >> 동
    U : 위로 한칸이동 >> 북
    D : 아래로 한칸이동 >> 남
  • 첫째줄에 공간의 크기
    둘째줄에 여행가의 계획서 제출
    여행가가 최종적으로 도착할 지점의 좌표를 공백을 기준으로 출력한다
import sys

n = int(sys.stdin.readline())
l = list(sys.stdin.readline().split())
x, y = 1, 1 #초기좌표

# 방향마다 더할 변수를 넣기
dx = [0,0,-1,1]
dy = [-1,1,0,0]
move_type = ['L','R','U','D'] #방향 명시 (dx,dy 순서에 맞게)

#l안의 요소를 넣어주는 식
for i in l:
    #비교해서 연산하기
    for t in range(len(move_type)):
        if i == move_type[t]:
        #nx, ny 초기화를 제외해도 이렇게 쓸수있음
            nx = x + dx[t]
            ny = y + dy[t]
    #공간을 벗어나면 무시. 연산조차 안함
    if  nx < 1 or nx > n or ny < 1 or ny > n:
        continue;
    
    x, y = nx, ny

print(x,y)

  • 00:00:00부터 n시 59분 59초까지 모든 시각중에서
    3이 하나라도 포함되는 모든 경우의 수
    첫째줄에 정수 n
import sys

h = int(sys.stdin.readline())
cnt = 0

#n시간안 -> 60분안 -> 60초안 -> 문자열 다 더했을때 3이 있는 경우만 카운트+
for i in range(h+1):
    for m in range(60):
        for s in range(60):
            if '3' in str(i) + str(m) + str(s):
                cnt += 1 


print(cnt)

  • 8x8 평면이 있다
    좌표는 행은 1~8 열은 a~h
    그중 한칸에 나이트가 서있음
    나이트는 두가지 경우로 이동가능
    1. 수평으로 두칸 이동 + 수직으로 한칸이동
    2. 수직으로 두칸 이동 + 수평으로 한칸이동

    열과행이 순서대로 공백없이 입력된다
    나이트가 이동할수있는 경우의 수 출력
import sys

#나이트 위치 입력받기
data = sys.stdin.readline()
y = ord(data[0])-ord('a')+1
x = int(data[1])

#나이트가 이동할 수 있는 8가지 방향
steps = [(-2,-1),(-1,-2),(-2,1),(1,-2),(2,-1),(-1, 2),(2, 1),(1, 2)]

result = 0

# x와 y가 8초과, 1미만이 되지않아야 그곳으로 이동 가능한 것!
for step in steps:
    new_x = x+step[0]
    new_y = y+step[1]
    if new_x >=1 and new_x <=8 and new_y >= 1 and new_y <= 8:
        result +=1

print(result)

  • 알파벳 대문자 A~Z와 숫자 0~9 로만 구성된 문자열이 입력된다.
    모든 알파벳을 오름차순으로 정렬하여 이어서 출력한 뒤에,
    그 뒤에 모든 숫자들을 더한값을 이어 출력한다
#내가 푼 풀이

import sys

n = sys.stdin.readline().rstrip()
al = []
mt = 0

#나는 리스트에 넣고, 정렬, 출력을 다 따로했다
for i in range(len(n)):
    if 'A'<= n[i] <= 'Z':
        al += list(n[i])
    else:
        mt += int(n[i])

al.sort()
print(''.join(a for a in al)+str(mt))
#학습 코드

import sys

n = sys.stdin.readline().rstrip()
al = []
mt = 0

for i in n:
    if i.isalpha():
        al.append(i)
    else:
        mt += int(i)

al.sort()
print(''.join(al)+str(mt))