오늘의 계획
1. 코드 공부
내용
2. 프로그래머스 코딩 테스트
문제1.
문자열 code가 주어집니다.
code를 앞에서부터 읽으면서 만약 문자가 "1"이면 mode를 바꿉니다. mode에 따라 code를 읽어가면서 문자열 ret을 만들어냅니다.
mode는 0과 1이 있으며, idx를 0 부터 code의 길이 - 1 까지 1씩 키워나가면서 code[idx]의 값에 따라 다음과 같이 행동합니다.
- mode가 0일 때
- code[idx]가 "1"이 아니면 idx가 짝수일 때만 ret의 맨 뒤에 code[idx]를 추가합니다.
- code[idx]가 "1"이면 mode를 0에서 1로 바꿉니다.
- mode가 1일 때
- code[idx]가 "1"이 아니면 idx가 홀수일 때만 ret의 맨 뒤에 code[idx]를 추가합니다.
- code[idx]가 "1"이면 mode를 1에서 0으로 바꿉니다.
문자열 code를 통해 만들어진 문자열 ret를 return 하는 solution 함수를 완성해 주세요.
단, 시작할 때 mode는 0이며, return 하려는 ret가 만약 빈 문자열이라면 대신 "EMPTY"를 return 합니다.
제한사항: 1 ≤ code의 길이 ≤ 100,000, code는 알파벳 소문자 또는 "1"로 이루어진 문자열입니다.
입출력 예
code | result |
"abc1abc1abc" | "acbac" |
- 입출력 예 #1:code의 각 인덱스 i에 따라 다음과 같이 mode와 ret가 변합니다.
i | code[i] | mode | ret |
0 | "a" | 0 | "a" |
1 | "b" | 0 | "a" |
2 | "c" | 0 | "ac" |
3 | "1" | 1 | "ac" |
4 | "a" | 1 | "ac" |
5 | "b" | 1 | "acb" |
6 | "c" | 1 | "acb" |
7 | "1" | 0 | "acb" |
8 | "a" | 0 | "acba" |
9 | "b" | 0 | "acba" |
10 | "c" | 0 | "acbac" |
따라서 "acbac"를 return 합니다.
class Solution {
public String solution(String code) {
String answer = "";
return answer;
}
}
풀이과정
: for문과 if문을 다 써야할것 같았음. 그리고 문자를 하나하나 봐야할테니 substring 아니면 charAt도 써야할것 같았다
class Solution {
public String solution(String code) {
String answer = "";
String word = "";
int mode = 0;
for(int idx = 0; idx < code.length(); idx++) {
}
return answer;
}
}
여기까지 적고 아리까리해서 구글링을 해보았다. 다양한 방법들이 있었지만 가장 보기 쉬운 코드를 보고 참고했다.
정답
class Solution {
public String solution(String code) {
String answer = "";
String word = "";
int mode = 0;
for(int idx = 0; idx < code.length(); idx++) {
word = code.substring(idx, idx+1);
if (mode == 0) {
if (!"1".equals(word) && idx % 2 == 0) {
answer += word;
} else if("1".equals(word)) {
mode = 1;
}
} else if (mode == 1) {
if (!"1".equals(word) && idx % 2 !=0) {
answer += word;
} else if("1".equals(word)) {
mode = 0;
}
}
}
if("".equals(answer)) {
answer = "EMPTY";
}
return answer;
}
}
++ 다른사람의 풀이
class Solution {
public String solution(String code) {
StringBuilder answer = new StringBuilder();
int mode = 0;
for (int i = 0; i < code.length(); i++) {
char current = code.charAt(i);
if (current == '1') {
mode = mode == 0 ? 1 : 0;
continue;
}
if (i % 2 == mode) {
answer.append(current);
}
}
return answer.length() == 0 ? "EMPTY" : answer.toString();
}
}
길게 안써도 되는 방법이 있었네? 삼항연산자는 역시 짱이다. 게다가 if-else를 잔뜩 쓸 필요없이 if (i % 2 == mode)로 해결한게 정말 간결해 보인다
문제2.
두 정수 a, d와 길이가 n인 boolean 배열 included가 주어집니다. 첫째항이 a, 공차가 d인 등차수열에서 included[i]가 i + 1항을 의미할 때, 이 등차수열의 1항부터 n항까지 included가 true인 항들만 더한 값을 return 하는 solution 함수를 작성해 주세요
제한사항:
- 1 ≤ a ≤ 100
- 1 ≤ d ≤ 100
- 1 ≤ included의 길이 ≤ 100
- included에는 true가 적어도 하나 존재합니다.
입출력 예
a | d | included | result |
3 | 4 | [true, false, false, true, true] | 37 |
7 | 1 | [false, false, false, true, false, false, false] | 10 |
- 입출력 예 #1: 예제 1번은 a와 d가 각각 3, 4이고 included의 길이가 5입니다. 이를 표로 나타내면 다음과 같습니다.
||1항|2항|3항|4항|5항|
|-|-|---|---|---|---|
|등차수열|3|7|11|15|19|
|included|true|false|false|true|true|
따라서 true에 해당하는 1항, 4항, 5항을 더한 3 + 15 + 19 = 37을 return 합니다 - 입출력 예 #2: 예제 2번은 a와 d가 각각 7, 1이고 included의 길이가 7입니다. 이를 표로 나타내면 다음과 같습니다.
||1항|2항|3항|4항|5항|6항|7항|
|-|-|---|---|---|---|---|---|
|등차수열|7|8|9|10|11|12|13|
|included|false|false|false|true|false|false|false|
따라서 4항만 true 이므로 10을 return 합니다
class Solution {
public int solution(int a, int d, boolean[] included) {
int answer = 0;
return answer;
}
}
풀이과정
: 네? 등차수열이요..??? 일단 등차수열의 합을 구하는 공식부터 찾아봤다
x번째 항을 ax, 공차를 d라고 하면 등차수열의 일반항은 an = ax + (n- x)d라고 한다
이 문제는 첫번째 항부터 값을 매기니까 여기서는 an = a1 + (n - 1)d를 사용하면 된다
for문의 식을 i = 0으로 시작하고, 저 식을 if문 안에 넣으면 될것같다
정답
class Solution {
public int solution(int a, int d, boolean[] included) {
int answer = 0;
for (int i = 0; i < included.length; i++) {
if (included[i]) {
answer += a + (i * d);
}
}
return answer;
}
}
++ 다른사람의 풀이
문제3.
1부터 6까지 숫자가 적힌 주사위가 세 개 있습니다. 세 주사위를 굴렸을 때 나온 숫자를 각각 a, b, c라고 했을 때 얻는 점수는 다음과 같습니다.
- 세 숫자가 모두 다르다면 a + b + c 점을 얻습니다.
- 세 숫자 중 어느 두 숫자는 같고 나머지 다른 숫자는 다르다면 (a + b + c) × (a2 + b2 + c2 )점을 얻습니다.
- 세 숫자가 모두 같다면 (a + b + c) × (a2 + b2 + c2 ) × (a3 + b3 + c3 )점을 얻습니다.
세 정수 a, b, c가 매개변수로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.
제한사항: a, b, c는 1 이상의 6 이하의 정수입니다
입출력 예
a | b | c | result |
2 | 6 | 1 | 9 |
5 | 3 | 3 | 473 |
4 | 4 | 4 | 110592 |
- 입출력 예 #1: 예제 1번에서 세 주사위 숫자가 모두 다르므로 2 + 6 + 1 = 9점을 얻습니다. 따라서 9를 return 합니다.
- 입출력 예 #2: 예제 2번에서 두 주사위 숫자만 같으므로 (5 + 3 + 3) × (52 + 32 + 32 ) = 11 × 43 = 473점을 얻습니다. 따라서 473을 return 합니다.
- 입출력 예 #3: 예제 3번에서 세 주사위 숫자가 모두 같으므로 (4 + 4 + 4) × (42 + 42 + 42 ) × (43 + 43 + 43 ) = 12 × 48 × 192 = 110,592점을 얻습니다. 따라서 110592를 return 합니다.
class Solution {
public int solution(int a, int b, int c) {
int answer = 0;
return answer;
}
}
풀이과정
:
class Solution {
public int solution(int a, int b, int c) {
int answer = 0;
if (a != b && b != c) {
answer = a + b + c;
} else if ((a = b && b != c) || (b = c && c !=a) || (a = c && c != b)) {
answer = (a + b + c) * (a*a + b*b + c*c);
} else if ( a = b = c) {
answer = (a + b + c) * (a*a + b*b + c*c) + (a*a*a + b*b*b + c*c*c);
}
return answer;
}
}
일단 마구잡이로 이렇게 썼는데 예상치 못하게도 &&에서 오류가 난다고 떴다. &로 바꿔도 마찬가지...
기호가 문제가 아닌가...? 하고 c!=a 를 추가해봤다. 그리고 식도 조금 더 수정하였다
정답
class Solution {
public int solution(int a, int b, int c) {
int answer = 0;
if (a != b && b != c && c != a) {
answer = a + b + c;
} else if ( a == b && b == c) {
answer = (a + b + c) * (a*a + b*b + c*c) * (a*a*a + b*b*b + c*c*c);
} else {
answer = (a + b + c) * (a*a + b*b + c*c);
}
return answer;
}
}
++ 다른사람의 풀이
class Solution {
public int solution(int a, int b, int c) {
return a == b && b == c ? (a + b + c) * (a * a + b * b + c * c) * (a * a * a + b * b * b + c * c * c) : a == b || b == c || c == a ? (a + b + c) * (a * a + b * b + c * c) : a + b + c;
}
}
삼항연산자로 한줄에 끝내기...ㄷㄷ
class Solution {
public int solution(int a, int b, int c) {
int answer = 1;
int count = 1;
if(a == b || a == c || b == c) {
count++;
}
if(a == b && b == c) {
count++;
}
for(int i = 1; i <= count; i++) {
answer *= (pow(a,i)+pow(b,i)+pow(c,i));
}
return answer;
}
private int pow(int a, int b) {
if(b == 0) return 1;
return a * pow(a, b-1);
}
}
pow라는 클래스를 보고 뜻이 있나? 했는데 Math.pow(a,b)라는 함수가 있다고 한다. a의 b승을 뜻하는 자바의 함수다.
아마 여기서 클래스 이름을 따오신듯.
밑에 private 보조 메소드를 써서 짜는건 생각도 못했다!
문제4.
정수가 담긴 리스트 num_list가 주어질 때, 모든 원소들의 곱이 모든 원소들의 합의 제곱보다 작으면 1을 크면 0을 return하도록 solution 함수를 완성해주세요.
제한사항:
- 2 ≤ num_list의 길이 ≤ 10
- 1 ≤ num_list의 원소 ≤ 9
입출력 예
num_list | result |
[3, 4, 5, 2, 1] | 1 |
[5, 7, 8, 3] | 0 |
- 입출력 예 #1: 모든 원소의 곱은 120, 합의 제곱은 225이므로 1을 return합니다.
- 입출력 예 #2: 모든 원소의 곱은 840, 합의 제곱은 529이므로 0을 return합니다.
class Solution {
public int solution(int[] num_list) {
int answer = 0;
return answer;
}
}
풀이과정
: 전에 코드 공부할때 쓴 for문을 쓰면 될것 같다. 더해서 삼항연산자와 위에서 쓴 pow 함수를 써보았다
그때 써둔 향상형 for문 사용방법 내용이 날라가서...ㅠㅠㅠ 전에 써둔 예시를 여기에 다시 써둔다
for (타입 변수명 : 배열 또는 컬렉션) {
// 반복할 코드
}
- 타입: 컬렉션 또는 배열에 저장된 요소의 데이터 타입. 여기서는 Onln_Lctr
- 변수명: 반복문 내에서 사용할 임시 변수로, 컬렉션의 현재 요소를 나타냄. 여기서는 onlnLctr
- :: "in"이라는 의미로, 컬렉션에서 각 요소를 하나씩 꺼내옴
- 배열 또는 컬렉션: 반복 대상이 되는 데이터. 여기서는 onlnLctrs
정답
class Solution {
public int solution(int[] num_list) {
int sum = 0;
int multiple = 1;
for(int num : num_list) {
sum += num;
multiple *= num;
}
return multiple < Math.pow(sum, 2) ? 1 : 0;
}
}
++ 다른사람의 풀이
문제5.
정수가 담긴 리스트 num_list가 주어집니다. num_list의 홀수만 순서대로 이어 붙인 수와 짝수만 순서대로 이어 붙인 수의 합을 return하도록 solution 함수를 완성해주세요.
제한사항:
- 2 ≤ num_list의 길이 ≤ 10
- 1 ≤ num_list의 원소 ≤ 9
- num_list에는 적어도 한 개씩의 짝수와 홀수가 있습니다.
입출력 예
num_list | result |
[3, 4, 5, 2, 1] | 393 |
[5, 7, 8, 3] | 581 |
- 입출력 예 #1: 홀수만 이어 붙인 수는 351이고 짝수만 이어 붙인 수는 42입니다. 두 수의 합은 393입니다.
- 입출력 예 #2: 홀수만 이어 붙인 수는 573이고 짝수만 이어 붙인 수는 8입니다. 두 수의 합은 581입니다.
class Solution {
public int solution(int[] num_list) {
int answer = 0;
return answer;
}
}
풀이과정
: 일단 짝수와 홀수를 변수로 선언하고, for문을 통해 돌린뒤 if-else문으로 짝수 홀수를 나누면 될것 같았다
정답
class Solution {
public int solution(int[] num_list) {
int answer = 0;
String odd = "";
String even = "";
for(int i = 0; i < num_list.length; i++) {
if (num_list[i] % 2 == 0) {
even += Integer.toString(num_list[i]);
} else {
odd += Integer.toString(num_list[i]);
}
}
answer = Integer.parseInt(even) + Integer.parseInt(odd);
return answer;
}
}
++ 다른사람의 풀이
3. 이력서/지원/면접 준비 활동
'일지 > 취준일기' 카테고리의 다른 글
2024_12_05 취준일기 13일차 (0) | 2024.12.05 |
---|---|
2024_12_04 취준일기 12일차 (0) | 2024.12.05 |
2024_12_02 취준일기 10일차 (1) | 2024.12.02 |
2024_11_29 취준일기 8일차 (0) | 2024.11.29 |
2024_11_28 취준일기 7일차 (0) | 2024.11.28 |