반응형

문제풀이

1. 주어진 크기에 맞는 초기 행렬을 만들어줍니다.

2. 쿼리를 하나씩 실행하는데, 각 쿼리에 맞게 테두리를 시계방향으로 회전시켜주고, 테두리 값 중 최솟값을 answer 리스트에 넣습니다.

    * 맨 윗줄의 회전을 예로 들면, a[r][c+1]를 a[r][c]로 바꿔주면 됩니다.

    2-1. a[r][c]의 값을 tmp로, a[r][c+1]의 값을 tmp2로 저장해둡니다.

    2-2. a[r][c+1]을 tmp, 즉 a[r][c]로 바꿔줍니다.

    2-3. tmp의 값을 tmp2로 바꿔준 후, 다음 c에 대하여 반복합니다. 다만, 첫 단계를 제외한 단계에서는 tmp값을 이미 바꿔야할 열의 이전 열의 값으로 바꿨으므로 tmp2에 대해서만 진행해줍니다.(tmp 값이 이미 a[r][c]입니다.)

Python Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# https://programmers.co.kr/learn/courses/30/lessons/77485
def solution(rows, columns, queries):
    answer = []
    v=0
    matrix = []
    # 초기행렬 행성
    for r in range(rows):
        tmp=[]
        for c in range(columns):
            v+=1
            tmp.append(v)
        matrix.append(tmp)
    for query in queries :
        answer.append(rotate(matrix, query))
    return answer
 
# 행렬을 회전하며 회전한 요소 중 최솟값 반환
def rotate(matrix, query):
    r1,c1,r2,c2=[q-1 for q in query]
    tmp=matrix[r1][c1]
    minn = tmp
    for c in range(c1+1,c2+1):
        tmp2=matrix[r1][c]
        matrix[r1][c] = tmp
        tmp=tmp2
        minn=min(minn,tmp)
    for r in range(r1+1,r2+1):
        tmp2=matrix[r][c2]
        matrix[r][c2] = tmp
        tmp=tmp2
        minn=min(minn,tmp)
    for c in range(c2-1,c1-1,-1):
        tmp2=matrix[r2][c]
        matrix[r2][c] = tmp
        tmp=tmp2
        minn=min(minn,tmp)
    for r in range(r2-1,r1-1,-1):
        tmp2=matrix[r][c1]
        matrix[r][c1] = tmp
        tmp=tmp2
        minn=min(minn,tmp)
    return minn
cs

문제링크

 

코딩테스트 연습 - 행렬 테두리 회전하기

6 6 [[2,2,5,4],[3,3,6,6],[5,1,6,3]] [8, 10, 25] 3 3 [[1,1,2,2],[1,2,2,3],[2,1,3,2],[2,2,3,3]] [1, 1, 5, 3]

programmers.co.kr

 

반응형
반응형

문제풀이

1. 직군별로 언어에 대한 점수와 개발자의 언어별 선호도가 주어진다.

2. (직군의 언어 점수 * 개발자의 언어 선호도 )의 합이 가장 큰 직군을 반환한다.

 * 동점시 알파벳 순으로 빠른 직군을 반환한다.

 

Python Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# https://programmers.co.kr/learn/courses/30/lessons/84325
def solution(table, languages, preference):
    # 동점시 알파벳 순으로 빠른 것을 리턴해야하므로 정렬되어있어야한다.
    answer =     ['CONTENTS''GAME''HARDWARE''PORTAL''SI']
    # dic['직군']['언어']=점수
    dic={}
    for t in table:
        x=t.split()
        tmp={}
        for i in range(5):
            tmp[x[i+1]]=5-i
        dic[x[0]]=tmp
    # 직군별 점수 합계
    a=[(sum(dic[a][l]*if l in dic[a] else 0 for l, p in zip(languages, preference))) for a in answer]
    
    return answer[a.index(max(a))]
cs

 

문제 링크

 

코딩테스트 연습 - 4주차

개발자가 사용하는 언어와 언어 선호도를 입력하면 그에 맞는 직업군을 추천해주는 알고리즘을 개발하려고 합니다. 아래 표는 5개 직업군 별로 많이 사용하는 5개 언어에 직업군 언어 점수를 부

programmers.co.kr

 

반응형
반응형

문제풀이

1. 각 스테이지에 도전 중인 사람의 수를 구합니다.

2. ing[i]를 스테이지 i에 도전 중인 사람의 수라 하면, 스테이지 i에 도달한 사람의 수는 리스트 ing에서 i번째 이상의 요소에 도전 중인 사람의 합, 즉, sum(ing[i:])가 됩니다.

예) 총 6 단계라 하면, 5단계에 도달한 사람의 수는 5단계에 도전중인 사람 수+6단계에 도전중인 사람 수+7단계에 도전중인 사람 수(마지막 단계인 6단계를 클리어한 사람 수)입니다.

3. 스테이지 i의 실패율은 (i단계에 도전중인 사람 수)/(스테이지 i 이상에 도전중인 사람 수)가 됩니다. (ing[i]/sum(ing[i:]))

Python code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#https://programmers.co.kr/learn/courses/30/lessons/42889#
from collections import Counter
def solution(N, stages):
    tot=len(stages)
    c=Counter(stages)
    
    # stage i에 도전중인 사람 수
    ing = [c[i] if i in c else 0 for i in range(N+2)]
    #실패율
    f_rate = {}
    for i in range(N+1) :
        # i 단계의 실패율 : i 단계에 도전중인 사람 수 / i 단계 이상에 도전 중인 사람 수
        f_rate[i] = ing[i]/sum(ing[i:]) if sum(ing[i:])>0 else 0
    return sorted([i for i in range(1,N+1)], key=lambda x : f_rate[x], reverse=True)
cs

문제 링크

 

코딩테스트 연습 - 실패율

실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스

programmers.co.kr

 

반응형
반응형

문제풀이

1. i 번째 학생이 받은 점수는 각 행의 i번째 요소이다.

2. 모든 행의 i번째 열을 모아 평균을 내되, 본인의 점수가 유일한 최고점 또는 최저점이면 해당 점수는 제외하고 평균을 낸다. (유일한 값인지 확인을 위해 Counter 사용)

3. 평균 점수에 따라 등급을 매긴다.

 

Python Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#https://programmers.co.kr/learn/courses/30/lessons/83201
from collections import Counter
 
def solution(scores):
    answer=''
    for i in range(len(scores)):
        # i가 받은 점수들, tmp[i]는 본인의 점수
        tmp = [scores[j][i] for j in range(len(scores))]
        counter = Counter(tmp)
        mn, mx = min(tmp), max(tmp)
        # 본인의 점수가 유일한 최고/최저값
        if (tmp[i] == mn or tmp[i] == mx) and counter[tmp[i]]==1:
            answer += get_grade((sum(tmp)-tmp[i])/(len(tmp)-1))
        else :
            answer += get_grade(sum(tmp)/len(tmp))
            
    return answer
 
def get_grade(score):
    if score >= 90:
        return 'A'
    elif 80 <= score < 90:
        return 'B'
    elif 70<= score < 80:
        return 'C'
    elif 50 <= score < 70:
        return 'D'
    else:
        return 'F'
cs

문제 링크

https://programmers.co.kr/learn/courses/30/lessons/83201#

 

코딩테스트 연습 - 2주차

[[100,90,98,88,65],[50,45,99,85,77],[47,88,95,80,67],[61,57,100,80,65],[24,90,94,75,65]] "FBABD" [[70,49,90],[68,50,38],[73,31,100]] "CFD"

programmers.co.kr

 

반응형
반응형

문제풀이

1. 각 id별 최종 닉네임을 찾는다.

2. record를 적절한 메시지를 출력한다.

 

Python Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def solution(record):
    answer = []
    # d['id'] = nickname
    d = dict()
    tmp = []
    for r in record:
        s = r.split()
        if s[0]=='Enter':
            d[s[1]]=s[2]
            tmp.append(s[:2])
        elif s[0]=='Leave':
            tmp.append(s[:2])
        else :
            d[s[1]]=s[2]
    #print(tmp)
    for t in tmp:
        answer.append(d[t[1]]+'님이 들어왔습니다.' if t[0]=='Enter'
                        else d[t[1]]+'님이 나갔습니다.')
    
    return answer
cs

Line 5 : 나중에 출력할 것을 위해서 Enter와 Leave로 시작되는 레코드만을 담아둡니다.

Line 6~14 :  dictionary를 활용하여 각 id별 최종 닉네임을 구합니다.

Line 16~18 : Line 5에 담긴 레코드를 적절한 메시지로 변경합니다.

 

시간복잡도는 record에 대해 for문이 2번 돌아가므로 O(n)이 됩니다(정확히는 O(2n)).

문제링크

 

코딩테스트 연습 - 오픈채팅방

오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오

programmers.co.kr

 

 

 

반응형
반응형

문제풀이

1. 신청한 예산을 모두 주거나 안주거나이므로 신청한 예산이 가장 작은 것 부터 처리해야한다.

2. 따라서 정렬한 후 i번째 요소까지의 합이 예산 총액의 합보다 작거나 같은 동안 i를 하나씩 늘려간다.

ex) sum(d[0:1]) 이 d보다 작으면, sum(d[0:2])를 다시 d와 비교한다.

 

* 풀이2

1. d를 정렬한 후, budget이 음수가 되기 직전까지 budget에서 d의 첫번째 요소부터 빼줍니다. (budget이 음수가 되면, 더이상 예산을 지급할 수 없다는 것을 의미합니다.)

2. enumerate를 이용하면 budget이 음수가 될 때의 i 값을 찾을 수 있습니다.

Python Code

1
2
3
4
5
6
7
8
def solution(d, budget):
    l = len(d)
    i=0
    d=sorted(d)
    while i-1<and sum(d[:i+1]) <= budget:
        i += 1
    
    return min(i,l)
cs
1
2
3
4
5
6
7
8
9
10
11
# sol2
def solution(d, budget):
    if sum(d) <= budget:
        return len(d)
    for i,v in enumerate(sorted(d)):
        if budget >= v :
            budget -= v
        else :
            return i
    
    return i
cs

문제 링크

 

코딩테스트 연습 - 예산

S사에서는 각 부서에 필요한 물품을 지원해 주기 위해 부서별로 물품을 구매하는데 필요한 금액을 조사했습니다. 그러나, 전체 예산이 정해져 있기 때문에 모든 부서의 물품을 구매해 줄 수는

programmers.co.kr

 

반응형
반응형

문제풀이

1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다. 
2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다. 
3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다. 
4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다. 
5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다. 
6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다. 만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다. 
7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.

위의 각 단계를 함수로 만들어 7단계의 결과를 리턴합니다.

 

Python Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# https://programmers.co.kr/learn/courses/30/lessons/72410
 
from string import ascii_lowercase
import re
 
 
def solution(new_id):
    a = list(ascii_lowercase)+['-','_'+'.']
    answer = ''
    id1=make_lower(new_id)
    id2=delete_s(id1)
    id3=delete_double_dot(id2)
    id4=delete_dot(id3)
    id5=fill_blank(id4)
    # [:15] 는 6단계로 id가 15자를 초과하면 첫 15자만 사용합니다.
    id6=delete_dot(id5[:15])
    
    return fill(id6)
 
# 1단계 : 모든 알파벳을 소문자로 바꿔줍니다.
def make_lower(id):
    return id.lower()
 
# 2단계 : 숫자와 -, _, . 을 제외한 특수문자를 제거합니다.
def delete_s(id):
    return re.sub(r"[^a-z0-9-_.]","", id)
 
# 4, 6단계 : 맨 앞/뒤에 있는 .을 제거합니다.
def delete_dot(id):
    while len(id)>0 and id[0]=='.':
        id=id[1:]
    while len(id)>0 and id[-1]=='.':
        id=id[:-1]
    
    return id
 
# 3단계 : ..을 제거합니다.
def delete_double_dot(id):
    a=re.search('\.\.',id)
    while a:
        id=id[:a.span()[0]]+id[a.span()[1]-1:]
        a=re.search('\.\.',id)
    return id
 
# 5단계 : 4단계까지의 결과물이 빈 문자열이라면 a로 바꿔줍니다.
def fill_blank(id):
    return id if len(id)>0 else 'a'
 
# 6단계 : id가 3자 미만이면 3자가 될 때까지 맨 마지막 문자를 붙여줍니다.
def fill(id):
    while len(id)<3:
        id+=id[-1]
    return id
cs

Line 29 : while 문을 활용하며 앞 또는 뒤에 .이 연속으로 있는 경우 모두 제거해줍니다.

Line 38 : while 문을 활용하여 ........ 같은 문자를 해결합니다. 예를 들면, ...을 ..으로 바꾸고 다시 .으로 바꿔줍니다.

 

문제 링크

 

코딩테스트 연습 - 신규 아이디 추천

카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로

programmers.co.kr

 

반응형
반응형

문제풀이

1. n을 3진수로 변환한다.

2. 1의 결과를 뒤집는다.

3. 2의 결과를 다시 10진수로 변환한다.

 

n=10을 예로 들면, 10을 3진수로 변환한 1의 결과는 101이다. 이를 뒤집은 2의 결과는 101이다. 이를 다시 10진수로 변환한 3의 결과는 1*3^2 + 0*3^1 + 1* 3^0 = 10 이다. (예시의 n과 최종 답이 같은 것은 우연이다.)

 

Python Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def solution(n):
    return r_convert(convert(n,3)[::-1],3)
 
# 10진수인 n을 base진수로 변환
def convert(n, base):
    T = "0123456789ABCDEF"
    q, r = divmod(n, base) # n을 base로 나눈 몫과 나머지를 튜플형태로 반환
    if q == 0:
        return T[r]
    else:
        return convert(q, base) + T[r]
 
# base진수인 n을 10진수로 변환
def r_convert(n, base):
    l = len(n)
    ans = 0
    for i, v in enumerate(n):
        ans += int(n[i])*pow(base,l-i-1)
        print(ans)
    return ans
cs

Line 2 : str[::-1]을 통해 convert(v,3)의 결과를 뒤집어 준다.

 

문제 링크

 

코딩테스트 연습 - 3진법 뒤집기

자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요. 제한사항 n은 1 이상 100,000,000 이하인 자연수

programmers.co.kr

 

반응형

+ Recent posts