“ 당신이 6개월 이상 한 번도 보지 않은 코드는 다른 사람이 다시 만드는 게 훨씬 더 나을 수 있다. ”
코딩테스트 입문 Day 16 문자열, 수학, 배열, 조건문
출처 : https://programmers.co.kr/
편지
문제
머쓱이는 할머니께 생신 축하 편지를 쓰려고 합니다. 할머니가 보시기 편하도록 글자 한 자 한 자를 가로 2cm 크기로 적으려고 하며, 편지를 가로로만 적을 때, 축하 문구 message를 적기 위해 필요한 편지지의 최소 가로길이를 return 하도록 solution 함수를 완성해주세요.
제한사항
- 공백도 하나의 문자로 취급합니다.
- 1 ≤ message의 길이 ≤ 50
- 편지지의 여백은 생각하지 않습니다.
- message는 영문 알파벳 대소문자, ‘!’, ‘~’ 또는 공백으로만 이루어져 있습니다.
입출력 예
message | result |
"happy birthday" | 30 |
"i love you" | 22 |
입출력 예 설명
입출력 예 #1
- message의 글자 수가 15개로 최소 가로 30cm의 편지지가 필요합니다.
입출력 예 #2
- message의 글자 수가 11개로 최소 가로 22cm의 편지지가 필요합니다.
solution.js
function solution(message) {
var answer = (message.replace(/ /g, '').length + message.split(' ').length - 1) * 2;
return answer;
}
- 여기서 사용된 정규식 / /g는 공백을 찾기 위한 패턴입니다. message.replace(/ /g, '')는 message에서 모든 공백을 제거한 새로운 문자열을 생성합니다.
- message.split(' ')는 message를 공백을 기준으로 분리한 배열을 생성합니다. 예를 들어, "Hello World"라는 메시지가 주어졌을 경우, 이 배열은 ["Hello", "World"]가 됩니다.
- message.replace(/ /g, '').length는 공백을 제거한 후의 문자열 길이를 나타내며, message.split(' ').length는 단어의 개수를 나타냅니다. 이 두 값을 더한 후에 -1을 하여 단어 사이의 공백 개수를 제거합니다.
최종적으로 (message.replace(/ /g, '').length + message.split(' ').length - 1) * 2는 입력된 메시지의 길이와 단어의 개수를 계산하여, 이를 2배로 만든 결과를 answer 변수에 저장합니다. 마지막으로 answer를 반환합니다.
가장 큰 수 찾기
문제
정수 배열 array가 매개변수로 주어질 때, 가장 큰 수와 그 수의 인덱스를 담은 배열을 return 하도록 solution 함수를 완성해보세요.
제한사항
- 1 ≤ array의 길이 ≤ 100
- 0 ≤ array 원소 ≤ 1,000
- array에 중복된 숫자는 없습니다.
입출력 예
array | result |
[1, 8, 3] | [8, 1] |
[9, 10, 11, 8] | [11, 2] |
입출력 예 설명
입출력 예 #1
- 1, 8, 3 중 가장 큰 수는 8이고 인덱스 1에 있습니다.
입출력 예 #2
- 9, 10, 11, 8 중 가장 큰 수는 11이고 인덱스 2에 있습니다.
solution.js
function solution(array) {
var max = 0;
var index = 0;
for (var i = 0; i < array.length; i++) {
if (array[i] > max) {
max = array[i];
index = i;
}
}
return [max, index];
}
- 우선 max 변수와 index 변수를 초기화합니다. max는 가장 큰 수를 저장할 변수이고, index는 가장 큰 수의 인덱스를 저장할 변수입니다.
- for 루프를 사용하여 배열을 반복하면서 가장 큰 수와 그 인덱스를 찾습니다. 루프의 조건은 i < array.length로 배열의 길이보다 작은 동안 반복합니다.
- 루프 내부에서는 현재 요소가 max보다 큰지 확인합니다. 만약 크다면, max 변수와 index 변수를 업데이트합니다. max 변수를 현재 요소로 업데이트하고, index 변수를 현재 인덱스로 업데이트합니다.
- 루프가 끝나면 가장 큰 수와 그 수의 인덱스를 담은 배열인 [max, index]를 반환합니다.
문자열 계산하기
문제
my_string은 "3 + 5"처럼 문자열로 된 수식입니다. 문자열 my_string이 매개변수로 주어질 때, 수식을 계산한 값을 return 하는 solution 함수를 완성해주세요.
제한사항
- 연산자는 +, -만 존재합니다.
- 문자열의 시작과 끝에는 공백이 없습니다.
- 0으로 시작하는 숫자는 주어지지 않습니다.
- 잘못된 수식은 주어지지 않습니다.
- 5 ≤ my_string의 길이 ≤ 100
- my_string을 계산한 결과값은 1 이상 100,000 이하입니다.
- my_string의 중간 계산 값은 -100,000 이상 100,000 이하입니다.
- 계산에 사용하는 숫자는 1 이상 20,000 이하인 자연수입니다.
- my_string에는 연산자가 적어도 하나 포함되어 있습니다.
- return type 은 정수형입니다.
- my_string의 숫자와 연산자는 공백 하나로 구분되어 있습니다.
입출력 예
my_string | result |
"3 + 4" | 7 |
입출력 예 설명
입출력 예 #1
- 3 + 4 = 7을 return 합니다.
solution.js
function solution(my_string) {
const stack = [];
let sign = 1;
for (const ch of my_string.split(" ")) {
if (ch === "+") {
sign = 1;
} else if (ch === "-") {
sign = -1;
} else {
stack.push(ch * sign);
}
}
return stack.reduce((a,b) => a + b, 0);
}
- stack이라는 빈 배열을 생성합니다. 이 배열은 숫자를 저장하는 스택(Stack)으로 사용될 것입니다.
- sign 변수는 초기값으로 1을 갖고 있습니다. 이 변수는 숫자에 대한 부호를 결정하는데 사용됩니다. 기본적으로 양수를 나타내는 1입니다.
- 주어진 문자열을 공백을 기준으로 분리하여 반복합니다. for...of 문법을 사용하여 문자열을 순회하며 각각의 요소를 ch 변수에 할당합니다.
- ch 변수가 "+"일 경우, sign 변수를 1로 업데이트합니다. 즉, 이후 숫자는 양수로 처리됩니다.
- ch 변수가 "-"일 경우, sign 변수를 -1로 업데이트합니다. 이후 숫자는 음수로 처리됩니다.
- 위의 두 경우가 아닌 경우, ch 변수를 숫자로 변환하여 sign 변수와 곱한 후, stack 배열에 추가합니다. 이는 숫자에 부호를 적용하여 스택에 저장하는 것을 의미합니다.
- 모든 요소를 처리한 후, stack.reduce((a, b) => a + b, 0)를 통해 stack 배열의 요소들을 더하여 최종 결과를 반환합니다. 이 부분은 배열의 reduce 메서드를 사용하여 모든 요소를 더하는 역할을 합니다.
배열의 유사
문제
두 배열이 얼마나 유사한지 확인해보려고 합니다. 문자열 배열 s1과 s2가 주어질 때 같은 원소의 개수를 return하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤ s1, s2의 길이 ≤ 100
- 1 ≤ s1, s2의 원소의 길이 ≤ 10
- s1과 s2의 원소는 알파벳 소문자로만 이루어져 있습니다
- s1과 s2는 각각 중복된 원소를 갖지 않습니다.
입출력 예
s1 | s2 | result |
["a", "b", "c"] | ["com", "b", "d", "p", "c"] | 2 |
["n", "omg"] | ["m", "dot"] | 0 |
입출력 예 설명
입출력 예 #1
- "b"와 "c"가 같으므로 2를 return합니다.
입출력 예 #2
- 같은 원소가 없으므로 0을 return합니다.
solution.js
function solution(s1, s2) {
var count = 0;
for (var i = 0; i < s1.length; i++) {
for (var j = 0; j < s2.length; j++) {
if (s1[i] === s2[j]) {
count++;
break;
}
}
}
return count;
}
- count 변수를 초기화하여 동일한 원소의 개수를 저장할 변수로 설정합니다.
- 첫 번째 for 루프는 s1 문자열을 반복합니다. i 변수는 s1 문자열의 인덱스를 나타냅니다.
- 내부에는 두 번째 for 루프가 있으며, s2 문자열을 반복합니다. j 변수는 s2 문자열의 인덱스를 나타냅니다.
- 각각의 for 루프에서 s1[i]과 s2[j]를 비교하여 같은 원소를 찾습니다. 두 문자가 동일한 경우, count 변수를 증가시키고 break 문을 사용하여 내부 for 루프를 종료합니다. 이는 중복된 원소를 다시 세지 않도록 하기 위함입니다.
- 모든 비교가 완료된 후, count 변수에 저장된 값을 반환합니다.