알고리즘/문제풀이

구현 -4문제

sshhhh 2023. 9. 13.

구현

머릿속에 있는 알고리즘을 소스코드로 바꾸는 과정

->풀이를 떠오르는것은 쉽지만 소스코드로 옮기기 어려운 문제

 

-알고리즘은 간단한 코드가 지나칠 만큼 길어지는 문제

-실수 연산을 다루고, 특정 소수점 자리까지 출력

-문자열을 특정한 기준에 따라 끊어 처리

-적절한 라이브러리를 찾아 사용(순열,조합)

 

2차원 공간에서의 처리

다양한 시뮬레이션 공간 : 한 좌표에 존재하는 캐릭터가 반복적으로 어떤 위치로 이동한다. 

 

어떤방향으로 이동할지 적을 수 있다.

dx =[0]  ->행은 가만히 있고

dy =[1]  ->열을 기준으로 하나 증가 ==오른쪽으로 이동

 

 


1.상하좌우

2차원 행렬의 인덱스느 (0,0)으로 시작한다.

하지만 문제에서 (1,1)으로 출발한다고 하면

가장 첫번째 인덱스 사용하지 않는 방법 or (1,1)을 (0,0)인 것 처럼 사용 하는 방법 이 있다. 

(3,4) 출력하면 정답
-n= 100X100 하면 10000개 만큼의 위치가 존재한다고 할 수 있다
구현 = 완전탐색,시뮬레이션

# 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)

"""
1행 입력 : 5
4행 입력 : R R R U D D
출력 : 3 4
"""

2.시각

N : 0시~23시

 

하나씩 다 센다 = 전형적인 완전 탐색 유형

파이썬 : 1초에 2000만번 계산 = 합리적

 

# H(시간)를 입력받기
h = int(input())

count = 0
for i in range(h + 1): #0부터 h까지 1씩 증가
    for j in range(60): #분 (0~59)
        for k in range(60): #초
            # 매 시각 안에 '3'이 포함되어 있다면 카운트 증가
            if '3' in str(i) + str(j) + str(k): #시분초를 문자열 형태로 만들어서 더해버린다 =>시분초 문자열 하나로 합쳐버림
                count += 1

print(count)

"""
1행 입력 : 5
출력 : 11475

"""

 


3.왕실의 나이트

 

 

전형적인 시뮬레이션과 완전탐색

 

 

 

 

ord()는 하나의 문자에 대한 아스키 코드(ASCII Code) 정수 값을 반환합니다.

열(column) 변수는 체스판의 가로축 인덱스를 의미합니다. 가로축은 a부터 h까지 존재하므로, 인덱스값을 계산하기 위해 'a'의 아스키코드 값만큼 빼주는 것입니다. 다만 이 문제에서는 인덱스가 1부터 출발하므로 추가적으로 1을 더해줍니다.

 

ord( )
문자열을 아스키코드로 반환할 수 있는 함수이다.

>>> ord('a')
97

>>> ord('z')
122

chr( )
아스키코드를 문자열로 변환하는 함수이다.

>>> chr(65)
A

>>> chr(90)
Z

https://codedragon.tistory.com/2547 

 

알파벳 아스키코드표 (Alphabet ASCII Code)

ASCII 코드 표 (Alphabet ASCII Code table) 10진수 부호 10진수 부호 065 A 097 a 066 B 098 b 067 C 099 c 068 D 100 d 069 E 101 e 070 F 102 f 071 G 103 g 072 H 104 h 073 I 105 i 074 J 106 j 075 K 107 k..

codedragon.tistory.com

 


 

# 현재 나이트의 위치 입력받기
input_data = input()
row = int(input_data[1]) #두번째 위치의 문자를 숫자로 바꾼게 행
column = int(ord(input_data[0])) - int(ord('a')) +1  #아스키코드로 바꿔서 열 위치 찾음
#a=97-97+1=0 ->(0,1)에 나이트가 서 있는 것을 표현할 수 있다.

"""
a 아스키 코드 값 : 97
(열,행)으로 입력받는 중
c2 라면..(3,2)
c의 아스키코드 값 : 99
c =99-96
column = int(ord(input_data[0])) - (int(ord('a')) -1 ) #아스키코드로 바꿔서 열 위치 찾음

입력 : c2
출력 : 6
"""

# 나이트가 이동할 수 있는 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)
"""
a1
2
"""

 

 


4.문자열 재정렬

 

 

 

data = input()
result = []
value = 0

# 문자를 하나씩 확인하며
for x in data:
    # 알파벳인 경우 결과 리스트에 삽입 :isalpha 함수사용 
    if x.isalpha(): #if true
        result.append(x) #result=A
    # 숫자는 따로 더하기
    else:
        value += int(x) #value=1

# 알파벳을 오름차순으로 정렬
result.sort()

# 숫자가 하나라도 존재하는 경우 가장 뒤에 삽입
if value != 0: #만약 value값 1 이면 
    result.append(str(value)) #A1

# 최종 결과 출력(리스트를 문자열로 변환하여 출력)
print(''.join(result))

"""
1행 입력K1KA5
출력 : AKK6
"""
"""
print(result)
궁금해서 해본 결과..
K1A2
['A', 'K', '3']
"""

 

 

https://blockdmask.tistory.com/468

 

[python] 파이썬 join 함수 정리 및 예제 (문자열 합치기)

안녕하세요. BlockDMask입니다. 오늘은 파이썬에서 리스트를 문자열로 일정하게 합쳐주는 join 함수에 대해서 알아보려고 합니다. join 함수는 문자열을 다룰 때 유용하게 사용할 수 있는 함수이니

blockdmask.tistory.com

강의 : https://www.youtube.com/watch?v=2zjoKjt97vQ&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&index=5

 

 

강의 : https://www.youtube.com/watch?v=2zjoKjt97vQ&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&index=5

 

'알고리즘 > 문제풀이' 카테고리의 다른 글

DFS / BFS  (0) 2023.09.13
재귀 함수  (0) 2023.09.13
그리디 6문제  (0) 2023.09.13

댓글