[Bronze I] 회사에 있는 사람 - 7785
성능 요약
메모리: ? KB, 시간: ? ms
분류
?
제출 일자
문제 설명
상근이는 세계적인 소프트웨어 회사 기글에서 일한다. 이 회사의 가장 큰 특징은 자유로운 출퇴근 시간이다. 따라서, 직원들은 반드시 9시부터 6시까지 회사에 있지 않아도 된다.
각 직원은 자기가 원할 때 출근할 수 있고, 아무때나 퇴근할 수 있다.
상근이는 모든 사람의 출입카드 시스템의 로그를 가지고 있다. 이 로그는 어떤 사람이 회사에 들어왔는지, 나갔는지가 기록되어져 있다. 로그가 주어졌을 때, 현재 회사에 있는 모든 사람을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 로그에 기록된 출입 기록의 수 n이 주어진다. (2 ≤ n ≤ 106) 다음 n개의 줄에는 출입 기록이 순서대로 주어지며, 각 사람의 이름이 주어지고 "enter"나 "leave"가 주어진다. "enter"인 경우는 출근, "leave"인 경우는 퇴근이다.
회사에는 동명이인이 없으며, 대소문자가 다른 경우에는 다른 이름이다. 사람들의 이름은 알파벳 대소문자로 구성된 5글자 이하의 문자열이다.
출력
현재 회사에 있는 사람의 이름을 사전 순의 역순으로 한 줄에 한 명씩 출력한다.
코드
시간 초과 FAIL
package 회사에있는사람;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
scanner.nextLine();
// 4종 과일의 총 합이 5개일 경우 YES 그렇지 않으면 NO
// 접근1 : HASHMAP으로 풀기
String[][] attendanceRecord = new String[num][2];
for (int i = 0; i < num; i++) {
String strRaw = scanner.nextLine();
String[] strList = strRaw.split(" ");
attendanceRecord[i][0] = strList[0];
attendanceRecord[i][1] = strList[1];
}
// 사람 이름 목록
List<String> nameList = new ArrayList<>(num);
for(int i = 0; i < num; i++){
nameList.add(attendanceRecord[i][0]);
}
Set<String> uniqueNames = new HashSet<>();
List<String> result = new ArrayList<>();
for (String name : nameList) {
// uniqueNames에 추가할 때 이미 존재하는 이름이라면 result 리스트에 추가하지 않습니다.
if (uniqueNames.add(name)) {
result.add(name);
} else {
// 이미 존재하는 이름이라면 해당 이름을 리스트에서 삭제합니다.
result.remove(name);
}
}
result.sort(Comparator.reverseOrder());
for(String name : result)
System.out.println(name);
scanner.close();
}
}
[Bronze I] 평균 - 1546
성능 요약
메모리: 18404 KB, 시간: 260 ms
분류
사칙연산, 수학
제출 일자
2024년 5월 30일 14:04:33
문제 설명
세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다. 일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 M이라고 한다. 그리고 나서 모든 점수를 점수/M*100으로 고쳤다.
예를 들어, 세준이의 최고점이 70이고, 수학점수가 50이었으면 수학점수는 50/70*100이 되어 71.43점이 된다.
세준이의 성적을 위의 방법대로 새로 계산했을 때, 새로운 평균을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보다 크다.
출력
첫째 줄에 새로운 평균을 출력한다. 실제 정답과 출력값의 절대오차 또는 상대오차가 10-2 이하이면 정답이다.
코드
package 평균;
import java.util.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
/**
* 문제 : 첫줄에 학생 수를 입력받고,
* 다음줄에 각 학생들의 점수를 공백을 기준으로 입력받아 리스트에 저장한 후, 해당 점수들을 처리하여 평균을 구하는 것 입니다.
*
*/
Scanner scanner = new Scanner(System.in);
// 학생 수를 입력받습니다.
int n = scanner.nextInt();
scanner.nextLine();
// 학생들의 원점수가 담긴 리스트를 생성합니다.
List<Integer> digitList = Arrays.stream(scanner.nextLine().split(" "))
.map(Integer::parseInt)
.collect(Collectors.toList());
// 원점수 리스트 중 최대값을 찾습니다.
int max = Collections.max(digitList);
// 점수를 세탁하여 새로운 리스트에 저장합니다. : (원래최고점수 / 원래점수[idx]) * 100
List<Double> cleanedNumArr = new ArrayList<>(3);
for(double num : digitList) {
double cleanNum = ( num / max ) * 100;
cleanedNumArr.add(cleanNum);
}
// 세탁된 점수들의 총합을 구합니다.
double total = cleanedNumArr.stream().mapToDouble(num -> num.doubleValue()).sum();
// 평균을 계산합니다.
double answer = total / n;
System.out.println(answer);
}
}
[Bronze I] 단어 공부 - 1157
성능 요약
메모리: 47164 KB, 시간: 564 ms
분류
구현, 문자열
제출 일자
2024년 5월 30일 13:01:06
문제 설명
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
입력
첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.
출력
첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.
코드
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
/**
* 1. solution 메서드는 문자열에서 가장 많이 나오는 문자를 찾습니다.
*
* 2. 입력받은 문자열(word)을 모두 소문자로 변환한 후, 각 문자를 char[] 타입의 chars에 할당합니다.
* 3. 그 다음, 각 문자의 등장 횟수를 저장하기 위한 HashMap을 생성합니다.
*
* 4. chars 배열을 순회하면서 각 문자가 charMap에 이미 알파벳이 존재하는지 확인하고, 등장 횟수를 증가시킵니다.
* 5. 이렇게 하면 각 문자의 등장 횟수를 charMap에 저장할 수 있습니다.
*
* 6. 가장 많이 등장한 문자와 해당 횟수를 저장하기 위해 maxCount와 maxOccuranceChar 변수를 초기화합니다.
*
* 7. charMap을 순회하면서 가장 많이 등장한 문자를 찾습니다.
* 8. 각 문자의 등장 횟수를 변수 count를 통해 확인하고, 현재까지의 최대 등장 횟수와 if조건으로 비교합니다.
* 9. 만약 더 많이 등장한 문자를 찾으면, 최대 등장 횟수와 해당 문자를 갱신합니다.
* 10. 만약 최대값이 같은 다른 문자가 존재한다면, maxOccuranceChar를 '?'로 설정하여 중복 됨을 표현합니다.
*
* 11. maxOccuranceChar를 반환하여 가장 많이 등장한 문자 혹은 동일한 최대값인 `?`를 출력합니다.
*
*/
public static char solution(String word){
// 설명 2, 3
char[] chars = word.toLowerCase().toCharArray(); // 문자를 모두 소문자로 변경 후, char[]에 할당
HashMap<Character, Integer> charMap = new HashMap<>(); // 각 캐릭터의 key, value를 처리 할 변수 선언
// 설명 4, 5
for (char chr : chars) {
int count = charMap.getOrDefault(chr, 0);
charMap.put(chr, count + 1);
}
// 설명 6번
int maxCount = 0;
char maxOccuranceChar = '?';
// 설명 7 ~ 10
for(Map.Entry<Character, Integer> entry: charMap.entrySet()){
int count = entry.getValue();
if(count > maxCount){
maxCount = count;
maxOccuranceChar = entry.getKey();
}else if(count == maxCount){
maxOccuranceChar = '?';
}
}
return maxOccuranceChar == '?' ? maxOccuranceChar : Character.toUpperCase(maxOccuranceChar);
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String word = scanner.next();
System.out.println(solution(word));
}
}
---
상수
- 난이도 : 브론즈
- 번호 : 백준 2908번
- 분류 : 문자열
- 링크 : https://www.acmicpc.net/problem/2908
풀이
- 결과 : 성공
코드
package 상수;
import java.util.Arrays;
import java.util.InputMismatchException;
import java.util.Scanner;
public class 상수 {
/**
*
* @param String[] rawList : 문자열이 담긴 배열
* @return int answer : 정수 반환 값
*
* 문제 설명 :
* - 케이스 1: 1개의 Digt으로 입력된 문자열을 reverse하여 정수로 반환함.
* - 케이스 2: 2개의 Digit으로 되어 있으며 digit은 공백으로 구분되어 있으며 각각을
* reverse로 뒤짚어 정수로 변환한 이후 대소 비교를 하며, 큰 값을 반환
*/
public static int solution(String[] rawList){
int answer = 0;
// 배열의 크기가 1개인 경우
if(rawList.length == 1){
StringBuffer sb = new StringBuffer(rawList[0]);
String reversedStr = sb.reverse().toString();
answer = Integer.parseInt(reversedStr);
// 배열의 크기가 2개인 경우
}else{
for(String str: rawList){
StringBuffer sb = new StringBuffer(str);
String tmpDigit = sb.reverse().toString();
int tmpNum = Integer.parseInt(tmpDigit);
if(tmpNum > answer) answer = tmpNum;
}
}
return answer;
}
public static void main(String[] args) throws Exception {
Scanner scanner = null; // Declare scanner outside try block
try {
scanner = new Scanner(System.in);
String raw = scanner.nextLine();
String[] rawList = raw.split(" ");
System.out.println(solution(rawList));
} catch (InputMismatchException e) {
System.out.println("=========요류가 발생했습니다==========");
System.out.println(e);
} finally {
if (scanner != null) {
scanner.close();
}
}
}
}
---
할리갈리
- 난이도 : 브론즈
- 번호 : 백준 21760번
- 분류 : 문자열, 해시 맵(딕셔너리)
- 링크 : https://www.acmicpc.net/problem/1152
풀이
- 결과 : 성공
- 코드
package 할리갈리;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
public static Map<String, Integer> fruitFactory(){
/**
* 문제 설명 : 4종 과일의 총 합이 5개일 경우 YES 그렇지 않으면 NO
*
* 어려운 점 : 문제 설명을 이해하지 못함.
* - 원인 : 할리 갈리 게임 룰을 설명이 너무 장황함.
* - 결과 : 이해
* - 이해 방법 :
* - 불필요한 내용은 필터링함
* - 공책에 키워드만 정리하여 파악
* - `입력`, `출력`, `제한`, `예제입력`에 대해 중점적으로 파악함.
*
* 코드 해결법 :
* - 과일 이름은 항상 고정적이다라는 사실
* - 그 고정된 문자열 키에 따라 값이 바뀐다는 사실 => Key, Value 구조로 풀어야 하므로 HashMap자료구조 선택
* - fruits라는 HashMap타입의 변수를 첫 for loop 전에 객체를 생성하여줌.
* - scanner로 입력 받는 `과일 이름`과 `개수`를 바로 아래 코드로 연산하여 과일 개수를 증가시킴
* - fruits.put(fruitName, fruits.get(fruitName) + fruitNumber)`
* - scanner를 통해 입력이 종료 된 이후(과일 개수 연산 종료), 마지막 for loop에서는 fruits객체를
* 순회하면서 값이 `5`인 것을 찾아. `YES`, `NO`로 answer변수에 할당 하여 반환함
*/
// 접근1 : HASHMAP으로 풀기
Map<String, Integer> fruits = new HashMap<String, Integer>();
fruits.put("BANANA", 0);
fruits.put("PLUM", 0);
fruits.put("LIME", 0);
fruits.put("STRAWBERRY", 0);
return fruits;
}
public static void main(String[] args) {
String answer = "NO";
Scanner scanner = new Scanner(System.in);
int scNum = scanner.nextInt();
scanner.nextLine(); // 개행 문자 처리 / ** 중요 **
// 4종 과일의 총 합이 5개일 경우 YES 그렇지 않으면 NO
// 접근1 : HASHMAP으로 풀기
Map<String, Integer> fruits = fruitFactory();
for (int i = 1; i <= scNum; i++) {
String strRaw = scanner.nextLine();
String []strList = strRaw.split(" ");
String fruitName = strList[0];
int fruitNum = Integer.parseInt(strList[1]);
fruits.put(fruitName, fruits.get(fruitName)+fruitNum);
}
for(Map.Entry<String, Integer> entry : fruits.entrySet()){
if(entry.getValue() == 5 ) answer = "YES";
}
System.out.println(answer);
scanner.close();
}
}
---
단어의 개수
- 난이도 : 브론즈
- 번호 : 백준 1152번
- 분류 : 문자열
- 링크 : https://www.acmicpc.net/problem/1152
풀이
- 결과 : 성공
- 과정 :
- 1차 시도 : 스캐너 클래스를 임포트하여 처리 하지 않음
- 2차 시도 : 스캐너를 넣고 테스트 케이스를 콘솔에 입력하고 로컬에서 정상 확인, But 백준 FAIL. 원인 식별 불가
- 3차 시도 : 문자열 입력 시 앞뒤로 공백에 추가 될 수 있다는 말에 스캐너로 받은 객체를 문자로 변형후 바로 trim처리 했지만 fail
- 4차 시도 : split().length() 메서드로 한줄 처리한 코드를 for문과 count 변수를 정의하여 처리 후 성공
- 코드
import java.util.Scanner;
public class Main {
/**
* 시간 복잡도 : O(n)
* - 이유 : 입력 문자열의 길이에 선형적으로 비례하여 실행 시간이 증가하기 때문입니다.
*
* 공간 복잡도 : O(1)
* - 이유 : 입력 문자열을 단어로 분할하여 루프를 실행하므로 추가 메모리가 필요하지 않습니다.
* 따라서 공간 복잡도는 입력에 관계없이 상수 크기의 메모리를 사용합니다.
*
* @param String strList : 스캐너를 통해 입력 받는 문자열
* @return int count : 정수 반환 값
*
*/
public static int solution(String strList) {
int count = 0;
for (String str : strList.split(" ")) {
if (!str.isEmpty()) count++;
}
return count;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine().trim();
System.out.println(solution(s));
scanner.close();
}
}
---
'스케쥴 > 스터디' 카테고리의 다른 글
[항해99 취업리부트 TIL] 2주차 4일 (0) | 2024.06.01 |
---|---|
[항해99 취업리부트 TIL] 2주차 3일 (0) | 2024.05.31 |
[항해99 취업 리부트 TIL] 2주차 1일 (0) | 2024.05.29 |
[항해99 취업 리부트 TIL] 1주차 6일 (0) | 2024.05.28 |
[항해99 취업리부트 TIL] 1주차 5일 (0) | 2024.05.27 |