반응형

출처 : 프로그래머스

 

코딩테스트 연습 - 순위

5 [[4, 3], [4, 2], [3, 2], [1, 2], [2, 5]] 2

programmers.co.kr

문제 설명

n명의 권투선수가 권투 대회에 참여했고 각각 1번부터 n번까지 번호를 받았습니다. 권투 경기는 1대1 방식으로 진행이 되고, 만약 A 선수가 B 선수보다 실력이 좋다면 A 선수는 B 선수를 항상 이깁니다. 심판은 주어진 경기 결과를 가지고 선수들의 순위를 매기려 합니다. 하지만 몇몇 경기 결과를 분실하여 정확하게 순위를 매길 수 없습니다.

선수의 수 n, 경기 결과를 담은 2차원 배열 results가 매개변수로 주어질 때 정확하게 순위를 매길 수 있는 선수의 수를 return 하도록 solution 함수를 작성해주세요.

제한사항
  • 선수의 수는 1명 이상 100명 이하입니다.
  • 경기 결과는 1개 이상 4,500개 이하입니다.
  • results 배열 각 행 [A, B]는 A 선수가 B 선수를 이겼다는 의미입니다.
  • 모든 경기 결과에는 모순이 없습니다.
입출력 예nresultsreturn
5 [[4, 3], [4, 2], [3, 2], [1, 2], [2, 5]] 2
입출력 예 설명

2번 선수는 [1, 3, 4] 선수에게 패배했고 5번 선수에게 승리했기 때문에 4위입니다.
5번 선수는 4위인 2번 선수에게 패배했기 때문에 5위입니다.

 

def solution(n, results):
    answer = 0
    # 이긴 값을 저장한다. 
    lose_graph = [[] for _ in range(n + 1)]
    win_graph = [[] for _ in range(n + 1)]
    
    for result in results:
        win, lose = result[0], result[1]
        win_graph[win].append(lose)
        lose_graph[lose].append(win) # 내가 진 것 
                
    graph = lose_graph[:]
    graph_1 = win_graph[:]
    for i in range(1, n +1):
        for j in lose_graph[i]:
            for k in lose_graph[j]:
                if k not in graph[i]:
                    graph[i].append(k)
        for j in win_graph[i]:
            for k in win_graph[j]:
                if k not in graph_1[i]:
                    graph_1[i].append(k)
    for i in range(1, n + 1):
        if (len(graph_1[i]) + len(graph[i])) + 1  == n:
            answer += 1
    return answer

n = 5
#results = [[4, 3], [4, 2], [3, 2], [1, 2], [2, 5]]
results = [[1, 2], [4, 5], [3, 4], [2, 3]]
solution(n, results)
반응형

'문제 > 프로그래머스' 카테고리의 다른 글

전화번호 목록  (0) 2022.04.17
더 맵게  (0) 2022.03.29
정수 삼각형  (0) 2022.03.12
가장 큰 수  (0) 2022.03.08
[1차] 캐시  (0) 2022.02.28
반응형

출처 : 프로그래머스

 

코딩테스트 연습 - 정수 삼각형

[[7], [3, 8], [8, 1, 0], [2, 7, 4, 4], [4, 5, 2, 6, 5]] 30

programmers.co.kr

문제 설명

위와 같은 삼각형의 꼭대기에서 바닥까지 이어지는 경로 중, 거쳐간 숫자의 합이 가장 큰 경우를 찾아보려고 합니다. 아래 칸으로 이동할 때는 대각선 방향으로 한 칸 오른쪽 또는 왼쪽으로만 이동 가능합니다. 예를 들어 3에서는 그 아래칸의 8 또는 1로만 이동이 가능합니다.

삼각형의 정보가 담긴 배열 triangle이 매개변수로 주어질 때, 거쳐간 숫자의 최댓값을 return 하도록 solution 함수를 완성하세요.

제한사항
  • 삼각형의 높이는 1 이상 500 이하입니다.
  • 삼각형을 이루고 있는 숫자는 0 이상 9,999 이하의 정수입니다.
입출력 예triangleresult
[[7], [3, 8], [8, 1, 0], [2, 7, 4, 4], [4, 5, 2, 6, 5]] 30

 

문제 구분은 동적기획법이다 

Dynamic Programming내용은 간단하다. 

def solution(triangle):
    answer = 0
    for i_idx in range(1, len(triangle)):
        for j_idx, j_val in enumerate(triangle[i_idx]):
            #  가장 왼쪽일 경우 
            if j_idx == 0:
                triangle[i_idx][j_idx] +=  triangle[i_idx-1][j_idx]
            elif j_idx == (len(triangle[i_idx]) - 1):
                triangle[i_idx][j_idx] +=  triangle[i_idx-1][j_idx-1] 
            else:
                triangle[i_idx][j_idx] +=  max(triangle[i_idx-1][j_idx-1] ,
                                            triangle[i_idx-1][j_idx] )
    answer = max(triangle[-1])
    return answer
반응형

'문제 > 프로그래머스' 카테고리의 다른 글

더 맵게  (0) 2022.03.29
순위  (0) 2022.03.29
가장 큰 수  (0) 2022.03.08
[1차] 캐시  (0) 2022.02.28
이진 변환 반복하기  (0) 2022.02.28
반응형

출처 : 프로그래머스

 

코딩테스트 연습 - 가장 큰 수

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰

programmers.co.kr

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

제한 사항

  • numbers의 길이는 1 이상 100,000 이하입니다.
  • numbers의 원소는 0 이상 1,000 이하입니다.
  • 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.

입출력 예

numbersreturn

[6, 10, 2] "6210"
[3, 30, 34, 5, 9] "9534330"

※ 공지 - 2021년 10월 20일 테스트케이스가 추가되었습니다.

최대 4자리 수 까지여서 x * 3으로 하였다. 

test case 11은 모두 0일 때 0으로 나와야 한다. 

def solution(numbers):
    if any(numbers) == 0:
        return '0'
    numbers_s =  list(map(str, numbers))
    numbers_s.sort(key = (lambda x : x * 3) ,reverse = True)
    answer = "".join(numbers_s)
    return answer


numbers = [0, 0, 0] 
solution(numbers)
반응형

'문제 > 프로그래머스' 카테고리의 다른 글

순위  (0) 2022.03.29
정수 삼각형  (0) 2022.03.12
[1차] 캐시  (0) 2022.02.28
이진 변환 반복하기  (0) 2022.02.28
교점에 별 만들기  (0) 2022.02.19
반응형

출처 : 프로그래머스

 

코딩테스트 연습 - [1차] 캐시

3 ["Jeju", "Pangyo", "Seoul", "NewYork", "LA", "Jeju", "Pangyo", "Seoul", "NewYork", "LA"] 50 3 ["Jeju", "Pangyo", "Seoul", "Jeju", "Pangyo", "Seoul", "Jeju", "Pangyo", "Seoul"] 21 2 ["Jeju", "Pangyo", "Seoul", "NewYork", "LA", "SanFrancisco", "Seoul", "Ro

programmers.co.kr

문제 설명

캐시

지도개발팀에서 근무하는 제이지는 지도에서 도시 이름을 검색하면 해당 도시와 관련된 맛집 게시물들을 데이터베이스에서 읽어 보여주는 서비스를 개발하고 있다.
이 프로그램의 테스팅 업무를 담당하고 있는 어피치는 서비스를 오픈하기 전 각 로직에 대한 성능 측정을 수행하였는데, 제이지가 작성한 부분 중 데이터베이스에서 게시물을 가져오는 부분의 실행시간이 너무 오래 걸린다는 것을 알게 되었다.
어피치는 제이지에게 해당 로직을 개선하라고 닦달하기 시작하였고, 제이지는 DB 캐시를 적용하여 성능 개선을 시도하고 있지만 캐시 크기를 얼마로 해야 효율적인지 몰라 난감한 상황이다.

어피치에게 시달리는 제이지를 도와, DB 캐시를 적용할 때 캐시 크기에 따른 실행시간 측정 프로그램을 작성하시오.

입력 형식

  • 캐시 크기(cacheSize)와 도시이름 배열(cities)을 입력받는다.
  • cacheSize는 정수이며, 범위는 0 ≦ cacheSize ≦ 30 이다.
  • cities는 도시 이름으로 이뤄진 문자열 배열로, 최대 도시 수는 100,000개이다.
  • 각 도시 이름은 공백, 숫자, 특수문자 등이 없는 영문자로 구성되며, 대소문자 구분을 하지 않는다. 도시 이름은 최대 20자로 이루어져 있다.

출력 형식

  • 입력된 도시이름 배열을 순서대로 처리할 때, "총 실행시간"을 출력한다.

조건

  • 캐시 교체 알고리즘은 LRU(Least Recently Used)를 사용한다.
  • cache hit일 경우 실행시간은 1이다.
  • cache miss일 경우 실행시간은 5이다.

입출력 예제

캐시크기(cacheSize)도시이름(cities)실행시간
3 ["Jeju", "Pangyo", "Seoul", "NewYork", "LA", "Jeju", "Pangyo", "Seoul", "NewYork", "LA"] 50
3 ["Jeju", "Pangyo", "Seoul", "Jeju", "Pangyo", "Seoul", "Jeju", "Pangyo", "Seoul"] 21
2 ["Jeju", "Pangyo", "Seoul", "NewYork", "LA", "SanFrancisco", "Seoul", "Rome", "Paris", "Jeju", "NewYork", "Rome"] 60
5 ["Jeju", "Pangyo", "Seoul", "NewYork", "LA", "SanFrancisco", "Seoul", "Rome", "Paris", "Jeju", "NewYork", "Rome"] 52
2 ["Jeju", "Pangyo", "NewYork", "newyork"] 16
0 ["Jeju", "Pangyo", "Seoul", "NewYork", "LA"] 25

해설 보러가기

[“Jeju”, “Pangyo”, “Seoul”, “NewYork”, “LA”, “Jeju”, “Pangyo”, “Seoul”, “NewYork”, “LA”]

“Jeju” 5

“Jeju”, “Pangyo” 5
“Jeju”, “Pangyo”, “Seoul” 5
“Pangyo”, “Seoul”, “NewYork” 5
“Seoul”, “NewYork”, “LA” 5

주의할 점 : 각 도시 이름은 공백, 숫자, 특수문자 등이 없는 영문자로 구성되며, 대소문자 구분을 하지 않는다.

75 점을 맞은 이유는 최신조회한 것은 +1 하고 최신 자리에 업데이트 해줘야 한다.

def solution(cacheSize, cities):
    answer = 0
    stack = []
    for i in cities:
        i = i.lower()
        if i not in stack: # stack에 있지 않을 경우 
            answer += 5
            if len(stack) < cacheSize:
                stack.append(i)         
            else:
                stack.append(i)              
                stack.pop(0)
        else:
           stack.pop(stack.index(i))
           stack.append(i)
           answer += 1 
    return answer

cacheSize = 3
cities = ["Jeju", "Pangyo", "Seoul", "Jeju", "Pangyo", "Seoul", "Jeju", "Pangyo", "Seoul"]
solution(cacheSize, cities)

 

반응형

'문제 > 프로그래머스' 카테고리의 다른 글

정수 삼각형  (0) 2022.03.12
가장 큰 수  (0) 2022.03.08
이진 변환 반복하기  (0) 2022.02.28
교점에 별 만들기  (0) 2022.02.19
동명 동물 수 찾기  (0) 2022.02.16
반응형

출처 : 프로그래머스

 

코딩테스트 연습 - 이진 변환 반복하기

 

programmers.co.kr

문제 설명

0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.

  1. x의 모든 0을 제거합니다.
  2. x의 길이를 c라고 하면, x를 "c를 2진법으로 표현한 문자열"로 바꿉니다.

예를 들어, x = "0111010"이라면, x에 이진 변환을 가하면 x = "0111010" -> "1111" -> "100" 이 됩니다.

0과 1로 이루어진 문자열 s가 매개변수로 주어집니다. s가 "1"이 될 때까지 계속해서 s에 이진 변환을 가했을 때, 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 각각 배열에 담아 return 하도록 solution 함수를 완성해주세요.


제한사항
  • s의 길이는 1 이상 150,000 이하입니다.
  • s에는 '1'이 최소 하나 이상 포함되어 있습니다.

입출력 예sresult
"110010101001" [3,8]
"01110" [3,3]
"1111111" [4,1]

입출력 예 설명

입출력 예 #1

  • "110010101001"이 "1"이 될 때까지 이진 변환을 가하는 과정은 다음과 같습니다.
회차이진 변환 이전제거할 0의 개수0 제거 후 길이이진 변환 결과
1 "110010101001" 6 6 "110"
2 "110" 1 2 "10"
3 "10" 1 1 "1"
  • 3번의 이진 변환을 하는 동안 8개의 0을 제거했으므로, [3,8]을 return 해야 합니다.

입출력 예 #2

  • "01110"이 "1"이 될 때까지 이진 변환을 가하는 과정은 다음과 같습니다.
회차이진 변환 이전제거할 0의 개수0 제거 후 길이이진 변환 결과
1 "01110" 2 3 "11"
2 "11" 0 2 "10"
3 "10" 1 1 "1"
  • 3번의 이진 변환을 하는 동안 3개의 0을 제거했으므로, [3,3]을 return 해야 합니다.

입출력 예 #3

  • "1111111"이 "1"이 될 때까지 이진 변환을 가하는 과정은 다음과 같습니다.
회차이진 변환 이전제거할 0의 개수0 제거 후 길이이진 변환 결과
1 "1111111" 0 7 "111"
2 "111" 0 3 "11"
3 "11" 0 2 "10"
4 "10" 1 1 "1"
  • 4번의 이진 변환을 하는 동안 1개의 0을 제거했으므로, [4,1]을 return 해야 합니다.
def solution(s):
    answer = []
    zerocount,cnt = 0,0
    while s != '1':
        zerocount += s.count('0')
        s = bin(len((lambda x: x.replace('0',''))(s))).replace('0b','')
        cnt += 1
    answer.append(cnt)
    answer.append(zerocount)
    return answer

s = "1111111"
solution(s)
반응형

'문제 > 프로그래머스' 카테고리의 다른 글

가장 큰 수  (0) 2022.03.08
[1차] 캐시  (0) 2022.02.28
교점에 별 만들기  (0) 2022.02.19
동명 동물 수 찾기  (0) 2022.02.16
최솟값 구하기  (0) 2022.02.16
반응형

출처 : 프로그래머스

 

코딩테스트 연습 - 교점에 별 만들기

[[2, -1, 4], [-2, -1, 4], [0, -1, 1], [5, -8, -12], [5, 8, 12]] ["....*....", ".........", ".........", "*.......*", ".........", ".........", ".........", ".........", "*.......*"] [[0, 1, -1], [1, 0, -1], [1, 0, 1]] ["*.*"] [[1, -1, 0], [2, -1, 0], [4, -

programmers.co.kr

문제 설명

Ax + By + C = 0으로 표현할 수 있는 n개의 직선이 주어질 때, 이 직선의 교점 중 정수 좌표에 별을 그리려 합니다.

예를 들어, 다음과 같은 직선 5개를

  • 2x - y + 4 = 0
  • -2x - y + 4 = 0
  • -y + 1 = 0
  • 5x - 8y - 12 = 0
  • 5x + 8y + 12 = 0

좌표 평면 위에 그리면 아래 그림과 같습니다.

이때, 모든 교점의 좌표는 (4, 1), (4, -4), (-4, -4), (-4, 1), (0, 4), (1.5, 1.0), (2.1, -0.19), (0, -1.5), (-2.1, -0.19), (-1.5, 1.0)입니다. 이 중 정수로만 표현되는 좌표는 (4, 1), (4, -4), (-4, -4), (-4, 1), (0, 4)입니다.

만약 정수로 표현되는 교점에 별을 그리면 다음과 같습니다.

위의 그림을 문자열로 나타낼 때, 별이 그려진 부분은 *, 빈 공간(격자선이 교차하는 지점)은 .으로 표현하면 다음과 같습니다.

"..........."  
".....*....."  
"..........."  
"..........."  
".*.......*."  
"..........."  
"..........."  
"..........."  
"..........."  
".*.......*."  
"..........."  

이때 격자판은 무한히 넓으니 모든 별을 포함하는 최소한의 크기만 나타내면 됩니다.

따라서 정답은

"....*...."  
"........."  
"........."  
"*.......*"  
"........."  
"........."  
"........."  
"........."  
"*.......*"  

입니다.

직선 A, B, C에 대한 정보가 담긴 배열 line이 매개변수로 주어집니다. 이때 모든 별을 포함하는 최소 사각형을 return 하도록 solution 함수를 완성해주세요.


제한사항
  • line의 세로(행) 길이는 2 이상 1,000 이하인 자연수입니다.
    • line의 가로(열) 길이는 3입니다.
    • line의 각 원소는 [A, B, C] 형태입니다.
    • A, B, C는 -100,000 이상 100,000 이하인 정수입니다.
    • 무수히 많은 교점이 생기는 직선 쌍은 주어지지 않습니다.
    • A = 0이면서 B = 0인 경우는 주어지지 않습니다.
  • 정답은 1,000 * 1,000 크기 이내에서 표현됩니다.
  • 별이 한 개 이상 그려지는 입력만 주어집니다.

입출력 예lineresult
[[2, -1, 4], [-2, -1, 4], [0, -1, 1], [5, -8, -12], [5, 8, 12]] ["....*....", ".........", ".........", "*.......*", ".........", ".........", ".........", ".........", "*.......*"]
[[0, 1, -1], [1, 0, -1], [1, 0, 1]] ["*.*"]
[[1, -1, 0], [2, -1, 0]] ["*"]
[[1, -1, 0], [2, -1, 0], [4, -1, 0]] ["*"]

입출력 예 설명

입출력 예 #1

문제 예시와 같습니다.

입출력 예 #2

직선 y = 1, x = 1, x = -1는 다음과 같습니다.

(-1, 1), (1, 1) 에서 교점이 발생합니다.

따라서 정답은

"*.*"  

입니다.

입출력 예 #3

직선 y = x, y = 2x는 다음과 같습니다.

(0, 0) 에서 교점이 발생합니다.

따라서 정답은

"*"  

입니다.

입출력 예 #4

직선 y = x, y = 2x, y = 4x는 다음과 같습니다.

(0, 0) 에서 교점이 발생합니다.

따라서 정답은

"*"

입니다.


참고 사항

Ax + By + E = 0
Cx + Dy + F = 0
두 직선의 교점이 유일하게 존재할 경우, 그 교점은 다음과 같습니다.

또, AD - BC = 0인 경우 두 직선은 평행 또는 일치합니다.

컴퓨터 계산 이 햇갈려서 오래 걸렸다. 

def solution(line):
    answer = []
    lines = []
    x_min, x_max, y_min, y_max = float('inf'), -float('inf'), float('inf'), -float('inf')
    for i in range(len(line)-1):
        for j in range(i, len(line)):
            A,B,E = line[i][0], line[i][1], line[i][2]
            C,D,F = line[j][0], line[j][1], line[j][2]
            # 또, AD - BC = 0인 경우 두 직선은 평행 또는 일치합니다.
            val = A*D - B*C
            if val != 0:
                denominator = (A * D - B * C)
                if denominator != 0:
                    x = (B * F - E * D) / denominator
                    y = (E * C - A * F) / denominator
                    if x.is_integer() and y.is_integer():
                        x, y = int(x) , int(y)
                        lines.append((x, y))
                        x_min, x_max, y_min, y_max = min(x_min, x), max(x_max, x), min(y_min, y), max(y_max, y)

    answer = [['.' for _ in range(x_max - x_min + 1)] for _ in range(y_max - y_min + 1)]
    for x, y in lines:
        answer[y_max - y][x - x_min] = '*'

    return [''.join(i) for i in answer]

line = [[2, -1, 4], [-2, -1, 4], [0, -1, 1], [5, -8, -12], [5, 8, 12]]
print(solution(line))

line = [[0, 1, -1], [1, 0, -1], [1, 0, 1]]
print(solution(line))

반응형

'문제 > 프로그래머스' 카테고리의 다른 글

[1차] 캐시  (0) 2022.02.28
이진 변환 반복하기  (0) 2022.02.28
동명 동물 수 찾기  (0) 2022.02.16
최솟값 구하기  (0) 2022.02.16
중성화 여부 파악하기  (0) 2022.02.16
반응형

출처 : 프로그래머스

 

코딩테스트 연습 - 동명 동물 수 찾기

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

-- 코드를 입력하세요
SELECT NAME
     , COUNT(NAME) AS COUNT
FROM ANIMAL_INS 
GROUP BY NAME
HAVING COUNT(NAME) >= 2
ORDER BY NAME
반응형

'문제 > 프로그래머스' 카테고리의 다른 글

이진 변환 반복하기  (0) 2022.02.28
교점에 별 만들기  (0) 2022.02.19
최솟값 구하기  (0) 2022.02.16
중성화 여부 파악하기  (0) 2022.02.16
점프와 순간 이동  (0) 2022.02.16
반응형

출처 : 프로그래머스

 

코딩테스트 연습 - 최솟값 구하기

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

-- 코드를 입력하세요
SELECT MIN(DATETIME) AS '시간'
FROM ANIMAL_INS
반응형

'문제 > 프로그래머스' 카테고리의 다른 글

교점에 별 만들기  (0) 2022.02.19
동명 동물 수 찾기  (0) 2022.02.16
중성화 여부 파악하기  (0) 2022.02.16
점프와 순간 이동  (0) 2022.02.16
타겟 넘버  (0) 2022.02.14

+ Recent posts