문자열 연습하기
(1) 프로그래머스 - 문자열 내 p와 y의 개수
문제설명
대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다.
예를 들어 s가 "pPoooyY"면 true를 return하고 "Pyy"라면 false를 return합니다.
제한사항
- 문자열 s의 길이 : 50 이하의 자연수
- 문자열 s는 알파벳으로만 이루어져 있습니다.
입출력 예
s | answer |
"pPoooyY" | true |
"Pyy" | false |
처음 작성한 코드
function solution(s) {
let P = s.split('P').length - 1;
let Y = s.split('Y').length - 1;
if (P === 0 && Y === 0) {
return true;
} else if (P === Y) {
return true;
} else {
return false;
}
}
오늘 배운 문자열을 분할하는 split 을 활용
split : 지정한 구분자(" ") 를 이용하여 문자열을 나눔
ex)
let str = "apple, banana, kiwi";
let result = str.split("a");
console.log(result); // [ '', 'pple, b', 'n', 'n', ', kiwi' ]
console.log(result.length); // 5
a 의 개수는 4개, 문자열은 5개로 나뉘므로
split 을 활용하여 문자열 개수를 구하면 (result.length - 1); // 4
따라서 코드에 split.length - 1 를 적용하였음
그런데 대문자와 소문자가 섞여있는 문자열에서
대소문자 구분 없이 개수를 비교한다는 부분을 생각 못해서 오답이 되었음
수정한 코드
function solution(s) {
let P = s.toUpperCase().split('P').length - 1;
let Y = s.toUpperCase().split('Y').length - 1;
if (P === 0 && Y === 0) {
return true;
} else if (P === Y) {
return true;
} else {
return false;
}
}
s. 와 split 사이에 toUpperCase()를 추가하여 대소문자 구분없이 비교를 하게 함
toUpperCase() : 문자열을 대문자로 변환해 반환한다.
좀 더 간결하게 코드 수정
function solution(s) {
s = s.toUpperCase();
let P = s.split('P').length - 1;
let Y = s.split('Y').length - 1;
return P === Y;
}
s = s.toUpperCase(); 하여 코드 중복 작성을 줄이고
이전에 작성한 if else if 문을 return P === Y 가 대체할 수 있음을 알게되어 수정하였음
* 헷갈렸던 부분
" 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. " 또한 수정 전에는 조건식을 주었는데 생각해보니 p, y 둘다 하나도 없을 경우 둘다 0 이므로 p === y 같음.
반복문, 조건문 연습하기
(2) 프로그래머스 - 음양 더하기
문제설명
어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요.
제한사항
- absolutes의 길이는 1 이상 1,000 이하입니다.
- absolutes의 모든 수는 각각 1 이상 1,000 이하입니다.
- signs의 길이는 absolutes의 길이와 같습니다.
- signs[i] 가 참이면 absolutes[i] 의 실제 정수가 양수임을, 그렇지 않으면 음수임을 의미합니다.
입출력 예
absolutes | signs | result |
[4,7,12] | [true,false,true] | 9 |
[1,2,3] | [false,false,true] | 0 |
정답 코드
function solution(absolutes, signs) {
// 1. return 해야 하는 answer 생성
let answer = 0;
// 2. 두 배열을 비교해 가면서 값을 더하거나 빼줄 것
// 2-1. 두 배열은 크기가 같음
for (var i = 0; i < absolutes.length; i++) {
// 부호(+, -)에 따른 처리
if (signs[i] === true) {
// 값이 true 인 경우(양수)
answer = answer + absolutes[i];
} else if (signs[i] === false) {
// 값이 false 인 경우(음수)
answer = answer - absolutes[i];
}
}
// 3. 출력
return answer;
}
for 문을 사용하여 (초기값 var i = 0; 조건식 i < absolutes.length; 증감식 i++)
absolutes = [4,7,12] // absolutes.length = 3
signs = [true,false,true]
absolutes.length 가 3이고 signs[i] 0번째는 true 이므로
4
sign[1] === false 이므로
-7
sign[2] === true
12
answer = 4 - 7 + 12
answer = 9
* 궁금했던 부분
if else if 의 음수 메인로직에서 answer = absolutes[i] 에 * -1 을 하면 왜 안되는지?
=> signs[0] 번째 true 로 answer = 4 가 되고 그 4에다가 -7을 하게 되는데 곱하기 -1 을 하게 되면
answer 에다가 -7의 값을 주게 되므로 안된다 !!
😂 느낀점
1주차 강의를 다 보고 난 뒤 강의 마지막의 숙제부분을 하느라 오늘 오후 ~ 저녁시간이 다 가버렸다.
문자열 p와 y개수 문제를 풀면서 중간 중간 계속 막혀서 많이 어려웠고, 음양 더하기 문제는 아예 문제 이해부터가 너무 어려워서
문제를 푸는 것 조차 엄두가 안났다. 오후 하루종일 막혀있다가 더이상 진전이 나지 않아 해설 강의를 보았고, 해설 강의를 봐도 이해하기가 어려워서 각 강의들을 3번씩 넘게 봤다. 강의를 다시 보고 혼자 천천히 코드를 읽어보면서 어떻게 동작하는지 머릿속에 반복해서 그려보고 나니까 어느정도 이해가 가기 시작했다.
이해하는 과정에서 궁금한 부분들이 생겨서 질문할 것들을 정리해서 튜터님께 질문했다.
튜터님과 코드를 같이 읽고 풀이해보고, 궁금한 부분들이 해소되고 나니 처음에 막막하고 답답했던 마음이 이젠 꽤 재미있다고 느끼게 되었다. 사실 오늘 오후 내내 얽매여있어서 지난 주 이후로 벌써 두번 째 멘붕이 왔었지만 앞으로 더 많은 멘붕이 올거라 확신하므로 여기서 좌절하면 안된다... 그래도 오랜 시간동안 혼자 고민하고 문제를 풀어보는 과정에서 아 이렇게도 풀수 있구나, 내가 작성한 코드는 어떻게 좀 더 간결하게 작성할 수 있지? 하고 고민해볼 수 있는 시간이었다.
그리고 앞으로 코드작성을 시작하기 전에 어떻게 작성할 지 순서별로 주석을 달아서 틀을 잡아놓고 작성해보는 연습을 해야겠다.
'TIL' 카테고리의 다른 글
객체안에 속성 추가하기 (0) | 2024.07.24 |
---|---|
문자열 내 마음대로 정렬하기 (3) | 2024.07.23 |
git & github - push / pull / branch 생성 (0) | 2024.07.18 |
CRUD 개념 (0) | 2024.07.17 |
git pull 오류 (0) | 2024.07.16 |