Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 스프링 mvc2 - 검증
- 자바로 계산기 만들기
- 자바 중급1편 - 날짜와 시간
- 자바 고급2편 - 네트워크 프로그램
- 자바의 정석 기초편 ch14
- 2024 정보처리기사 수제비 실기
- 자바로 키오스크 만들기
- 스프링 mvc2 - 로그인 처리
- 자바 중급2편 - 컬렉션 프레임워크
- 스프링 트랜잭션
- 자바의 정석 기초편 ch12
- 자바 기초
- 자바의 정석 기초편 ch7
- 자바의 정석 기초편 ch13
- @Aspect
- 스프링 mvc1 - 스프링 mvc
- 스프링 고급 - 스프링 aop
- 스프링 입문(무료)
- 자바의 정석 기초편 ch4
- 데이터 접근 기술
- 자바의 정석 기초편 ch5
- 자바 고급2편 - io
- 스프링 mvc2 - 타임리프
- 자바의 정석 기초편 ch9
- 2024 정보처리기사 시나공 필기
- 자바의 정석 기초편 ch1
- 자바의 정석 기초편 ch11
- 자바의 정석 기초편 ch6
- 자바의 정석 기초편 ch2
- 람다
Archives
- Today
- Total
개발공부기록
Java - 음양 더하기, 핸드폰 번호 가리지, 없는 숫자 더하기, 제일 작은 수 제거하기 / SQL(MySQL) - 중성화 여부 파악하기, 카테고리 별 상품 개수 구하기 본문
기타 개발 공부/온라인 코딩 테스트 회고
Java - 음양 더하기, 핸드폰 번호 가리지, 없는 숫자 더하기, 제일 작은 수 제거하기 / SQL(MySQL) - 중성화 여부 파악하기, 카테고리 별 상품 개수 구하기
소소한나구리 2025. 3. 8. 18:12728x90
Java
음양 더하기
문제
- 프로그래머스 - https://school.programmers.co.kr/learn/courses/30/lessons/76501
- 정수들의 절댓값을 차례대로 담은 정수 배열과 이 정수들의 부호를 차례대로 담은 불리언 배열이 매개변수로 주어졌을 때 실제 정수들의 합을 구하여 return 하는 함수를 완성
제한조건
- 정수 배열의 길이는 1 ~ 1,000 사이이며 입력되는 값도 각각 1 ~ 1,000 사이임
- 불리언 배열의 길이도 정수 배열의 길이와 같으며 불리언 배열의 값이 true이면 같은 인덱스에 위치한 정수 배열의 값은 양수이고 false 이면 음수임
입출력 예시

나의 풀이
class Solution {
public int solution(int[] absolutes, boolean[] signs) {
int answer = 0;
for (int i = 0; i < absolutes.length; i++) {
if (!signs[i]) {
answer += absolutes[i] * -1;
} else {
answer += absolutes[i];
}
}
return answer;
}
}
- 처음에는 억지로 스트림을 써보려했으나 여기서는 반복문과 조건문으로 해결하는 것이 더 깔끔할 것 같아서 정수 배열의 길이만큼 반복문을 돌렸다
- signs[i]의 조건이 false 인 경우 absolutes[i]의 값에 -1을 곱하여 음수를 만들고 answer의 값에 더하고 그게 아니라면 absolutes[i]를 그냥 answer에 덧셈하여 answer의 값을 반환하여 문제를 풀었다.
다른 풀이
class Solution {
public int solution(int[] absolutes, boolean[] signs) {
int answer = 0;
for (int i = 0; i < absolutes.length; i++) {
answer += (signs[i]) ? absolutes[i] : -absolutes[i];
}
return answer;
}
}
class Solution2 {
public int solution(int[] absolutes, boolean[] signs) {
int answer = 0;
for (int i = 0; i < absolutes.length; i++) {
if (signs[i]) {
answer += absolutes[i];
} else {
answer -= absolutes[i];
}
}
return answer;
}
}
- 코드를 작성할 때는 인지하지 못했는데, 다른 풀이를 보니 굳이 가독성더 떨어지게 if문에 ! 부정 연산자를 사용하지 않고 양수를 먼저 더하는 것이 훨씬 가독성이 좋다고 생각이 들었다
- 그리고 signs[i]가 false일 때 굳이 absolutes[i]의 값에 -1을 곱셈 연산하여 음수를 만들 필요 없이 그냥 뺄셈 연산을 하는것이 더 좋다고 생각이 들었다
- 또한, 다른 풀이로는 if문으로 signs 배열의 값을 꺼내서 조건에 따라 분기하는 것 보다 삼항 연산자를 사용하는 것이 오히려 if문보다 더 가독성이 좋아보여서 풀이를 가져왔다.
- 이렇게 간단한 조건을 통해서 문제를 풀이할 때는 먼저 if문으로 작성했더라도 삼항연산자로 적용했을 때 가독성이 어떨지 한번 적용해보는 연습이 필요할 것 같다.
핸드폰 번호 가리기
문제
- 프로그래머스 - https://school.programmers.co.kr/learn/courses/30/lessons/12948
- 전화번호가 문자열로 주어졌을 때 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부*로 가린 문자열을 리턴하는 함수를 완성
제한조건
- 전화번호의 길이는 4 ~ 20의 문자열
입출력 예시

나의 풀이
class Solution {
public String solution(String phone_number) {
int numberLength = phone_number.length();
int starLength = numberLength - 4;
StringBuilder star = new StringBuilder();
for (int i = 0; i < starLength; i++) {
star.append("*");
}
String lastNumber = phone_number.substring(starLength);
return star + lastNumber;
}
}
- 전달된 전화번호의 길이에서 -4를 빼면 *로 표시해야 할 개수가 나오므로 해당 개수만큼 반복하여 "*"을 문자열 star에 저장 했고, 이 때문자열을 연산하는 것이기 때문에 가변인 StringBuilder를 사용했다.
- 입력받은 문자열의 뒷 4자리만 추출하기 위해 substring(*로 표시해야할 개수)을 사용하여 lastNumber라는 문자열로 저장하여 star와 lastNumber를 합쳐서 문제를 해결했다.
다른 풀이
class Solution {
public String solution(String phone_number) {
char[] ch = phone_number.toCharArray();
for(int i = 0; i < ch.length - 4; i ++){
ch[i] = '*';
}
return String.valueOf(ch);
}
}
class Solution {
public String solution(String phone_number) {
return phone_number.replaceAll(".(?=.{4})", "*");
}
}
- 간결하게 입력받은 문자열을 toCharArray()메서드를 활용하여 문자배열로 변환한 배열의 길이 - 4만큼 반복하여 앞에서부터 '*'로 변환하고 최종적으로 문자 배열을 String으로 변환하여 반환하는 것도 가독성이 좋은 것 같다.
- 나는 정규식을 잘 다룰줄 모르기에 replaceAll()메서드를 사용하진 않았지만 정규식을 잘 다룰줄 안다면 정규식을 활용하면 매우 편하게 문자열을 다룰 수 있다
- 정규식은 보통 인터넷에 잘나와있고, AI툴이 정규식을 잘 만들어주기 때문에 실무에서는 정규식을 잘 몰라도 원하는 조건만 확실하다면 정규식을 편리하게 사용할 수 있지만 코딩테스트에서는 활용하기 어려울 것 같다.
없는 숫자 더하기
문제
- 프로그래머스 - https://school.programmers.co.kr/learn/courses/30/lessons/86051
- 0부터 9까지의 숫자 중 일부가 들어있는 정수 배열이 주어졌을 때 해당 정수 배열에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return하도록 함수를 완성
제한조건
- 정수 배열의 모든 요소는 서로 다르며 0부터 9까지 사이의 값이 들어있음
- 정수 배열의 길이는 1 ~ 9임
입출력 예시

나의풀이
class Solution {
public int solution(int[] numbers) {
int answer = 45;
for (int i = 0; i < numbers.length; i++) {
answer -= numbers[i];
}
return answer;
}
}
- 정수 배열의 값이 모두 다르고, 0부터 9까지의 값이라고 제한되어있으므로 0 ~ 9까지의 모든 숫자를 더하면 45이다.
- 즉, 정수 배열의 값을 모두 더해도 45와 작거나 같기 때문에 45에서 정수 배열의 각 요소를 빼면 남아있는 값은 정수 배열의 요소에 없는 값들의 합이 된다.
다른 풀이
class Solution {
public int solution(int[] numbers) {
return 45 - Arrays.stream(numbers).sum();
}
}
- 위와 동일한 방식을 스트림을 활용하서 풀이한 방법으로 확실히 스트림 문법이 간결하다.
제일 작은 수 가져오기
문제
- 프로그래머스 - https://school.programmers.co.kr/learn/courses/30/lessons/12935
- 정수를 저장한 배열에서 가장 작은 수를 제거한 배열을 리턴하는 함수를 안성
- 리턴하려는 배열이 빈 배열인 경우엔 -1을 채워서 리턴
제한조건
- 정수 배열의 길이는 1 이상인 배열임
입출력 예시

나의풀이
import java.util.Arrays;
class Solution {
public int[] solution(int[] arr) {
if (arr.length <= 1) {
return new int[]{-1};
}
int min = Arrays.stream(arr).min().getAsInt();
int[] answer = new int[arr.length - 1];
int index = 0;
for (int num : arr) {
if (num == min) {
continue;
}
answer[index] = num;
index++;
}
return answer;
}
}
- 우선 스트림 문법을 활용해 보기 위해 배열을 Arrays.stream(arr)을 활용하여 스트림으로 만들고 거기서 min()연산을 활용하면 최소값을 찾을 수 있다.
- min()연산까지만 하면 반환값이 Optional이기 때문에 getAsInt()로 int타입으로 반환하였다.
- 이때 반환값을 찾지 못하면 NoSuchElementException예외가 발생하는데, 앞에서 arr.length가 1보다 작거나 같으면 -1이 담긴 정수배열을 반환하도록 예외 코드를 작성했기 NoSuchElementException 예외가 터질일이 없다.
- 이후 arr배열의 길이에서 -1뺀 길이만큼 새로운 배열을 만들어서, arr의 각 요소를 순회하면서 새로 생성한 배열에 값을 대입하는데, 이때 조건문을 통해 arr의 요소가 스트림 연산으로 찾았던 최솟값과 같다면 값을 대입하지 말고 건너뛰도록 continue;를 사용하여 문제를 해결했다.
다른 풀이
import java.util.Arrays;
import java.util.stream.Stream;
import java.util.List;
import java.util.ArrayList;
class Solution {
public int[] solution(int[] arr) {
if (arr.length <= 1) return new int[]{ -1 };
int min = Arrays.stream(arr).min().getAsInt();
return Arrays.stream(arr).filter(i -> i != min).toArray();
}
}
- 접근법은 내가 한것과 같지만, 마지막에 새로운 배열을 생성하는 과정을 스트림의 .filter(i -> i != min)조건에 해당하지 않는 값을 새로운 배열로 만들어서 반환하는 코드가 가독성이 뛰어나보여서 인상 깊었다.
- 배열을 반환하는 알고리즘을 풀 때 배열을 생성하고, 배열에 값을 입력하고 그 변수를 반환하는 것보다 바로 배열을 생성하면서 반환이 가능하다면 위와 같은 방법을 활용해볼 수 있을 것 같다
SQL(MySQL)
중성화 여부 파악하기
문제 및 테이블 예시
- SEX_UPON_INTAKE 컬럼에 'Neutered' 또는 'Spayed'단어가 들어있으면 중성화가 되어있는 동물임
- 해당 테이블에서 동물의 아이디와 이름 그리고 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성할 때 중성화가 되어있으면 'O', 아니라면 'X'로 표시되도록 작성

입출력 예시

나의 풀이
SELECT
ANIMAL_ID,
NAME,
IF(SEX_UPON_INTAKE REGEXP 'Neutered|Spayed', 'O', 'X') AS 중성화
FROM
ANIMAL_INS
ORDER BY
ANIMAL_ID
- 조건에 따라 값이 다르게 출력해야 하기 때문에 뭔가 특별한 연산자가 필요하다고 생각했었고, IF문 혹은 CASE-WHEN 문을 사용해야 할 것 같다고 생각이 들었다.
- 근데 막상 하려고하다보니 생각이 잘 나지 않아서 사용법을 검색했다.
- 특히 여기서 LIKE를 활용하면 OR, AND와 같은 연산자를 활용하여 조건을 두개를 입력해야 하는데, REGEXP를 사용하면 두가지 키워드가 포함된 값을 한번의 조건식으로 찾을 수 있다.
- 이때 '단어1|'단어2' 처럼 |(파이프)로 구분지어야하 한다. REGEXP 함수는 정규식을 활용하므로 정규식을 활용하는 방법은 더 별도로 찾아봐야 함
카테고리 별 상품 개수 구하기
문제 및 테이블 예시
- PRODUCT 테이블에서 상품 카테고리 코드(PRODUCT_CODE 앞 2자리) 별 상품 개수를 출력하는 SQL문을 작성
- 결과는 상품 카테고리 코드를 기준으로 오름차순 정렬

입출력 예시

나의 풀이
SELECT
LEFT(PRODUCT_CODE, 2) AS CATEGORY,
COUNT(PRODUCT_CODE) AS PRODUCTS
FROM PRODUCT
GROUP BY CATEGORY
ORDER BY PRODUCT_CODE
- PRODUCT_CODE의 앞 2자리를 잘라서 그룹을 지어야 할 것 같았는데 문자열을 다루는 함수가 생각이 나질 않아 검색했다
- 기본적으로 LEFT, SUBSTRING, RIGHT가 있었고 각 간단한 사용방법은 아래와 같다
- 왼쪽에서 문자열 자르기: LEFT(컬럼명 or 문자열, 왼쪽에서 잘라낼 문자열의 길이)
- 오른쪽에서 문자열 자르기: RIGHT(컬럼명 or 문자열, 오른쪽에서 잘라낼 문자열의 길이)
- 중간에서 문자열 자르기: SUBSTRING(컬럼 or 문자열, 시작위치, 길이), 이때 Java는 길이만큼 자를 때 마지막은 포함안되지만 여기서는 포함된다
- 구분자의 개수만큼 자르기: SUBSTRING_INDEX(컬럼 OR 문자열, 구분자, 개수), 이때 왼쪽에서부터 구분자의 개수만큼 잘라낼거면 양수를, 오른쪽부터 구분자의 개수만큼 잘라낼 꺼면 음수를 작성하면 되며 마지막 구분자는 포함되지 않는다
- 예를 들어 SUBSTRING_INDEX('www.nagul2.tistory.com', '.', 2) 라면 왼쪽부터 2개의 구분자 만큼 잘라고 마지막 구분자는 포함이 안되므로 'www.nagul2' 까지 반환된다
- 오른쪽부터 하려면 SUBSTRING_INDEX('www.nagul2.tistory.com', '.', -2)를 하면 'tistory.com'이 반환된다
728x90