https://www.acmicpc.net/step/7
개별문제 리뷰전에 코드모음부터 올리겠습니다.
package 기초문법;
import java.util.Scanner;
public class _08string {
public static void main(String[] args) { // main이라는 클래스가 예약어임 Main 아님
ex11654();
}
// char 입력받기
public static void ex11654() {
Scanner sc = new Scanner(System.in);
int n = sc.next().charAt(0); //a=97 , A=65
System.out.println(n);
sc.close();
}
// char -> int 변환후 연산
public static void ex11720() {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String str = sc.next();
int res=0;
for(int i=0; i < n; i++) {
// char -> int 방법 2가지
// res += Character.getNumericValue(str.charAt(i));
res += str.charAt(i) - '0';
}
System.out.println(res);
sc.close();
}
public static void ex10809() {
Scanner sc = new Scanner(System.in);
String str = sc.next();
int[] alpha = new int[26];
int tmp;
// -1로 초기화
for(int i=0; i<26;i++) {
alpha[i]=-1;
}
for(int i=0; i<str.length(); i++) {
tmp = str.charAt(i) - 97;
if(alpha[tmp]==-1) // -1일떄만 수정
alpha[tmp] = i;
}
for(int i=0;i<alpha.length;i++)
System.out.print(alpha[i]+" ");
sc.close();
}
public static void ex2575() {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int a;
String str,res;
for(int i=0;i<n;i++) {
a= sc.nextInt();
str = sc.next();
res="";
for(int j=0;j<str.length();j++) {
for(int k=0; k<a;k++) {
res+=str.charAt(j);
}
}
System.out.println(res);
}
sc.close();
}
// 조금 어려웠음, 해쉬맵쓰려고 하다가.. ㅠ
public static void ex1157() {
Scanner sc = new Scanner(System.in);
String str = sc.next().toUpperCase();
int [] cnt = new int[26];
int max=0;
char result='?';
for(int i=0;i<str.length();i++) {
cnt[str.charAt(i)-65]++;
if(max < cnt[str.charAt(i)-65]) {
max = cnt[str.charAt(i)-65];
result = str.charAt(i);
}
else if(max == cnt[str.charAt(i)-65])
result ='?';
}
System.out.println(result);
sc.close();
}
public static void ex1152() {
Scanner sc = new Scanner(System.in);
String input = sc.nextLine().trim();
sc.close();
if (input.isEmpty()) { // 0을 생각해야 한다. 예외처리는 필수다
System.out.println(0);
}
else {
String a[] = input.split(" ");
System.out.println(a.length);
}
}
public static void ex1152(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
a = reverse(a);
b = reverse(b);
System.out.println(a>b?a:b);
}
public static int reverse(int a) {
String out = "";
while(a>0) {
out+=a%10;
a/=10;
}
// String -> int 기억하기!
return Integer.parseInt(out);
}
}
-
String class 에 메소드 잘 알고 계셔애합니다.
자바는 임포트하지않아도 java.lang 패키지가 자동으로 포함되는데,
lang에 obkect 클래스에 메소드를 알아둘 필요가있다.
우리가 다룰 String은 java.lang.Object 에 속해있으며, 자동으로 임포트된다. 꼭 기억하자.
String class에 메소드를 잠깐 정리하자.
String a = "aaa"; // 초기화
String a += "bbb // a = aaabbb가 되는 것이 아니라 새롭게 생성한다.
// String 타입을 비교할때 == 연산자를 쓰지 않고 .equals()를 쓰는 이유가 그것이다.
.length() : 길이를 int형으로 반환
.isEmpty() : 변수가 비었는지아닌지 bool값 반환
.indexOf("문자,문자열") : 해당문자,문자열의 시작번호를 알려줌
.substring( 시작숫자, 마지막숫자 ): 문자열 슬라이싱
.replaceAll( " 정규표현식 ", "변경할 문자 ") : 찾아서 모두 변경
.toUpperCase()
.toLowerCase()
.trim() 앞뒤 공백제거 (유용하게 쓰임)
.charAt( 숫자 ) : 해당위치에 문자한개를 char로 반환
.valueOf( ) : toString()과 같지 않냐고 하겠지만, valueOf()는 nullPointer 오류가 없다. 모두 인자로 받을 수 있다.
.toCharArray() : STring에 문자하나씩 배열로 변경해줌
.split("나눌 문자") : 문자열을 파라미터 기준으로 찢어 배열로반환.
문자열에쓰이는 기본적이면서 꼭 사용하며 알아야하는 메소드입니다.
+
형변환
# CHAR -> INT
String str = "123";
res += Character.getNumericValue(str.charAt(i));
res += str.charAt(i) - '0';
# String -> int
int a;
String b="abc";
a = Integer.parseInt(b);
+
# 1152 단어의 개수
public static void ex1152() {
Scanner sc = new Scanner(System.in);
String input = sc.nextLine().trim();
sc.close();
if (input.isEmpty()) { // 0을 생각해야 한다. 예외처리는 필수다
System.out.println(0);
}
else {
String a[] = input.split(" ");
System.out.println(a.length);
}
}
꼭 예외사항을 생각하자.
0일떄를 잘 처리해주어야한다.
split은 위에서 언급한 중요 메소드중 하나이니 기억해야합니다.
# 2908 상수
거꾸로 뒤집어 주기 위해서는
int형으로 받아서 문자열에 붙이는 방식으로 이어 붙이면 편할것이다.
다시 비교연산을 위해서는 String to int 형변환이 필요하고,.
Integer.parseInt(다른형식-문자열)
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
a = reverse(a);
b = reverse(b);
System.out.println(a>b?a:b);
}
public static int reverse(int a) {
String out = "";
while(a>0) {
out+=a%10;
a/=10;
}
// String -> int 기억하기!
return Integer.parseInt(out);
}
요렇게 풀어주면 되겠다.
-----------------------------------------------------------------------------------------------------------------------------------
지급부터는 난이도 있는 문제들에 대해 리뷰하겠슴다
-----------------------------------------------------------------------------------------------------------------------------------
# 다이얼 5622
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
char arr[] = input.toCharArray();
int sum=0;
for(char i : arr)
{
sum += Dial(i) + 1;
}
System.out.println(sum);
}
public static int Dial(char input)
{
switch (input)
{
case 'A':case 'B':case 'C':
return 2;
case 'D':case 'E':case 'F':
return 3;
case 'G':case 'H':case 'I':
return 4;
case 'J':case 'K':case 'L':
return 5;
case 'M':case 'N':case 'O':
return 6;
case 'P':case 'Q':case 'R':case 'S':
return 7;
case 'T':case 'U':case 'V':
return 8;
case 'W':case 'X':case 'Y':case 'Z':
return 9;
default:
return -1;
}
}
}
switch case로 풀면 쉽다.
if else로 풀어줘도 문제없다.
하지만, 나의 첫번째 풀이.
package 기초문법;
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
int num = changeNumber(str);
int res=0;
// System.out.println(num);
while(num>0) {
res+=num%10+1;
num/=10;
}
System.out.println(res);
}
public static int changeNumber(String str) {
String out = "";
for(int i=0;i<str.length();i++) {
if(str.charAt(i)>=65 && str.charAt(i)<=67)
out+=2;
else if(str.charAt(i)>=68 && str.charAt(i)<=70)
out+=3;
else if(str.charAt(i)>=71 && str.charAt(i)<=73)
out+=4;
else if(str.charAt(i)>=74 && str.charAt(i)<=76)
out+=5;
else if(str.charAt(i)>=77 && str.charAt(i)<=79)
out+=6;
else if(str.charAt(i)>=80 && str.charAt(i)<=82)
out+=7;
else if(str.charAt(i)>=83 && str.charAt(i)<=85)
out+=8;
else if(str.charAt(i)>=86 && str.charAt(i)<=88)
out+=9;
}
return Integer.parseInt(out);
}
}
문제는 return Integer.parseInt(out); 과정에서
NumberFormatException.forInputString 에러가 발생했다.
입력값이 길때 나는걸로 보아, 오버플로문제가 아닌가 싶다.
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.next().toUpperCase();
int num=0;
for(int i=0;i<str.length();i++)
num += changeNumber(str.charAt(i))+1;
System.out.println(num);
}
public static int changeNumber(char i) {
if(i>=65 && i<=67)
return 2;
else if(i>=68 && i<=70)
return 3;
else if(i>=71 && i<=73)
return 4;
else if(i>=74 && i<=76)
return 5;
else if(i>=77 && i<=79)
return 6;
else if(i>=80 && i<=83)
return 7;
else if(i>=84 && i<=86)
return 8;
else if(i>=87 && i<=90)
return 9;
else
return -1;
}
}
요렇게 바꿔서 바로 해결!
# 2941 크로아티아 알파벳
고민해보시고 정답을 보시기 바랍니다.
초간단 심플 정답 코드
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String croAlpha = sc.next();
String[] word = {"c=","c-","dz=","d-","lj","nj","s=","z="};
for(int i=0;i<word.length;i++) {
if(croAlpha.contains(word[i])) {
croAlpha = croAlpha.replaceAll(word[i], "*");
}
}
System.out.println(croAlpha.length());
}
}
바꿔야하는 문자를 배열로 입력하고
포합되는지 contains를 통해 검사하고
replaceAll을 통해 *로 변환시켜
길이를 구하면, 알파벳의 개수를 쉽게 구할수있습니다.
저는 이런 방법을 모르고, 뱅뱅 몇시간 돌았네요ㅠㅠ 풀이는 지저분하여 생략.
if switch.... 이 문제는 머릿속에 꼭 저장!
# 1316 그룹단어 체커
그룹단어가 무엇인지 이해하셨나요?
단어안에서 이미 출현한 알파벳이 뒤에 다시출현한다면,
그룹단어가 아니며, 새로운알파벳만 계속적으로 출현하는 경우 그룹단어로 인정합니다.
설명이 뭐같아서 부연설명을 붙였습니다.
그럼 풀어봅시다.
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int res = n;
boolean[] flag = new boolean[26];
for(int i=0; i<n; i++) {
String str = sc.next();
Arrays.fill(flag, false);
flag[str.charAt(0)-97]=true;
for(int j=1;j<str.length();j++) {
if(str.charAt(j-1)!=str.charAt(j)) {
if(flag[str.charAt(j)-97]==false)
flag[str.charAt(j)-97]=true;
else {
res--;
break;
}
}
}
}
System.out.println(res);
}
}
어려웠습니다. 다른분의 풀이를 참고했는데요,
알파벳 중복을 검사하기위한 flag 배열을 선언해주고,
단어검사를 시작할때마다 arrays.fill을 이용하여 false로 초기화해주었습니다.
이미나왔던 알파벳이 다시나오는 경우 for문을 바로 종료하고 값을 차감했는데요,
메모리와 런타임측면에서 좋은 코딩이지만
나중에 다른방식으로 더 풀어보고 싶은 문제입니다.
오늘은 새벽이 깊어 그만 자려합니다.
'Algorithm > 백준 단계별 문제' 카테고리의 다른 글
[백준] 12. 정렬 - Java 코드 (0) | 2022.02.22 |
---|---|
[백준] 11. Brute Force - Java 코드 (0) | 2022.02.17 |
[백준] 6. Funtion 함수 - Java 코드 (0) | 2020.01.27 |
[백준] 5. Array 배열 - Java 코드 (0) | 2020.01.27 |
[백준] 4. while문 - Java 코드 (0) | 2020.01.27 |