12/25 Programmers LV2

김태준·2022년 12월 25일
1

Coding Test - Programmers

목록 보기
8/29

pre-course 들으랴 코테 하랴 바쁜 나날
담주부터 유럽도 여행 가게 되서 계획도 세우고 매일이 전쟁통이다 ~🙄
꾸준히 코테 풀고 강의도 보고 해서 naver 부캠 할 수 있도록..!

문제 풀이

땅따먹기

def solution(land):
    answer = 0
    for i in range(1, len(land)):
        for j in range(4):
            score = land[i][j]
            for k in range(4):
                if k == j:
                    continue
                land[i][j] = max(land[i][j], score + land[i-1][k])

    return max(land[-1])

< 풀이 과정 >
음 제일 앞선 행부터 최댓값을 다음 행에 동일 인덱스 제외하고 추가하는 문제

  • for문으로 0번째 행 제외한 1번부터 land 길이 만큼 반복
  • 다음 행의 인덱스 j와 현재 score값 저장 후 이전 행 인덱스 k 이용하여 현재 행에 이전 행의 최대값 더해주기
  • 결국 마지막 행은 각 col별로 나올 수 있는 최대값들로 저장. 이 중 max값만 리턴

귤 고르기

from collections import Counter
def solution(k, tangerine):
    box = 0
    counting = sorted(Counter(tangerine).values(), reverse = True)
    for i in counting:
        if k <= 0:
            break
        k -= i
        box += 1
    return box

< 풀이 과정 >
최근 자료구조로 배운 Counter를 이용하였다.

  • 중요한 건 귤 크기가 아닌 크기가 같은 것들의 개수가 중요하므로 Counter로 뽑은 귤 리스트의 크기가 아닌 개수를 센 value만 꺼내 개수(counting) 리스트 생성하여 내림차순 정렬 진행.
  • 이후 for문을 돌며 k - counting리스트 진행하여 리턴 + 1 진행!

프렌즈4블록

def solution(m, n, board):
    answer = 0
    for i in range(len(board)):
        board[i] = list(board[i])
    while True:
        check = [[0]*n for _ in range(m)]
        for i in range(m-1):
            for j in range(n-1):
                if board[i][j] == board[i+1][j] and board[i][j] == board[i][j+1] and board[i][j] == board[i+1][j+1] and board[i][j] != False:
                    check[i][j], check[i+1][j], check[i][j+1], check[i+1][j+1] = 1, 1, 1, 1
        block = 0
        for i in range(m):
            block += sum(check[i])
        answer += block
        if block == 0:
            break
            
        for i in range(m-1, -1, -1):
            for j in range(n):
                if check[i][j] == 1:
                    x = i-1
                    while x >= 0  and check[x][j] == 1:
                        x -= 1
                    if x < 0:
                        board[i][j] = False
                    else:
                        board[i][j] = board[x][j]
                        check[x][j] = 1

    return answer

< 풀이 과정 >

  • 주어진 board 형태가 1차원 리스트이므로 각 행 별로 리스트로 변환
  • while 문을 통해 check라는 사라진 블록의 개수를 세어주는 모든 값이 0인 2차원 행렬 생성하여, 겹쳐있는 4칸이 사라지면 check칸은 1로 변환
  • block 수를 세어주기. (사라진 블록이 없으면 break) - 종료조건 명시
  • 사라진 블록만큼 아래 칸으로 블록을 내리는 과정 표시 - x라는 새로운 열의 인덱스를 부여하여 x가 0보다 크고 check행렬에 해당하는 x인덱스가 1인 경우 반복하여 x -= 1진행해주고 x가 0보다 작아지면 현재 board에 해당하는 x열이 모두 비었음을 의미, 아닌 경우 위의 값 > 아래 값 변환 후 check에 1부여하기

방문길이

def solution(dirs):
    visited = set()
    y, x = 0, 0
    direction = {'U': (1,0), 'D':(-1,0), 'R':(0,1), 'L':(0,-1)}
    for d in dirs:
        dy, dx = direction[d]
        nx = x + dx
        ny = y + dy
        if -5 <= ny <= 5 and -5 <= nx <= 5:
            visited.add(((y,x), (ny,nx)))
            visited.add(((ny,nx), (y,x)))
            y = ny
            x = nx 
    return len(visited) // 2

< 풀이 과정 >

  • U, D, R, L 인 경우의 그래프에서 값이 변화되는 것을 미리 dic 형태로 저장해주고 ny, nx 를 이용하여 이동하는 칸을 저장해준다
  • 이후 양방향 이동을 중복제거 해주기 위해 만들어 둔 set형태 visited에 ((기존좌표, 이동좌표)), ((이동좌표, 기존좌표)) 저장
  • 양방향 이동이므로 총 이동거리는 만들어둔 visited // 2처리
profile
To be a DataScientist

0개의 댓글