본문 바로가기
카테고리 없음

이것이 취업을 위한 코딩 테스트다 CHAPTER 12 구현 문제

by chaemj97 2023. 4. 5.
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
반응형

댓글