(모든 출처는 이코테입니다.)
구현이란, 머릿속에 있는 알고리즘을 소스코드로 바꾸는 과정입니다.
문자열은 파이썬이 상대적으로 편하다고 함.
라이브러리를 적절히 알아두면 좋음
- 일반적으로 알고리즘 문제에서의 2차원 공간은 행렬의 의미로 사용된다.
- 시뮬레이션 및 완전 탐색 문제에서는 2차원 공간에서의 방향 벡터가 자주 활용됨
x 가 세로축 (행)
<문제> 상하좌우 : 문제 설명
- 여행가 A는 N x N 크기의 정사각형 공간 위에 서 있습니다. 이 공간은 1x1 크기의 정사각형으로 나누어져 있습니다. 가장 왼쪽 위 좌표는 (1,1) 이며, 가장 오른쪽 아래 좌표는 (N,N)에 해당합니다. 여행가 A는 상,하,좌,우 방향으로 이동할 수 있으며, 시작 좌표는 항상(1,1)입니다. 우리 앞에는 여행가 A가 이동할 계획이 적인 계획서가 놓여있습니다.
- 계획서에는 하나의 줄에 띄어쓰기를 기준으로 하여 L,R,U,D 중 하나의 문자가 반복적으로 적혀있습니다.
각 문자의 의미는
- L : 왼쪽으로 한칸
- R : 오른쪽으로 한칸
- U : 위로 한칸
- D : 아래로 한칸
- 이 때 여행자 A가 N x N 크기의 정사각형 공간 벗어나는 움직임 무시된다.
(1,1)에서 L 혹은 U만나면 무시된다.
100 x 100 이라면 총 만개만큼의 위치가 존재한다고 볼 수 있음
생각을...해보자....
시작 좌표는 (1,1)
벗어나면 안될때는
L 이 안되는 것
(x,1)
R 이 안되는 것
(x, 5)
U 가 안되는 것
(1, x)
D 가 안되는 것
(5, x)
if문으로
L,R,U,D 에 맞게 좌표 변경하되,
위의 조건도 넣어주는건가..
문제 해결 아이디어
- 이 문제는 요구 사항 대로 충실히 구현하면 되는 문제이다.
- 일련의 명령에 따라서 개체를 차례 대로 이동시킨다는 점에서 시뮬레이션 유형으로도 분류 되며 구현이 중요한 대표적인 문제 유형이다.
- 다만, 알고리즘 교재나 문제 풀이 사이트에 따라서 다르게 일컬을 수 있으므로, 코딩 테스트에서의 시뮬레이션 유형, 구현 유형, 완전 탐색 유형은 서로 유사한점이 많다는 정도로만 기억하자.
정답을 살펴보자
# N 입력받기
n = int(input())
x , y = 1 , 1
plans = input().split()
# L,R,U,D 에 따른 이동방향
dx = [0,0,-1,1]
dy = [-1,1,0,0]
move_types = ['L','R','U','D']
# 이동 계획을 하나씩 확인하기
for plan in plans :
# 이동 후 좌표 구하기
for i in range(len(move_types)):
if plan == move_types[i]:
nx = x + dx[i]
ny = y + dy[i]
# 공간을 벗어나는 경우 무시
if nx < 1 or ny < 1 or nx > n or ny > n:
continue
# 이동 수행
x , y = nx, ny
print(x,y)
생각한건 비슷한데
배열에 담는걸!!생각했어야지!!!!!!
omg다증말루~!~!~!
nx, ny 같은 경우 따로 초기화하지않고 반복문 내에서 초기화를 해줘도 밖에서 부를 수 있다고
<문제> 시각 :문제 설명
- 정수 N이 입력되면 00시 00분 00초부터 N시 59분 59초까지의 모든 시각중에서 3이 하나라도 포함되는 모든 경우의 수를 구하는 프로그램을 작성하시오. 예컨대 1을 입력했을 때 다음은 3이 하나라도 포함되어있으므로 세어야 하는 시각입니다
- 00시 00분 03초
- 00시 13분 30초
다음은 세면 안되는 시각
- 00시 02분 55초
- 01시 27분 45초
0~1시 사이의 3 경우의 수 * N 하면 안되나?
생각해보면 분이나 초나
다만, 1분 =60초이므로
0~59초 에서 3이 나올 경우의 수 를 m
0~59분 에서 3이 나올 경우의 수 = n
초는 분마다 반복되고, 분은 시간마다니까
총 경우의 수는
= (n + m*n)*시간
이거 아닐까?
코드는..3이 나올 경우의 수를 어떻게 찾지?
3으로 나누어 떨어지는 수를 세는걸까?
문제 해결 아이디어
- 이 문제는 가능한 모든 시각의 경우를 하나씩 모두 세서 풀 수 있는 문제
- 하루는 86,400초 이므로, 00시 00분 00초부터 23시 59분 59초까지의 모든 경우는 86,400이다.
- 24*60*60 = 86400\
- 따라서 단순히 시각을 1씩 증가시키면서 3이 하나라도 포함되어있는지를 확인하면 된다.
- 이러한 유형은 완전탐색 문제 유형이라고 불린다.
- 가능한 모든 경우의 수를 검사해보는 탐색방법
# H 입력받기
h = int(input())
count = 0
for i in ragne(h+1):
for j in range(60):
for k in range(60):
# 매 시각 안에 '3' 이 포함되어 있다면 카운트 증가
if '3' in str(i) + str(j) + str(k): #이게..가능한거였어?!?!
count +=1
print(count)
와 코드 개쉽네..?
와..
<문제> 왕실의 나이트 : 문제 설명
- 행복 왕국의 왕실 정원은 체스판과 같은 8 x 8 좌표 평면이다. 왕실 정원의 특정한 한 칸에 나이트가 서있다. 나이트는 매우 충성스러운 신하로서 매일 무술을 연마한다.
문제 해결 아이디어
- 요구사항대로 충실히 구현하면 되는 문제
- 나이트의 8가지 경로를 하나씩 확인하며 각 위치로 이동이 가능한지 확인한다.
- 리스트를 이용하여 8가지 방향에 대한 방향벡터 정의
#현재 나이트의 위치 입력받기
input_data = input()
row = int(input_data[1])
문자로 들어온 값을 아스키로 바꾸고 빼준다음에 컬럼의 위치를 찾을수있다는데..
colume = int(ord(input_data[0])) - int(ord('a')) +1
# 나이트가 이동할 수 있는 8가지 방향 정의
steps = [(-2,-1),(-1,-2),(1,-2),(2,-1),(2,1),(1,2),(-1,2),(-2,1)]
# 8가지 방향에 대하여 각 위치로 이동이 가능한지 확인
result = 0
for step in steps :
# 이동하고자 하는 위치 확인
next_row = row+step[0]
next_column=column+step[1]
# 해당 위치로 이동이 가능하다면 카운트 증가
if next_row >=1 and next_row <=8 and next_column >=1 and next_column <=8:
result +=1
print(result)
<문제> 문자열 재정렬: 문제 설명
- 알파벳 대문자와 숫자 (0~9)로만 구성된 문자열이 입력으로 주어집니다. 이때 모든 알파벳을 오름차순으로 정렬하여 이어서 출력한뒤에, 그 뒤에 모든 숫자를 더한 값을 이어서 출력합니다.
-예를들어 K1KA5CB7이라는 값이 들어오면 ABCKK13을 출력합니다.
문제 해결 아이디어
- 요구사항대로 충실히 구현
- 문자열이 입력되었을 때 문자를 하나씩 확인
- 숫자인 경우 따로 합계 계산
- 알파벳은 별도의 리스트 저장
와 이렇게 생각했어!
- 결과적으로 리스트에 저장된 알파벳 정렬 출력, 합계 뒤에 붙여 출력하면 정답
data = input()
result = []
value = 0
#문자를 하나씩 확인하며
for x in data :
# 알파벳이 ㄴ경우 결과 리스트에 삽입
if x.isalpha():
result.append(x)
#숫자는 따로 더하기
else:
value +=int(x)
#알파벳을 오름차순으로 정렬
result.sort()
#숫자가 하나라도 존재하는 경우 가장 뒤에 삽입
if value !=0:
result.append(str(value))
#최종 결과 출력(리스트를 문자열로 변환하여 출력)
print(''.join(result)) #공백없이
append , join 이라는 메소드도 공부해야겠는걸
'✍️2023 > Algorithm' 카테고리의 다른 글
[프로그래머스/그리디] - 체육복 (0) | 2023.04.22 |
---|---|
[BOJ/1212] 구현 문제 (0) | 2023.04.21 |
[BOJ/1439] 그리디 문제 (1) | 2023.04.20 |
[이코테] 그리디 (2) | 2023.04.18 |
python 코테준비- 문법공부 (2) (0) | 2023.04.18 |