728x90
Q. 7 럭키 스트레이트
'''
Chapter 12. 럭키 스트레이트
접근법 1
슬라이싱으로 점수를 절반으로 나누기
map을 통해 type을 int로 바꾼 후 sum
'''
import sys
input = sys.stdin.readline
# 점수
N = input().rstrip()
# 왼쪽 점수 합
left_score = sum(map(int,N[:len(N)//2]))
# 오른쪽 점수 합
right_score = sum(map(int,N[len(N)//2:]))
# 두 점수 합이 같으면 성공
if left_score == right_score:
print('LUCKY')
else:
print('READY')
Q. 8 문자열 재정렬
'''
Chapter 12. 문자열 재정렬
접근법 1
최초문자를 정렬 후 구현 -> 문자끼리 모은 후 정렬하면 list로 바껴서 join을 해야하기 때문에
숫자면 숫자 합에 추가
문자면 문자에 추가
다 계산 후 숫자가 하나라도 있었다면 문자 뒤에 추가해주기
'''
import sys
input = sys.stdin.readline
S = input().rstrip()
num = 0
answer = ''
for s in sorted(S):
# 숫자끼리 따로
if s.isdigit():
num += int(s)
# 문자면 추가
else:
answer += s
# 숫자가 존재하면 뒤에 추가
if num > 0:
answer += str(num)
print(answer)
Q. 9 문자열 압축
'''
Chapter 12. 문자열 압축
접근법 1
압축할 수 있는 단위 1~(문자열 길이의 절반)
단위만큼씩 잘라서 압축가능한지 확인 후 압축
최종 길이가 최소인지 확인
반복
'''
def solution(s):
answer = 1000
# 최소는 1부터 최대는 길이의 절반(2개로 나눌 때 하나의 길이가 가장 김)
for i in range(1,(len(s)+1)//2+1):
# 압축 문자열의 길이 구하기
# 반복 문자열 횟수
cnt = 1
# 반복되는지 확인할 부분
check = s[0:i]
# 압축 결과
result = ''
for j in range(i,len(s),i):
# 같으면 반복 문자열 횟수 +1
if s[j:j+i] == check:
cnt += 1
# 다르면
else:
# 1은 의미 없
if cnt != 1:
result += str(cnt)
result += check
cnt = 1
check = s[j:j+i]
# 마지막 부분
if cnt != 1:
result += str(cnt)
result += check
# 압축 문자 길이
length = len(result)
# 최소 길이인가?
if length < answer:
answer = length
return answer
Q. 10 자물쇠와 열쇠
https://chaemi720.tistory.com/286
Q. 11 뱀
'''
Chapter 12. 뱀
접근법 1
시뮬레이션으로 문제에서 요구하는 대로 하나하나 구현
현재 위치에서 진행 방향으로 이동
벽 혹은 몸에 부딪히면 게임 끝!
이동이 가능하면 baam에 이동 위치 추가
사과가 없으면 baam 꼬리부분 삭제
사과가 있다면 baam 유지 + board 위에 사과 삭제
방향을 바꿀 시간인지 체크
반복
'''
import sys
input = sys.stdin.readline
# 보드의 크기
N = int(input())
board = [[0]*N for _ in range(N)]
# 사과의 개수
K = int(input())
# 사과의 위치
for _ in range(K):
r,c = map(int,input().split())
board[r-1][c-1] = 1
# 뱀의 방향 변환 회수
L = int(input())
# 뱀의 방향 변환 정보
dir_change = [list(input().split()) for _ in range(L)]
# 이동 (오른쪽 회전 기준)
d = [[0,1],[1,0],[0,-1],[-1,0]]
# 뱀이 올라간 보드 위치
baam = [[0,0]]
# 게임 시간
time = 0
# 이동 방향
d_idx = 0
while True:
time += 1
# 현재 위치
cr,cc = baam[0]
# 이동
nr = cr + d[d_idx][0]
nc = cc + d[d_idx][1]
# 벽 또는 자기 자신의 몸과 부딪히면 게임 끝
if not (0<=nr<N) or not (0<=nc<N) or [nr,nc] in baam:
break
# 이동
baam.insert(0,[nr,nc])
# 사과가 없으면 몸길이 유지
if board[nr][nc] == 0:
baam.pop()
# 사과가 있다면 몸의 크기 늘리기 + 사과 없애기
else:
board[nr][nc] = 0
# 이동 방향 체크
if dir_change and int(dir_change[0][0]) == time:
# 오른쪽 회전
if dir_change[0][1] == 'D':
d_idx = (d_idx+1)%4
# 왼쪽 회전
else:
d_idx = (d_idx-1)%4
dir_change.pop(0)
print(time)
Q 12. 기둥과 보 설치
https://chaemi720.tistory.com/293
[프로그래머스] 기둥과 보 설치 - Python
https://school.programmers.co.kr/learn/courses/30/lessons/60061 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는
chaemi720.tistory.com
Q. 13 치킨 배달
'''
Chapter 12. 치킨 배달
접근법 1
치킨집 최대 13개
집 최대 100개 -> 완전 탐색
1. M개의 치킨집 조합 선택
2. 그 치킨집 조합의 최소 치킨 거리 구하기
2-1. 각 집마다 치킨거리 구하기
값 갱신을 사용
'''
from itertools import combinations
import sys
input = sys.stdin.readline
# N*N크기의 도시, 치킨집 최대 개수
N, M = map(int,input().split())
# 도시 정보(집 == 1, 치킨집 == 2)
city = [list(map(int,input().split())) for _ in range(N)]
# 치킨집 위치
chickens = []
# 집 위치
home = []
for r in range(N):
for c in range(N):
if city[r][c] == 1:
home.append([r,c])
elif city[r][c] == 2:
chickens.append([r,c])
# 치킨 거리
answer = float('inf')
# M개의 치킨집 조합 선택
for chicken in combinations(chickens,M):
# 이 치킨집 조합으로 나오는 치킨 거리
distance = 0
for hr,hc in home:
# 이 집의 치킨 거리
min_d = float('inf')
for cr,cc in chicken:
d = abs(hr-cr)+abs(hc-cc)
min_d = min(min_d,d)
distance += min_d
answer = min(answer,distance)
print(answer)
Q. 14 외벽 점검
https://chaemi720.tistory.com/294
[프로그래머스] 외벽 점검 - Python
https://school.programmers.co.kr/learn/courses/30/lessons/60062 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는
chaemi720.tistory.com
728x90
반응형
댓글