250x250
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 |
Tags
- 백준#BOJ#2615#오목
- 백준#BOJ#8012#한동이는영업사원
- 백준#BOJ#14501#퇴사#브루트포스
- 백준#boj#12755
- 백준#BOJ#1939#중량제한
- 백준#boj#16932#모양만들기
- 백준#BOJ#12865#평범한배낭
Archives
- Today
- Total
순간을 성실히, 화려함보단 꾸준함을
[ boj : 21608 ] 상어 초등학교 본문
https://www.acmicpc.net/problem/21608
해설 : 문제만 읽어도 누가봐도 삼성 빡구현 문제죠??ㅎㅎㅎ
보면 조건에 맞게 전부 if 문 덕지덕지 발라야되나??하는 생각이 들수 있는데 이런 문제는 깔끔하게 연산자로 비교해주면 됩니다.
c++ 이라면 연산자 오버로딩을, java 라면 Comparable 인터페이스 또는 Comparator 인터페이스를 사용해서 적절하게 처리를 해주면 됩니다. 가장 최우선인 자리에 배치를 해야되니 priority_queue 를 사용해서 top 에 있는 원소만 뽑으면 되겠죠?
다만 구현부분에서 살짝 뇌정지가 올법한데 주의할 점은 학생을 채우면서 점수를 계산하는 것이 아닌 학생을 자리에 전부 앉힌 이후에 점수를 계산해야 된다는 점입니다.
그것만 조심해서 잘 구현해주면 문제없이 답을 도출 하실 수 있으실 겁니다.
//package com.example.bojtemplate;
/*JAVA IO Template Reference : 류호석*/
import java.io.*;
import java.util.*;
import java.util.stream.Collector;
import java.util.stream.Collectors;
public class Main {
private static FastIO scan = new FastIO();
public static void main(String[] args) throws IOException{
//int t;
//t = scan.nextInt();
//while(t-->0){
solve();
//}
}
public static void solve() throws IOException{
int n;
int []pos = new int[4];
int []dx={-1,1,0,0};
int []dy={0,0,-1,1};
int [][]board = new int[410][410];
Map<Integer,List<Integer>> mp = new HashMap<>();
n = scan.nextInt();
PriorityQueue<Info> pq = new PriorityQueue<>();
for(int i=0;i<n*n;i++){
int x = scan.nextInt();
List<Integer> list = new ArrayList<>();
for(int j=0;j<4;j++){
pos[j] = scan.nextInt();
list.add(pos[j]);
}
mp.put(x,list);
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
if(board[j][k]!=0)continue;
int like=0,empty=0;
for(int p=0;p<4;p++){
int tx = j+dx[p];
int ty = k+dy[p];
int cnt=0;
if(tx<=0 || tx>n || ty<=0 || ty>n)continue;
for(int q=0;q<4;q++){
if(board[tx][ty]==pos[q]){
cnt++;
break;
}
}
if(cnt>0)like++;
else if(board[tx][ty]==0 && cnt<=0)empty++;
}
pq.add(new Info(like,empty,j,k));
}
}
Info cur = pq.poll();
board[cur.x][cur.y]=x;
pq.clear();
}
int ans=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
int cnt=0;
for(int k=0;k<4;k++){
int tx = i + dx[k];
int ty = j + dy[k];
if(tx<=0 || tx>n || ty<=0 || ty>n)continue;
for(int u : mp.get(board[i][j]))
if(u==board[tx][ty])
cnt++;
}
if(cnt==1)ans+=1;
else if(cnt==2) ans +=10;
else if(cnt==3)ans+=100;
else if(cnt==4)ans+=1000;
}
}
System.out.println(ans);
}
}
class Info implements Comparable<Info>{
int cnt,box;
int x,y;
public Info(int cnt, int box, int x, int y) {
this.cnt = cnt;
this.box = box;
this.x = x;
this.y = y;
}
@Override
public int compareTo(Info o) {
if(cnt==o.cnt){
if(box==o.box){
if(x==o.x)
return y>o.y?1:-1;
return x>o.x?1:-1;
}
return box<o.box?1:-1;
}
return cnt<o.cnt?1:-1;
}
}
class FastIO{
BufferedReader br;
BufferedWriter bw;
StringTokenizer st;
public FastIO(){
br = new BufferedReader(new InputStreamReader(System.in));
bw = new BufferedWriter(new OutputStreamWriter(System.out));
}
void write(String str) throws IOException{
bw.write(str);
}
void flush() throws IOException{
bw.flush();
}
int nextInt(){
return Integer.parseInt(next());
}
double nextDouble(){
return Double.parseDouble(next());
}
Long nextLong(){
return Long.parseLong(next());
}
String nextLine(){
String str="";
try{
str = br.readLine();
}catch (IOException e){
e.printStackTrace();
}
return str;
}
String next() {
while (st == null || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
return st.nextToken();
}
}
'알고리즘,SQL > 백준,BOJ' 카테고리의 다른 글
[ boj : 2799 ] 블라인드 (0) | 2022.01.31 |
---|---|
[ boj : 16507 ] 어두운 건 무서워 (0) | 2022.01.29 |
[ boj : 2343 ] 기타 레슨 (0) | 2022.01.28 |
[ boj : 22868 ] 산책(small) (0) | 2022.01.26 |
[ boj : 22942 ] 데이터 체커 (0) | 2022.01.22 |