https://programmers.co.kr/learn/courses/30/lessons/70128/

 

코딩테스트 연습 - 내적

길이가 같은 두 1차원 정수 배열 a, b가 매개변수로 주어집니다. a와 b의 내적을 return 하도록 solution 함수를 완성해주세요. 이때, a와 b의 내적은 a[0]*b[0] + a[1]*b[1] + ... + a[n-1]*b[n-1] 입니다. (n은 a, b의

programmers.co.kr

 


풀이 과정

내적을 반복문을 활용해서 더해가면서 구해주면 된다.

 

 


소스 코드

파이썬

def solution(a, b):
    answer = 0
    for index in range(len(a)):
        answer += a[index] * b[index]
    return answer

 

자바스크립트

function solution(a, b) {
    var answer = 0
    for (var index = 0; index < a.length; index++) {
        answer += a[index] * b[index]
    }
    return answer;
}

https://programmers.co.kr/learn/courses/30/lessons/76501

 

코딩테스트 연습 - 음양 더하기

어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 re

programmers.co.kr

 


풀이 과정

sign값을 보고 absolutes 값을 더할지 뺄지 판단해주면 된다.

 

 


소스 코드

파이썬

def solution(absolutes, signs):
    answer = 0
    for i in range(len(absolutes)):
        if signs[i]:
            answer += absolutes[i]
        else:
            answer -= absolutes[i]
    return answer

 

자바스크립트

function solution(absolutes, signs) {
    var answer = 0
    for (var i = 0; i < absolutes.length; i++) {
        if (signs[i]) {
            answer += absolutes[i]
        } else {
            answer -= absolutes[i]
        }
    }
    return answer;
}

https://programmers.co.kr/learn/courses/30/lessons/86051

 

코딩테스트 연습 - 없는 숫자 더하기

0부터 9까지의 숫자 중 일부가 들어있는 정수 배열 numbers가 매개변수로 주어집니다. numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요.

programmers.co.kr

 


풀이 과정

0부터 9까지의 모든 수중 배열에 없는 수를 모두 더해라

=> 45에서 배열에 있는 모든 수를 빼주면

=> 배열에 없는 수의 모든 합이 구해진다


소스 코드

파이썬

def solution(numbers):
    answer = 45
    for number in numbers:
        answer -= number
    return answer

 

자바스크립트

function solution(numbers) {
    var answer = 45
    for (number of numbers) {
        answer -= number
    }
    return answer;
}

https://programmers.co.kr/learn/courses/30/lessons/64061

 

코딩테스트 연습 - 크레인 인형뽑기 게임

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

programmers.co.kr

 


풀이 과정

1. 입력받은 moves를 토대로 배열을 탐색함, 배열 값이 0이면 아래 칸으로 넘어감

2. 배열 값이 0이 아니면 바구니의 맨 위랑 인형의 종류를 비교 후, 같으면 답을 2만큼 증가시켜주고 바구니의 맨 위를 비움. 그리고 현재 인형을 꺼낸 배열의 값을 0으로 만들어줌

3. 인형의 종류가 같지 않다면 바구니 맨 위에 인형을 넣고 인형을 꺼낸 곳의 배열 값을 0으로 만들어 줌

 

위와 같은 방법으로 문제를 해결하였다.

 

 


소스 코드

파이썬

def solution(board, moves):
    answer = 0
    bascket = []
    for back in moves:
        back -= 1
        for front in range(len(board)):
            if board[front][back] != 0:
                if len(bascket) != 0 and bascket[-1] == board[front][back]:
                    bascket.pop()
                    board[front][back] = 0
                    answer += 2
                else:
                    bascket.append(board[front][back])
                    board[front][back] = 0
                break

    return answer

자바스크립트

function solution(board, moves) {
    var answer = 0;
    bascket = []
    for (back of moves) {
        back -= 1
        for (var front = 0; front < board.length; front++) {
            if (board[front][back] != 0) {
                if (bascket.length != 0 && bascket[bascket.length - 1] == board[front][back]) {
                    bascket.pop()
                    board[front][back] = 0
                    answer += 2
                } else {
                    bascket.push(board[front][back])
                    board[front][back] = 0
                }
            break
            }
        }
    }
    return answer;
}

 

https://programmers.co.kr/learn/courses/30/lessons/67256?language=python3 

 

코딩테스트 연습 - 키패드 누르기

[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] "right" "LRLLLRLLRRL" [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] "left" "LRLLRRLLLRR" [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] "right" "LLRLLRLLRL"

programmers.co.kr


풀이 과정

숫자 5를 중점으로 하는 2차원 좌표를 고려하고, 각 숫자에 dictionary를 통해 좌표를 할당하였다.

 

누른 숫자가 1, 4, 7이면 그곳으로 왼쪽 손가락의 위치를 옮겨주고 정답 문자열에 'L' 추가,

누른 숫자가 3, 6, 9이면 그곳으로 오른쪽 손가락의 위치를 옮겨주고 정답 문자열에 'R' 추가,

누른 숫자가 2, 5, 8, 0이면 숫자와 왼쪽, 오른쪽 손가락의 위치를 고려해서 더 가까운 손가락의 위치를 옮겨주고 L또는 R을 추가해주는 방식으로 문제를 해결하면 된다.

 

13 ~ 20번째 테스트 케이스에서 틀렸다고 나오는 경우가 있는데 거리를 구할 때, ceil()을 사용해서 실수를 올림해 정수로 거리가 출력되게 해주면 해결된다.

 

 


소스 코드

파이썬

import math

def distance(a, b):
    return math.ceil(((a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2) ** (1/2))

def solution(numbers, hand):
    answer = ''
    left_hand_position = [-1, 2]
    right_hand_position = [1, 2]
    position_dict = {1 : [-1, -1], 2 : [0, -1], 3 : [1, -1], 4 : [-1, 0], 5 : [0, 0], 6 : [1, 0], 7 : [-1, 1], 8 : [0, 1], 9 : [1, 1], 0 : [0, 2]}
    
    for number in numbers:
        if str(number) in '147':
            answer += 'L'
            left_hand_position = position_dict[number]
        
        if str(number) in '369':
            answer += 'R'
            right_hand_position = position_dict[number]
        
        if str(number) in '2580':
            if distance(position_dict[number], left_hand_position) == distance(position_dict[number], right_hand_position):
                if hand == 'left':
                    answer += 'L'
                    left_hand_position = position_dict[number]
                else:
                    answer += 'R'
                    right_hand_position = position_dict[number]
            else:
                if distance(position_dict[number], left_hand_position) < distance(position_dict[number], right_hand_position):
                    answer += 'L'
                    left_hand_position = position_dict[number]
                else:
                    answer += 'R'
                    right_hand_position = position_dict[number]
                    
                
    return answer

 

자바스크립트

function distance(a, b) {
    return Math.ceil(((a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2) ** (1/2))
}

function solution(numbers, hand) {
    let answer = '';
    const position_dict = {1: [-1, -1], 2: [0, -1], 3: [1, -1], 4: [-1, 0], 5: [0, 0], 6: [1, 0], 7: [-1, 1], 8: [0, 1], 9: [1, 1], 0: [0, 2]}
    let left_hand_position = [-1, 2]
    let right_hand_position = [1, 2]
    
    for (number of numbers) { // 파이썬 생각하고 in 쓰면 안됨
        if ('147'.indexOf(String(number)) !== -1) { // '147'안에 String(number)가 없으면 -1이 출력된다
            answer += 'L'
            left_hand_position = position_dict[number]
        } else if ('369'.indexOf(String(number)) !== -1) {
            answer += 'R'
            right_hand_position = position_dict[number]
        } else if ('2580'.indexOf(String(number)) !== -1) {
            if (distance(left_hand_position, position_dict[number]) === distance(right_hand_position, position_dict[number])) {
                if (hand === 'left') {
                    answer += 'L'
                    left_hand_position = position_dict[number]
                } else {
                    answer += 'R'
                    right_hand_position = position_dict[number]
                }
            }
            
            else if (distance(left_hand_position, position_dict[number]) < distance(right_hand_position, position_dict[number])) {
                answer += 'L'
                left_hand_position = position_dict[number]
            }
            
            else if (distance(left_hand_position, position_dict[number]) > distance(right_hand_position, position_dict[number])) {
                answer += 'R'
                right_hand_position = position_dict[number]
            }
        }
    }

    return answer;
}

https://programmers.co.kr/learn/courses/30/lessons/81301?language=python3 

 

코딩테스트 연습 - 숫자 문자열과 영단어

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다. 다음은 숫자의 일부 자

programmers.co.kr


풀이 과정

replace 함수를 이용해서 그냥 모든 문자열을 검사해서 숫자로 바꿔주었다.

 

 


소스 코드

def solution(s):
    answer = 0
    s = s.replace('zero', '0')
    s = s.replace('one', '1')
    s = s.replace('two', '2')
    s = s.replace('three', '3')
    s = s.replace('four', '4')
    s = s.replace('five', '5')
    s = s.replace('six', '6')
    s = s.replace('seven', '7')
    s = s.replace('eight', '8')
    s = s.replace('nine', '9') 
    answer = int(s)
    return answer

https://programmers.co.kr/learn/courses/30/lessons/72410?language=python3 

 

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

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

programmers.co.kr

 


풀이 과정

정규표현식을 사용해서 풀라고 준 문제인 것 같지만 정규 표현식을 사용하지 않고 파이썬 내장 함수를 이용해서 해결하였다.

 

string.lower() => string내의 모든 대문자를 소문자로 바꿔준다.

string.islower() => string내의 모든 문자가 알파벳 소문자로 이루어져 있으면 True, 아니면 False를 반환한다.

string.isdigit() => string내의 모든 문자가 숫자로 이루어져 있으면 True, 아니면 False를 반환한다.

string.replace(문자열 1, 문자열 2) => string내의 모든 문자열 1을 문자열 2로 치환한다.

 

위의 4개의 함수를 사용해서 해결하였다.

 


소스 코드

def solution(new_id):
    new_id = new_id.lower()
    
    answer = ''
    for id in new_id:
        if id.islower() or id.isdigit() or id in '-_.':
            answer += id
    
    while '..' in answer:
        answer = answer.replace('..', '.') # 여러개를 하나로 줄여나감
    
    if len(answer) > 1:
        if answer[0] == '.':
            answer = answer[1:]
        if answer[-1] == '.':
            answer = answer[:-1]
            
    else:
        if answer[0] == '.':
            answer = ''
    
    if answer == '':
        answer = 'a'
    
    if len(answer) >= 16:
        answer = answer[:15]
        if answer[-1] == '.':
            answer = answer[:-1]
    
    while len(answer) <= 2:
        answer += answer[-1]
            
    return answer

https://www.acmicpc.net/problem/1932

 

1932번: 정수 삼각형

첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다.

www.acmicpc.net


풀이 과정

정수 삼각형에 들어있는 요소를 담는 배열을 위의 그림과 같이 생각하면

 

d[i][0] = d[i-1][0] + p[i][0]

d[i][k] = max(d[i-1][k-1] + p[i][k], d[i-1][k] + p[i][k]) (1  <= k <= i-1)

d[i][i] = d[i-1][i-1] + p[i]

 

다음과 같은 점화식이 성립하고 이를 통해 문제를 해결하면 된다

 

 

 


소스 코드

import sys

n = int(sys.stdin.readline())
p = []
d = []

for i in range(n):
    p.append(list(map(int, sys.stdin.readline().split())))
    if i == 0:
        d.append([p[0][0]])
        continue
    d.append([d[i-1][0] + p[i][0]])
    for k in range(1, i):
        d[i].append(max(d[i - 1][k - 1], d[i - 1][k]) + p[i][k])
    d[i].append(d[i-1][i-1] + p[i][i])

print(max(d[n-1]))

https://www.acmicpc.net/problem/2156

 

2156번: 포도주 시식

효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규

www.acmicpc.net

 


풀이 과정

있는 포도주를 최대로 마시고 싶은데 3잔 연속으로는 마실수 없다는 조건이 걸려있는 문제이다.

 

0번째 연속, 1번째 연속, 2번째 연속으로 마신 경우를 나누어서 고려해 3번째 연속으로 마시는 경우가 나올수 없게 하자.

d[i]를 i번째 까지 마셨을 때의 마신 포도주의 최대 값이라고 하고, p[i]를 i번째 포도주 잔에 들어있는 포도주의 양이라고 하자.

 

0번째 연속으로 마신 경우: d[i-1]

1번째 연속으로 마신 경우: d[i-2] + p[i]

2번째 연속으로 마신 경우: d[i-3] + p[i-1] + p[i]이 성립한다.

 

위의 점화식을 이용해 문제를 해결할 수 있다.


소스 코드

import sys

n = int(sys.stdin.readline())
p = []

for _ in range(n):
    p.append(int(sys.stdin.readline()))

d = [p[0], p[0] + p[1] if n > 1 else 0, max(p[0] + p[2], p[1] + p[2], p[0] + p[1]) if n > 2 else 0]

for i in range(3, n):
    d.append(max(d[i-3] + p[i-1] + p[i], d[i-2] + p[i], d[i-1]))

print(d[n-1])

https://www.acmicpc.net/problem/11057

 

11057번: 오르막 수

오르막 수는 수의 자리가 오름차순을 이루는 수를 말한다. 이때, 인접한 수가 같아도 오름차순으로 친다. 예를 들어, 2234와 3678, 11119는 오르막 수이지만, 2232, 3676, 91111은 오르막 수가 아니다. 수

www.acmicpc.net

 


풀이 과정

d[i][k]를 k로 끝나는 i자리 오르막 수의 개수라고 하자.

d[i][k] = sum(d[N-1][j]) (0 <= j <= k) 가 성립한다.

 

 


소스 코드

import sys
mod = 10007

d = [[0 for _ in range(0, 10)] for __ in range(0, 1001)]
d[1] = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

N = int(sys.stdin.readline())

for i in range(2, N+1):
    for j in range(0, 10):
        for k in range(0, j+1):
            d[i][j] += d[i-1][k]
            d[i][j] %= mod

print(sum(d[N]) % mod)

+ Recent posts