지난 풀이과정중 반복문, 제어문, 조건문에서 활용될 수 있는 많은 method들을 다시 한 번 기억하자
substring, charAt, toString, sort, of(LocalDate) 등등
아래 문제들에 대한 출처 - 프로그래머스
1. 내적
문제를 풀기 이전에 내적이 대체 무엇인지 궁금한 분들은 보아라. (출처-소나기님 블로그)
난 이과도 아니고 살짝 읽어보고 우선 내게 필요한 지식만 가져왔다
벡터의 내적은 a의 성분을 (x1, y1, z1)라 하고 b의 성분을 (x2, y2, z1 )라 하면
a·b = x1*x2 + y1*y2 + z1*z2
또 다른 공식으로는
a·b = ||a|| ||b|| cos θ
즉, x1*x2 + y1*y2 + z1*z2 = ||a|| ||b|| cosθ이 공식이 성립이 된다는 뜻
문제 : 길이가 같은 두 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의 길이)
조건 :
- a, b의 길이는 1 이상 1,000 이하입니다.
- a, b의 모든 수는 -1,000 이상 1,000 이하입니다.
해결 :
class Solution {
public int solution(int[] a, int[] b) {
int sum = 0;
for(int i = 0; i < a.length; i++){
sum += a[i]*b[i];
}
return sum;
}
}
해석 :
a, b의 길이가 같기 때문에 a의 정수배열 길이만큼 반복문을 돌려서 b의 요소들과 함께 곱한 후 sum 변수에 값을 대입하고 return하면 끝
2. 문자열 내 p와 y의 개수
문제 : 대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다.
예를 들어 s가 "pPoooyY"면 true를 return하고 "Pyy"라면 false를 return합니다.
조건 :
- 문자열 s의 길이 : 50 이하의 자연수
- 문자열 s는 알파벳으로만 이루어져 있습니다.
해결 :
class Solution {
boolean solution(String s) {
boolean answer = true;
String words[] = s.split("");
int y = 0, p = 0 ;
for(String i : words){
if(i.equals("p") || i.equals("P"))
p++;
else if(i.equals("y") || i.equals("Y"))
y++;
}
if(y!=p)
answer = false;
return answer;
}
}
해석 :
1. 문자열이기때문에 한글짜식 split하고 배열에 요소로 넣어준다는 생각을 아예하지도 못했다. 이런건 많은 학습을 통해서 익숙해지자, 논리적 사고방식을 길러야한다.
String s = "ppoooyY";
String workd[] = s.split("")
//아래와 같이 요소들이 들어간다는 의미
String world[] = {"p","p","p","o","o","o","y","Y"};
2. 그리고 p, y의 개수를 세어주기위해 workd [ i ] 요소들을 equals메서드를 통해 확인하고 p, y 변수에 증감한다.
3. 마지막으로 p, y의 개수를 비교하는 조건문을 이용해 값을 return한다.
3. 문자열 다루기 기본
문제 : 문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.
조건 :
- s는 길이 1 이상, 길이 8 이하인 문자열입니다.
해결 :
class Solution {
public boolean solution(String s) {
if(s.length() != 4 && s.length() != 6) return false;
for (int i=0;i<s.length();i++) {
if (s.charAt(i) < '0' || s.charAt(i) > '9') return false;
}
return true;
}
}
해석 :
1. 우선 문자열 s의 길이를 && 비교연산자로 결과를 반환해준다
2. 그리고 문자열의 길이만큼 반복문을 돌려서 이 문제에 조건에 해당하는 1이상,8이하 길이의 문자열의 조건을 성립하게 하고 그렇지않다면 false 를 return해준다.
3. 오직 문자열에 대한 조건들만을 성립하게 하고 그렇지 않은 경우에는 숫자이기 때문에 true를 반환하게 만든 것이다. 10진수와 아스키 코드 부호를 참고하자.
아스키 코드 - 나무위키
IBM CP437 아스키 코드에는 제어 문자 자리에 Null(0x00)을 제외한 32개의 특수문자를 배당해 놓았다. 물론 그렇다고 해서 제어 문자의 기능이 없어지는 것은 아니며, 프로그램이나 글꼴에 따라서는
namu.wiki
4. 서울에서 김서방 찾기
문제 : String형 배열 seoul의 element중 "Kim"의 위치 x를 찾아, "김서방은 x에 있다"는 String을 반환하는 함수, solution을 완성하세요. seoul에 "Kim"은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다.
조건 :
- seoul은 길이 1 이상, 1000 이하인 배열입니다.
- seoul의 원소는 길이 1 이상, 20 이하인 문자열입니다.
- "Kim"은 반드시 seoul 안에 포함되어 있습니다.
해결 :
class Solution {
public String solution(String[] seoul) {
String answer = "";
for(int i = 0; i < seoul.length; i++){
if(seoul[i].equals("Kim")){
answer = "김서방은 "+i+"에 있다";
}
}
return answer;
}
}
해석 :
1. String을 변환하는 변수이기 때문에 answer변수의 타입은 String으로 선언해준다
2. 반복문을 통해 seoul [ i ]의 요소에 equals 메서드를 이용하여 비교해준다. 말그대로 "Kim"의 위치를 찾게 비교하는 것.
3. answer 변수에 문자열을 이용하여 i 를 반환하게 한다.
슬슬 반복문에 대한 개념이 잡히기 시작하고 for, if문에 대한 두려움이 사라져가고 있다.
하지만 아직 혼자 코드를 통해 답을 유추하기는 어렵다.
말그대로 반복문이다, 학습도 계속 반복하자
5. 수박수박수박수박?
문제 :
길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요. 예를들어 n이 4이면 "수박수박"을 리턴하고 3이라면 "수박수"를 리턴하면 됩니다.
조건 :
- n은 길이 10,000이하인 자연수입니다.
해결 :
class Solution {
public String solution(int n) {
String answer = "";
for(int i = 0; i < n; i++){
if(i % 2 == 0){
answer += "수";
}
if(i % 2 == 1){
answer += "박";
}
}
return answer;
}
}
해석 :
자연수 n의 길이만큼 홀수, 짝수 일때 조건을 걸어서 변수에 저장하고 답을 반환하면 된다.
굉장히 재밌는 풀이도 있었다. text 변수에 "수"와"박"을 10000개를 쓰다니 천재다. 배우진 말자.
6. 완주하지 못한 선수
문제 :
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
조건 :
- 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
- completion의 길이는 participant의 길이보다 1 작습니다.
- 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
- 참가자 중에는 동명이인이 있을 수 있습니다.
해결 :
import java.util.Arrays;
class Solution {
public String solution(String[] participant, String[] completion) {
Arrays.sort(participant);
Arrays.sort(completion);
// 두 배열이 다를 때까지 찾는다
int i = 0;
for(i = 0; i < completion.length; i++)
if(! participant[i].equals(completion[i]))
break;
//마지막 주자가 완주하지 못했을 경우 participant의 요소를 반환
return participant[i];
}
}
해석 :
1. 우선 completion의 요소와 participant 의 요소 개수가 다르다는 것을 문제에서 파악해야한다.
2. 완주하지 못한 선수는 participant의 요소에 있을 것이다. 그렇기 때문에 반복문은 completion 배열의 길이로 비교해주어야하고 만약에 completion [ i ]의 요소를 꺼내서 participant [ i ] 의 요소와 비교해줬는데 그 요소가 같지 않는 결과가 나온다면 그 요소가 바로 완주하지 못한 값이다. break문을 써서 빠져나오자.
3. 하지만 이 코드에서 가장 중요한 건 마지막 participant [ i ]의 값을 return해주는 문이다. 아래의 이미지를 보자
에외처리의 중요성 = 프로그래머 성장통 * n
만약에 위처럼 알파벳 순서대로 두 대열의 요소들이 비교되어 반복문과 조건문을 빠져나오면 C라는 결과값은 처리되지 않아 예외가 발생할 수 있다. 그렇기 때문에 마지막 participant [ i ] 요소로 값을 반환해야한다.
또한, Hash를 사용하는 방법도 많은 것 같은데 컬렉션프레임워크에 대한 학습도 서둘러야겠다.
TIL, WIL의 중요성을 느끼는 1주일이었다.
분명 문제를 학습하면서 다 파악했다고 생각했지만 코드를 초기화하고 다시 멍때리는 나를 볼 수 있었다.
int main()
{
while (true)
{printf("I can do it!\n");}
return 0;
}
'Algorithm > 프로그래머스 LV 1 (Day 3)' 카테고리의 다른 글
[JAVA] 알고리즘 입문 LV.1(0/1) (0) | 2022.07.17 |
---|