// you can also use imports, for example:// import java.util.*;// you can write to stdout for debugging purposes, e.g.// System.out.println("this is a debug message");classSolution{
publicintsolution(int[] A){
// write your code in Java SE 11int cnt = 0;
int cntSum = 0;
int total = 0;
for (int i = A.length - 1; i >= 0; i--) {
if (A[i] == 1) {
cnt++;
} else {
cntSum += cnt; // 2 // 3
total += cntSum; // 2 // 5if (total > 1000000000) {
total = -1;
break;
}
cnt = 0;
}
}
return total;
}
}
// you can also use imports, for example:// import java.util.*;// you can write to stdout for debugging purposes, e.g.// System.out.println("this is a debug message");import java.util.*;
classSolution{
publicintsolution(int[] A){
// write your code in Java SE 8int arrSize = A.length;
HashSet<Integer> hs = new HashSet<>();
for (int i = 0; i < arrSize; i++) {
hs.add(i + 1);
}
for (int i = 0; i < arrSize; i++) {
hs.remove(A[i]);
}
if (hs.isEmpty()) {
return1;
} else {
return0;
}
}
}
publicclassSolution{
// [3차] 자동완성 // 테스트 케이스 부족, 시간 초과publicstaticintstrContainWordCnt(String[] words, String str){
int cnt = 0;
for (String word : words) {
if (word.contains(str)) {
cnt++;
}
if (cnt > 1) return2;
}
return cnt;
}
publicstaticintsolution(String[] words){
int answer = 0;
String word = ""; // words 배열 속 원소
StringBuilder sb = new StringBuilder(); // 문자열 비교를 위한 StringBuilderfor (int i = 0; i < words.length; i++) { // words의 문자 하나씩 체크
word = words[i];
sb.setLength(0); // StringBuilder 초기화for (int j = 0; j < word.length(); j++) {
sb.append(word.charAt(j));
// if (Arrays.asList(words).contains(sb.toString())) // 배열이 특정 문자열을 포함하는지 여부를 확인할 때 사용// // System.out.println(Collections.frequency(Arrays.asList(words), sb.toString())); // 이건 sb.toString()이 배열에 몇 개 들어있는지 체크네// // if (Collections.frequency(Arrays.asList(words), sb.toString()) == 1 || j == word.length() - 1) { // 특정 문자열을 포함하는 문자가 1개 남았거나, 2개 이상 남았어도 특정 문자열이 현재 i번째 word 자체인 경우// answer += j + 1; // j는 0부터 시작했으므로 개수는 + 1// break; // 안쪽 for문 탈출// } else {// continue;// }if (strContainWordCnt(words, sb.toString()) == 1 || j == word.length() - 1) { // 특정 문자열을 포함하는 문자가 1개 남았거나, 2개 이상 남았어도 특정 문자열이 현재 i번째 word 자체인 경우
answer += j + 1; // j는 0부터 시작했으므로 개수는 + 1break; // 안쪽 for문 탈출
} else {
continue;
}
}
}
return answer;
}
publicstaticvoidmain(String[] args){
// TODO Auto-generated method stub
String[] words = {"worlll","warrior","war","word","world"}; // "abc","def","ghi","jklm" // 4 // a, d, g, j만 입력하면 자동완성 가능
System.out.println(solution(words)); // 21// "worlll","warrior","war","word","world"// "worll" ,"warr" ,"war","word","world" // 5 + 4 + 3 + 4 + 5// "worlll","warrior","war","word","world" // false false false false false// "w" 입력했을 때 후보 5개 (worlll길이보다 작아)// "wo" 입력했을 때 후보 3개 (worlll길이보다 작아)// "wor" 입력했을 때 후보 3개 (worlll길이보다 작아)// "worl" 입력했을 때 후보 2개 (worlll길이보다 작아)// "worll" 입력했을 때 후보 1개(5) (worlll길이보다 작아) // true false false false false// "w" 입력했을 때 후보 5개 (warrior길이보다 작아)// "wa" 입력했을 때 후보 2개 (warrior길이보다 작아)// "war" 입력했을 때 후보 2개 (warrior길이보다 작아)// "warr" 입력했을 때 후보 1개(4) (warrior길이보다 작아) // true true false false false// "w" 입력했을 때 후보 5개 (war길이보다 작아)// "wa" 입력했을 때 후보 2개 (war길이보다 작아)// "war" 입력했을 때 후보 2개 but war길이와 같아(3) // true true true false false// "w" 입력했을 때 후보 5개 (word길이보다 작아)// "wo" 입력했을 때 후보 3개 (word길이보다 작아)// "wor" 입력했을 때 후보 3개 (word길이보다 작아)// "word" 입력했을 때 후보 1개 and word길이와 같아(4) // true true true true false// "w" 입력했을 때 후보 5개 (world길이보다 작아)// "wo" 입력했을 때 후보 3개 (world길이보다 작아)// "wor" 입력했을 때 후보 3개 (world길이보다 작아)// "worl" 입력했을 때 후보 2개 (world길이보다 작아)// "world" 입력했을 때 후보 1개 and world길이와 같아(5) // true true true true true// 첫 번째 단어부터 마지막 단어까지 체크// 한 단어를 앞에서부터 차례로 자르면서 더하고 그 단어가 전체 단어 배열 중 몇 개의 단어와 일치할 수 있는지 판단// 후보가 1개이거나 or 2개 이상 존재할지라도 마지막 글자까지 잘라서 더한 상태라면(현재 단어 그 자체라면) 현재까지 자른 글자 수 카운트해서 더하기
}
}
문자열 배열 {"AB", "ABC", "BC", "ZX"} 이 있을 때 문자열 "AB"를 포함하는 원소의 개수를 알고싶을 때 배열의 길이만큼 반복하며 체크하는 방법 외에 2를 바로 리턴받을 수 있는 방법이 있을까?
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
publicclassSolution{
// 주차 요금 계산publicstaticintcalcMin(String time1, String time2){
String[] time1Arr = time1.split(":");
String[] time2Arr = time2.split(":");
int min = (Integer.parseInt(time2Arr[0]) * 60 + Integer.parseInt(time2Arr[1])) - (Integer.parseInt(time1Arr[0]) * 60 + Integer.parseInt(time1Arr[1]));
return min;
}
publicstaticint[] solution(int[] fees, String[] records) {
int[] answer = {};
String[] tempArr = new String[3];
// 차량 번호로 기록 구분 필요// 0000 : 06:00 IN, 06:34 OUT, 18:59 IN, 23:59 OUT // 34 + 300// 0148 : 07:59 IN, 19:09 OUT // 670// 5961 : 05:34 IN, 07:59 OUT, 22:59 IN, 23:00 OUT // 145 + 1// IN과 OUT은 담을 필요없다. 기록이 짝수 개 존재하는 것이 중요하며, 이 문제에서는 무조건 IN, OUT, IN, OUT 순서이다.
HashMap<String, ArrayList<String>> hmlist = new HashMap<>();
ArrayList<String> numberList = new ArrayList<>();
for (int i = 0; i < records.length; i++) {
tempArr = records[i].split(" "); // "06:00", "0000", "IN"if (!hmlist.containsKey(tempArr[1])) { // "0000"
hmlist.put(tempArr[1], new ArrayList<String>()); // key 등록 // "0000"
numberList.add(tempArr[1]); // key값만 담아둘 리스트 // "0000"
}
hmlist.get(tempArr[1]).add(tempArr[0]); // "06:00"
}
// numberList에 현재 넘버 리스트 담겨있음
Collections.sort(numberList); // key값 리스트 오름차순 정렬for (String str : numberList) { // 0000, 0148, 5961
System.out.println(str);
if (hmlist.get(str).size() % 2 == 1) { // 짝이 안맞는다면, 즉 마지막 출차 기록이 없다면
hmlist.get(str).add("23:59"); // 마지막 출차 기록은 23:59로
}
}
int[] totalTimeArr = {}; // 차량 번호별 총 시간 담기 위한 배열
totalTimeArr = newint[numberList.size()]; // 시간 담을 배열 크기는 차량 번호 수만큼
answer = newint[numberList.size()]; // 금액 담을 배열 크기는 차량 번호 수만큼
String[] tempTimeArr = new String[2]; // 시간 두 개씩 잘라서 분으로 바꾸기 위한 임시 배열int j = 0; // 차량 번호 수만큼 증가시킬 변수for (String str : numberList) {
int i = 0; // 시간 두 개를 담기 위한 인덱스 iint timeSum = 0;
for (String time : hmlist.get(str)) {
tempTimeArr[i] = time; // 0, 1
i++;
if (i == 2) { // 0, 1을 넘어가면
timeSum += calcMin(tempTimeArr[0], tempTimeArr[1]); // 분 계산 함수
i = 0; // 시간 두 개씩 끊기 위해 0으로 초기화
}
}
totalTimeArr[j] = timeSum; // 해당 차량 번호의 총 시간
j++; // 0 ~ 2
}
double d = 0;
for (int i = 0; i < totalTimeArr.length; i++) {
if (totalTimeArr[i] <= fees[0]) { // 180분을 넘지 않았다면
answer[i] = fees[1]; // 5000원
} else { // 180분을 초과했다면
d = (double)(totalTimeArr[i] - fees[0]) / fees[2]; // 소수점 올림을 위해 double형으로 받기
answer[i] = (int)Math.ceil(d) * fees[3] + fees[1]; // 초과한 금액 + 5000원
}
}
for (int i = 0; i <answer.length; i++) {
System.out.println(answer[i]);
}
return answer;
}
publicstaticvoidmain(String[] args){
// TODO Auto-generated method stubint[] fees = {180, 5000, 10, 600}; // 기본시간(분), 기본요금(원), 단위시간(분), 단위요금(원)
String[] records = {"05:34 5961 IN", "06:00 0000 IN", "06:34 0000 OUT", "07:59 5961 OUT", "07:59 0148 IN", "18:59 0000 IN", "19:09 0148 OUT", "22:59 5961 IN", "23:00 5961 OUT"}; // 시:분 차 번호 IN/OUT // 마지막 나간 기록 없으면 23:59 나간 것으로 간주
System.out.println(solution(fees, records)); // 14600, 34400, 5000
}
}