Python/코딩테스트

[프로그래머스/python] 코딩테스트 입문 3주차 (5월 세 번째 주)

김과분 2023. 5. 20. 19:51
728x90

코딩테스트 입문 100문제 모두 완료! 머쓱이 스탬프 획득!

Day 21-2⭐. 안전지대

문제 설명

다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.

지뢰는 2차원 배열 board에 1로 표시되어 있고 board에는 지뢰가 매설 된 지역 1과, 지뢰가 없는 지역 0만 존재합니다.
지뢰가 매설된 지역의 지도 board가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return하도록 solution 함수를 완성해주세요.

 

입출력 예

 

문제 접근

 

Solution

def solution(board):
    answer = 0
    temp = [2]*len(board)
    board.insert(0, temp)
    board.insert(len(board), temp)
    for i in range(1,len(board)):
        board[i].insert(0, 2)
        board[i].insert(len(board), 2)
    for i in range(len(board)):
        for j in range(len(board[i])):
            if board[i][j] == 1:
                if board[i-1][j-1] == 0:                    
                    board[i-1][j-1] = 2
                if board[i-1][j] == 0: 
                    board[i-1][j] = 2
                if board[i-1][j+1] == 0: 
                    board[i-1][j+1] = 2
                if board[i][j-1] == 0: 
                    board[i][j-1] = 2
                if board[i][j+1] == 0: 
                    board[i][j+1] = 2
                if board[i+1][j-1] == 0: 
                    board[i+1][j-1] = 2
                if board[i+1][j] == 0: 
                    board[i+1][j] = 2
                if board[i+1][j+1] == 0: 
                    board[i+1][j+1] = 2
    for i in range(len(board)):
        for j in range(len(board[i])):
            if board[i][j] == 0:
                answer += 1
    return answer

 

Result

 

Day 22-3⭐. 겹치는 선분의 길이

문제 설명

선분 3개가 평행하게 놓여 있습니다. 세 선분의 시작과 끝 좌표가 [[start, end], [start, end], [start, end]] 형태로 들어있는 2차원 배열 lines가 매개변수로 주어질 때, 두 개 이상의 선분이 겹치는 부분의 길이를 return 하도록 solution 함수를 완성해보세요.

lines가 [[0, 2], [-3, -1], [-2, 1]]일 때 그림으로 나타내면 다음과 같습니다.

선분이 두 개 이상 겹친 곳은 [-2, -1], [0, 1]로 길이 2만큼 겹쳐있습니다.

 

문제 접근

접근 1) 선분 1과 선분 2에서 겹치는 길이 + 선분 2와 선분 3에서 겹치는 길이 - 세 선분 다 겹치는 길이(중복이기 때문)

문제: 세 선분이 다 겹치는 길이를 구할 때 걸어줄 조건들이 너무 많음 -> 복잡하고 비효율적

 

접근 2) 선분은 -100~100 사이에 있다는 제한사항을 바탕으로 -100부터 100까지 각 숫자 위로 지나는 선분 개수를 바탕으로 2개 혹은 3개일 때만 겹치는 선분으로 친다.

문제 : 런타임 에러 발생 

 

접근 3) 접근 2 변형

 

Solution

from collections import Counter

def solution(lines):
    answer = 0
    for i in range(len(lines)):
        for j in range(1, lines[i][1]-lines[i][0]):
            lines[i].insert(j, lines[i][0]+j) # 선 표현 -> 점 표현
        del lines[i][len(lines[i])-1] # 마지막 점은 delete
    com = []
    for i in range(len(lines)):
        for j in range(len(lines[i])):
            com.append(lines[i][j]) # 점 표현 배열 모두 한 배열에 합치기
    dic = Counter(com) # 빈도수 count
    arr = list(dic.values()) # 빈도수만 한 배열에 저장
    for i in arr:
        if i>1: # 빈도수가 2개 이상 = 점이 겹치는 부분
            answer+=1
    return answer

 

Result

 

Day 23-3⭐. 옹알이 (1)

문제 설명

머쓱이는 태어난 지 6개월 된 조카를 돌보고 있습니다. 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음을 최대 한 번씩 사용해 조합한(이어 붙인) 발음밖에 하지 못합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.

ex)

ayaye => aya + ye -> 발음할 수 있는 단어

wyeoo => ye만 발음 가능 -> 발음할 수 없는 단어 

 

문제 접근

제한사항 중, "babbling의 각 문자열에서 "aya", "ye", "woo", "ma"는 각각 최대 한 번씩만 등장합니다."를 활용하여 문제를 풀었다.

각 단어에서 "aya", "ye", "woo", "ma"가 포함된다면 그 부분을 replace() 함수를 사용하여 모두 띄어쓰기로 바꾸고, 이때 최종적으로 띄어쓰기밖에 없으면 머쓱이의 조카가 발음할 수 있는 조합으로 구성된 단어라는 것이 판별되기 때문에 개수에 포함한다.

* replace(찾고자 하는 문자, 그 부분을 바꾸고자 하는 문자)

 

Solution

def solution(babbling):
    answer = 0
    for i in babbling:
        if "aya" in i:
            i = i.replace("aya", ' ')
        if "ye" in i:
            i = i.replace("ye", ' ')
        if "woo" in i:
            i = i.replace("woo", ' ')
        if "ma" in i:
            i = i.replace("ma", ' ')
        if " " in i:
            i = i.replace(" ", '')
        if i=='':
            answer+=1
    return answer

 

Result

728x90